[使用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
内的值?
答案 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。
我希望这有帮助,虽然我可能不太清楚。