2014-02-06 5 views
0

iOS의 GLSL ES 2.0과 같은 여러 픽셀 쉐이더 사이에서 공유되는 버텍스 쉐이더가 있습니다. VS는 변환 된 위치, 법선 및 한 세트의 2D uv 좌표를 출력합니다. 여기의 빈약이다GLSL ES 픽셀 쉐이더는 사용되지 않는 텍스쳐가 전달 된 경우에만 작동합니다.

void main() { 
    vec4 xlt_outPos; 
    vec3 xlt_outNormal; 
    vec2 xlt_uv0; 
    xray_bone_vp(vec4(vertex), vec3(normal), vec2(uv), xlt_outPos, xlt_outNormal, xlt_uv0); 
    gl_Position = vec4(xlt_outPos); 
    xlv_TEXCOORD6 = vec3(xlt_outNormal); 
    xlv_TEXCOORD0 = vec2(xlt_uv0); 
} 

이것은 TEXCOORD0에 자외선을 출력하고, 정상적인 사용을 위해 TEXCOORD6 CG로 쉐이더에 기초한다.

내 문제는 자외선 좌표 걸릴 PS 정상 입력이 제대로 작동 될 때, 그러나 정상적인 을하는 사람들은 없습니다. 내가 PS 메서드 서명을 uv로 전달하도록 변경했지만 이것을 사용하지 않으면 작동합니다!

잘 정의 된 동작입니까? 그렇다면 셰이더에 불필요한 매개 변수를 전달하거나 VS의 여러 버전을 생성하지 않아도되는 방법이 있습니까?

+0

당신이 VS 출력 구조의 코드와 작업 및 깨진 쉐이더 모두에서 PS 입력 대응을 공유 할 수 없습니다 :

또한

는 Cg를 쉐이딩 언어에 대한 자세한 내용은이 기준에서 살펴? 일반적으로 이러한 구조는 동일해야합니다. – brigadir

+0

나는 그것을 가지고 있지만 어딘가에 도달 할 수는 없다. 그러나 나는 "일반적으로이 구조들은 반드시 같아야합니다"라고 생각합니다. 제가 찾고있는 대답은 ... 어떤 종류의 참고 자료와도 답을 쓸 수 있다면 담당자가 당신 것입니다 :) –

+0

좋습니다. 어쨌든, 여러분의 vertex-to-pixel-shader 구조체 선언을 살펴 보는 것이 유용 할 것입니다. – brigadir

답변

1

VS 출력 구조와 PS 입력이 다른 것으로 가정 할 수 있습니다.

// declare vertex-to-pixel data structure: 
struct v_Output { 
    float4 position : POSITION; 
    float2 texCoord0 : TEXCOORD0; 
    float2 texCoord1 : TEXCOORD1; 
}; 

v_Output vertex_shader(...) { 
    ... 
    return (v_Output)output_data; 
} 

void pixel_shader(float2 texCoord0 : TEXCOORD0, 
        float2 texCoord1 : TEXCOORD1, 
        out float4 color : COLOR { 
    color = ...; 
} 

그리고 몇 가지 규칙이 있습니다 : 올바른 코드는 다음과 같이해야한다

는 픽셀 쉐이더 분야에서 필요로 할 수
  • 그 정점 셰이더에 있어야 비 중단
  • TEXCOORD# 생성하지 않습니다는 주문 (`TEXCOORD0, TEXCOORD1 ...)

무엇보다도 TEXCOORD6TEXCOORD1으로 변경해야합니다. 어쨌든 코드 없이는 아무 것도 제안하기가 어렵습니다. 그리고 쉐이더를 설정할 때 정확한 컴파일 오류를 얻는 것이 좋습니다. http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter03.html