HLSL невалидна ps_2_0 входна семантика POSITION0

Опитвам се да напиша фонг шейдър ефект за Dx9 в RenderMonkey.

Получавам грешка при компилиране в пикселния шейдър

*"невалидна входна семантика на ps

    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;
}
0 'POSITION0'"*

и не съм сигурен как да го поправя, въпреки че знам, че трябва да е нещо общо със семантиката на 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;
}

person fishfood    schedule 28.08.2012    source източник


Отговори (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

struct VS_OUTPUT 
{
   float4 PosOut : TEXCOORD0;
   float3 Normal : TEXCOORD1;
};
0.

person fishfood    schedule 29.08.2012
comment
Ето официалната документация на MS за семантика на пикселния шейдър в D3D9 (и 10), който показва POSITION, не е валиден за пикселни шейдъри. - person cod3monk3y; 27.06.2013

Като потребител не е позволено да се използва стойността на POSITION0 от VertexShaderOutput в PixelShaderFunction. Този атрибут изглежда е отрязан в някакъв момент между Vertex и Pixel Shader.

Вместо това трябва да декларирате друг атрибут в VertexshaderOutput, напр.

float4 newPosition : TEXCOORD1;

на който присвоявате същата стойност като POSITION0. Този нов атрибут можете да използвате ist в PixelShaderfunction.

person AlgebraAutomata    schedule 27.12.2016