HLSL неверный ps_2_0 входной семантический POSITION0
Я пытаюсь написать эффект шейдера Phong для Dx9 в RenderMonkey.
Я получаю ошибку компиляции в пиксельном шейдере
*"Недопустимая семантика ввода ps_2_0 'POSITION0'"*
и я не уверен, как это исправить, хотя я знаю, что это должно быть как-то связано с семантикой POSITION0 в VS_OUTPUT.
Я попытался изменить Pos-семантику VS_OUTPUT на TEXCOORD0, но затем система сообщает, что
Вершинный шейдер должен минимально записать все четыре компонента ПОЗИЦИИ
Шейдеры поставляются ниже. Какие-либо предложения?
Вот мой вершинный шейдер:
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;
}
2 ответа
Хорошо, я нашел решение для тех, кто заинтересован.
В Vertex Shader должны быть определены следующие структуры:
struct VS_INPUT
{
float4 Pos : POSITION0;
float3 Normal : NORMAL0;
};
struct VS_OUTPUT
{
float4 Pos : POSITION0;
float4 PosOut : TEXCOORD0;
float3 Normal : TEXCOORD1;
};
Структура VS_OUTPUT должна быть другой в пиксельном шейдере:
struct VS_OUTPUT
{
float4 PosOut : TEXCOORD0;
float3 Normal : TEXCOORD1;
};
Моя проблема проистекает из того факта, что вы не можете использовать семантику POSITION в качестве входных данных для пиксельного шейдера. По крайней мере, для ps_2_0.
Как пользователь, нельзя использовать значение POSITION0
из VertexShaderOutput
в PixelShaderFunction
, Этот атрибут, кажется, обрезан в некоторой точке между Vertex и Pixel Shader.
Вместо этого вам нужно объявить другой атрибут в VertexshaderOutput
например,
float4 newPosition : TEXCOORD1;
которым вы назначаете то же значение, что и POSITION0
, Этот новый атрибут, вы можете использовать ist в PixelShaderfunction
,