我正在尝试编译一个非常简单的效果着色器,目标是DirectX9和着色器模型2.我试图直接传入屏幕坐标为顶点位置,而不是乘以世界,视图和投影矩阵,所以我使用POSITIONT语义而不是VertexShaderInput结构中的POSTION0语义。但是当我尝试使用
编译着色器时fxc.exe /Od /Zi /T fx_2_0 /Fo simple.fxo simple.fx
我收到以下错误:"错误X4502:输入语义无效 - POSITIONT0"
由于某种原因,它似乎会自动在语义末尾添加0。这似乎是我的错误,因为POSITIONT在这里被明确描述为有效的输入语义: https://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx#PS
并且它是唯一一个不允许在语义末尾附加额外整数的人。
编辑:我刚刚发现,如果我将POSITIONT更改为POSITIONT1,它可以正常工作。这似乎与上面描述的文档相反。simple.fx的内容:
struct VertexShaderInput
{
float4 Position : POSITIONT;
float4 Color : COLOR0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float4 Color : COLOR0;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
output.Position = input.Position;
output.Color = input.Color;
return output;
}
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
return input.Color;
}
technique Ambient
{
pass Pass1
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
答案 0 :(得分:2)
对于传统的Direct3D9,有一个特殊的D3DDECLUSAGE_POSITIONT
,这意味着只需跳过顶点处理。因此,您只能在PIXEL SHADER输入中使用POSITIONT
- 即。它根本不能用在VERTEX SHADER中。
更改着色器以使用POSITION
或POSITION0
。