0

[使用 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 在我设置它们之前也可能为空,但 DirectX 实际上在该Vertex original参数中提供了哪些数据?

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

4

1 回答 1

1

我希望设置的数据是:

  • 结果.位置

  • _普通的

并且由于 original.textureCoords 未设置,因此 result.textureCoords 很可能是垃圾。

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

通常要发送到顶点着色器的数据只是在一行位置>纹理坐标>lightDir>等,并且您发送的数据应该保持这个顺序。

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

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

我希望这会有所帮助,尽管我可能不是很清楚。

于 2012-07-03T11:59:27.933 回答