2012-08-28 5 views
3

RenderMonkey에서 Dx9 용 폰 셰이더 효과를 쓰려고합니다.HLSL이 부정확 한 ps_2_0 입력 의미 POSITION0

있지만, 나는 픽셀 쉐이더

* "잘못된 ps_2_0을 입력 의미 'POSITION0'"*

에서 컴파일 오류를 받고 있어요 나는 그것을 해결하는 방법을 잘 모르겠어요 VS_OUTPUT에서 POSITION0 의미론과 관련이 있어야한다는 것을 알고 있습니다.

나는 TEXCOORD0에 의미 VS_OUTPUT의 순위를 변경했지만, 그 시스템은

버텍스 쉐이더는 최소한

쉐이더 아래 제공되는 위치의 네 가지 구성 요소를 작성해야합니다보고합니다. 어떤 제안?

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 Semantics에 대한 공식 MS 설명서] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85)asp## PS)는 다음과 같습니다 POSITION이 픽셀 쉐이더에 유효하지 않다는 것을 나타내는 (와 10). – cod3monk3y

0

사용자는 PixelShaderFunction에 의 POSITION0 값을 사용할 수 없습니다. 이 속성은 Vertex와 Pixel Shader 사이의 어떤 지점에서 잘린 것처럼 보입니다.

대신 당신은, 예를 들어 VertexshaderOutput 당신이 POSITION0와 같은 값을 할당

float4 newPosition : TEXCOORD1; 

을 다른 속성을 선언해야합니다. 이 새로운 속성은 PixelShaderfunction에서 ist를 사용할 수 있습니다.