3

RenderMonkey で Dx9 のフォン シェーダー効果を書こうとしています。

ピクセル シェーダーでコンパイル エラーが発生する

*"無効な ps_2_0 入力セマンティック 'POSITION0'"*

VS_OUTPUTのPOSITION0セマンティックと関係があることはわかっていますが、修正方法はわかりません。

VS_OUTPUT の Pos セマンティックを TEXCOORD0 に変更しようとしましたが、システムはそれを報告します

頂点シェーダーは、最小限、POSITION の 4 つのコンポーネントすべてを書き込む必要があります。

シェーダーは以下で提供されます。助言がありますか?

ここに私の頂点シェーダーがあります:

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;
}
4

2 に答える 2

5

さて、興味のある人のための解決策を見つけました。

頂点シェーダーには、次の構造体が定義されている必要があります。

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 については。

于 2012-08-29T11:09:00.357 に答える