Я пытаюсь написать эффект шейдера Фонга для 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;
}