3

我正在尝试在 RenderMonkey 中为 Dx9 编写一个 phong 着色器效果。

我在像素着色器中遇到编译错误

*"无效的 ps_2_0 输入语义 'POSITION0'"*

而且我不确定如何解决它,尽管我知道它必须与 VS_OUTPUT 中的 POSITION0 语义有关。

我尝试将 VS_OUTPUT 的 Pos 语义更改为 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;
}
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 回答
1

作为用户,不允许使用POSITION0. 这个属性似乎在 Vertex 和 Pixel Shader 之间的某个点被切断了。VertexShaderOutputPixelShaderFunction

相反,您需要在 中声明另一个属性VertexshaderOutput,例如,

float4 newPosition : TEXCOORD1;

您分配与 相同的值POSITION0。这个新属性,你可以在PixelShaderfunction.

于 2016-12-27T02:22:35.027 回答