网格的顶点结构与顶点着色器的顶点结构

时间:2012-07-03 10:01:20

标签: directx hlsl vertex-shader

[使用HLSL,* .fx文件和DirectX9]

我是使用着色器的新手,并且有一个方案正在运行,但不明白为什么。我很困惑网格如何有一个版本的顶点去除,而着色器可以定义另一个版本。

我使用ID3DXMesh创建了一个D3DXCreateSphere(...)球体,其中设置了D3DFVF_XYZ | D3DFVF_NORMAL。我叫ID3DXMesh::DrawSubset(0)来渲染;在BeginPass / EndPass调用中。

然后我有一个定义了结构的顶点着色器:

struct Vertex {
    float4 position:POSITION;
    float2 textureCoords:TEXCOORD0;
    float3 lightDir:TEXCOORD1;
    float3 normal:TEXCOORD2;
};

和着色器本身:

Vertex vertexShader( Vertex original, float3 _normal:NORMAL ) {
    Vertex result = (Vertex)0;

    float4x4 worldViewMatrix = mul( worldMatrix, viewMatrix );
    float4x4 worldViewProjectionMatrix = mul( worldViewMatrix, projectionMatrix );

    result.position = mul( original.position, worldViewProjectionMatrix );
    result.normal = -normalize( mul(_normal, worldMatrix) ); 

    result.textureCoords = original.textureCoords;
    result.lightDir = normalize(presetLightDir);

    return result;
}

虽然我在设置之前认识到lightDir和textureCoords也可能为null,但DirectX实际上在Vertex original参数中提供了哪些数据?

只是位置?我注意到float3 _normal:NORMAL作为单独的参数提供,但是在着色器的开头也是original内的值?

1 个答案:

答案 0 :(得分:1)

我期望设置的数据是:

  • result.position

  • _normal

并且没有设置original.textureCoords,result.textureCoords很可能是垃圾。

这样做的方式是通过“类型名称:语义”,所以在你的情况下 “float4 position:POSITION;”

通常,要发送到顶点着色器的数据只是在行位置> texturecoords> lightDir>等 您发送的数据应保留此顺序。

但是通过使用语义,您可以更改顺序。因此,您发送的数据将填充float3 POSITION和float3 NORMAL。 (请注意,您正在请求一个float4,它是XYZW,其中W = 1.0f)

Vertex结构中也存在“正常”这一事实并不重要,因为它被标记为TEXTURECOORD2。

我希望这有帮助,虽然我可能不太清楚。