顶点着色器中的正常计算?

时间:2013-04-06 14:29:23

标签: directx shader lighting terrain normals

我正在使用rastertek框架进行地形生成。我已经从顶点着色器渲染了地形,但我不知道如何计算着色器中的法线。在一个从地形生成法线的类中有一个函数调用,但这只有在cpu上生成地形时才有效。下面是我正在使用的顶点着色器的代码:

////////////////////////////////////////////////////////////////////////////////
// Filename: terrain.vs
////////////////////////////////////////////////////////////////////////////////
#include "terrain.fx"

/////////////
// GLOBALS //
/////////////

cbuffer MatrixBuffer
{
    matrix worldMatrix;
    matrix viewMatrix;
    matrix projectionMatrix;
};


//////////////
// TYPEDEFS //
//////////////
struct VertexInputType
{
    float4 position : POSITION;
    float3 normal : NORMAL;
};

struct PixelInputType
{
    float4 position : SV_POSITION;
    float3 normal : NORMAL;
};


////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
PixelInputType TerrainVertexShader(VertexInputType input)
{
    PixelInputType output;

    input.position.y = input.position.y + terrain(input.position.x,input.position.z);

    // Change the position vector to be 4 units for proper matrix calculations.
    input.position.w = 1.0f;

    // Calculate the position of the vertex against the world, view, and projection matrices.
    output.position = mul(input.position, worldMatrix);
    output.position = mul(output.position, viewMatrix);
    output.position = mul(output.position, projectionMatrix);

    // Calculate the normal vector against the world matrix only.
    output.normal = mul(input.normal, (float3x3)worldMatrix);

    // Normalize the normal vector.
    output.normal = normalize(output.normal);

    return output;
}

1 个答案:

答案 0 :(得分:4)

在着色器中生成法线的最大问题是您需要了解周围顶点。这是您可以使用几何着色器而不是使用顶点着色器来克服的。计算法线的一种简单方法是计算所有多边形的多边形法线(取两个边形成的矢量,并将它们与面法线交叉),然后将它们加起来并进行标准化。因此,如果您无法访问几何着色器,唯一真正的解决方案是使用CPU。即使这样,这也不是计算顶点法线的最佳方法。您可能仍然觉得使用更复杂的算法会更好,这会给您带来更多问题!所以,是的,CPU或几何着色器......基本上,这些都是你的选择。