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)将法线传递给像素着色器。
我注意到 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)将法线传递给像素着色器。