2012-08-28 42 views
3

我正在嘗試爲RenderMonkey中的Dx9編寫phong着色器效果。HLSL無效ps_2_0輸入語義POSITION0

我在像素着色器

*「無效ps_2_0輸入語義‘POSITION0’」 *

得到一個編譯錯誤,我不知道如何解決它,雖然我知道這與VS_OUTPUT中的POSITION0語義有關。

我試圖改變VS_OUTPUT的POS語義來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; 
} 

回答

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。

+1

以下是D3D9中[Pixel Shader語義的官方MS文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v = vs.85).aspx#PS) (和10)顯示POSITION對像素着色器無效。 – cod3monk3y

0

作爲用戶,不允許在PixelShaderFunction中使用VertexShaderOutputPOSITION0的值。該屬性似乎在Vertex和Pixel Shader之間的某個點被切斷。

相反,你需要聲明其他屬性在VertexshaderOutput,例如,

float4 newPosition : TEXCOORD1; 
爲其分配相同的值 POSITION0

。這個新的屬性,你可以使用ist在PixelShaderfunction