D3DXCompileShader 无法编译带有 NORMAL 的着色器

D3DXCompileShader cannot compile shader with NORMAL in it

我注意到 Ogre 库中的 D3DXCompileShader 函数在 DirectX9 的情况下失败,原因如下:

error X4502: invalid vs_2_0 output semantic 'NORMAL'

我觉得很奇怪,因为 MSDN states 它应该从 DirectX 9 开始支持:

The following types of semantics are supported in both Direct3D 9 and Direct3D 10 and later

这是我的 hlsl 文件:

float4x4 worldViewProj;
float4 lightPosition;
float3 eyePosition;

struct VS_OUTPUT
{
   float4 pos: POSITION;
   float4 normal: NORMAL;
   float4 color: COLOR;
   float4 lightPosition: TEXCOORD0;
   float3 eyePosition: TEXCOORD1;
   float3 pos3d: TEXCOORD2;
};

VS_OUTPUT main(
    float4 pos: POSITION, 
    float4 normal: NORMAL,
    float4 color: COLOR
)
{
   VS_OUTPUT Out;
   Out.pos = mul(worldViewProj, pos);
   Out.pos3d = pos.xyz;
   Out.normal = normal;
   Out.color = color;

   Out.lightPosition = lightPosition;
   Out.eyePosition = eyePosition;

   return Out;
}

您提供的 link 清楚地表明 NORMAL 语义仅支持作为 VS 输入。 您可以尝试使用 TEXCOORD(例如 TEXCOORD3)将法线传递给像素着色器。