1

我正在使用 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;
}
4

1 回答 1

4

在着色器中生成法线的最大问题是您需要了解周围的顶点。这是你可以用几何着色器克服的,但不能用顶点着色器。计算法线的一种简单方法是计算碰到您正在查看的顶点的所有多边形的多边形法线(取由 2 条边形成的向量并将它们叉积为面法线),然后将它们相加并归一化。因此,如果您无法访问几何着色器,唯一真正的解决方案是使用 CPU。即使这样,这也不是计算顶点法线的最佳方法。您可能仍然会发现使用更复杂的算法会更好,这会给您带来更多问题!所以,是的,CPU 或几何着色器......基本上,这些都是你的选择。

于 2013-04-07T13:15:45.297 回答