[使用 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
着色器的开头吗?