Опитвам се да напиша фонг шейдър ефект за Dx9 в RenderMonkey.
Получавам грешка при компилиране в пикселния шейдър
*"невалидна входна семантика на ps
0 'POSITION0'"*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; }
и не съм сигурен как да го поправя, въпреки че знам, че трябва да е нещо общо със семантиката на POSITION0 във VS_OUTPUT.
Опитах се да променя семантиката на Pos на VS_OUTPUT на TEXCOORD0, но след това системата съобщава, че
върховият шейдър трябва да записва минимално всичките четири компонента на POSITION
Шейдърите са предоставени по-долу. Някакви предположения?
Ето моят вертекс шейдър:
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;
}