Directx HLSL无效ps_2_0输入语义位置0
我正在尝试在RenderMonkey中为Dx9编写phong着色器效果 像素着色器中出现编译错误 *“无效的ps_2_0输入语义'POSITION0'”* 我不确定如何修复它,尽管我知道这与VS_输出中的POSITION0语义有关 我尝试将VS_输出的Pos语义更改为TEXCOORD0,但系统报告了这一点 顶点着色器必须最少写入位置的所有四个组件 下面提供了着色器。有什么建议吗 这是我的顶点着色器:Directx HLSL无效ps_2_0输入语义位置0,directx,hlsl,directx-9,rendermonkey,Directx,Hlsl,Directx 9,Rendermonkey,我正在尝试在RenderMonkey中为Dx9编写phong着色器效果 像素着色器中出现编译错误 *“无效的ps_2_0输入语义'POSITION0'”* 我不确定如何修复它,尽管我知道这与VS_输出中的POSITION0语义有关 我尝试将VS_输出的Pos语义更改为TEXCOORD0,但系统报告了这一点 顶点着色器必须最少写入位置的所有四个组件 下面提供了着色器。有什么建议吗 这是我的顶点着色器: struct VS_INPUT { float4 Pos : POSITION0;
struct VS_INPUT
{
float4 Pos : POSITION0;
float3 Normal : NORMAL0;
};
struct VS_OUTPUT
{
float4 Pos : POSITION0;
float3 Normal : TEXCOORD0;
};
VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
Output.Pos = Input.Pos;
Output.Normal = Input.Normal;
return Output;
}
和我的像素着色器:
float4x4 matViewProjection;
// light source
float4 lightPos;
float4 Ambient;
float4 Diffuse;
float4 Specular;
// material reflection properties
float4 Ke;
float4 Ka;
float4 Kd;
float4 Ks;
float nSpecular;
// eye
float4 eyePosition;
struct VS_OUTPUT
{
float4 Pos : POSITION0;
float3 Normal : TEXCOORD0;
};
float4 ps_main( VS_OUTPUT vsOutput ) : COLOR0
{
vsOutput.Pos = mul( vsOutput.Pos, matViewProjection );
float3 ViewDirection = normalize( eyePosition.xyz - vsOutput.Pos.xyz );
float3 LightDirection = normalize( lightPos.xyz - vsOutput.Pos.xyz );
float3 N = normalize( vsOutput.Normal );
float3 R = reflect( -LightDirection, N );
float LdotN = max( 0.0, dot( LightDirection, N ) );
float VdotR = max( 0.0, dot( ViewDirection, R ) );
// find colour components
float4 a = Ka * Ambient;
float4 d = Kd * Diffuse * LdotN;
float4 s = Ks * Specular * pow( VdotR, nSpecular );
float4 FragColour = Ke + a + d + s;
return FragColour;
}
好的,我为那些感兴趣的人找到了一个解决方案 顶点着色器应定义以下结构:
struct VS_INPUT
{
float4 Pos : POSITION0;
float3 Normal : NORMAL0;
};
struct VS_OUTPUT
{
float4 Pos : POSITION0;
float4 PosOut : TEXCOORD0;
float3 Normal : TEXCOORD1;
};
像素着色器中的VS_输出结构应不同:
struct VS_OUTPUT
{
float4 PosOut : TEXCOORD0;
float3 Normal : TEXCOORD1;
};
我的问题源于这样一个事实,即不能将位置语义作为像素着色器的输入。至少对于ps_2_0。作为用户,不允许使用
PixelShaderFunction
中VertexShaderOutput
的位置0
的值。该属性似乎在顶点和像素着色器之间的某个点被截断
相反,您需要在VertexshaderOutput
中声明另一个属性,例如
float4 newPosition : TEXCOORD1;
您指定的值与位置0
相同。对于这个新属性,您可以在PixelShaderfunction
中使用ist,这是D3D9(和10)中的一个属性,它显示位置对像素着色器无效。