2017-01-17 3 views
4

각면마다 다른 질감의 입방체를 그려야합니다. 내 단편 쉐이더 내 버텍스 쉐이더를 사용하는 텍스처의 수를 포함 Textnum 매개 변수를 전달, 그 값에 따라 적절한 sampler2D을 선택하는 스위치 문을 사용하여이 코드를GLSL switch 문의 이상한 동작

#version 150 

in float Shade; 
in vec2 Textcoord; 
in uint Textnum; 

out vec4 outColor; 

uniform sampler2D tex0; 
uniform sampler2D tex1; 
uniform sampler2D tex2; 
uniform sampler2D tex3; 
uniform sampler2D tex4; 
uniform sampler2D tex5; 

void main() 
{ 
    vec4 textColor; 
    switch(Textnum) 
    { 
     case 0u: textColor = texture(tex0, Textcoord); break; 
     case 1u: textColor = texture(tex1, Textcoord); break; 
     case 2u: textColor = texture(tex2, Textcoord); break; 
     case 3u: textColor = texture(tex3, Textcoord); break; 
     case 4u: textColor = texture(tex4, Textcoord); break; 
     case 5u: textColor = texture(tex5, Textcoord); break; 
    } 
    outColor = textColor * vec4(Shade, Shade, Shade, 1); 
} 

, 큐브는 아니다 전혀 렌더링되지 않습니다. 내가 할 때 텍스처가 제대로로드됩니다.

void main() 
{ 
    vec4 textColor; 
    textColor = texture(tex0, Textcoord); 
    outColor = textColor * vec4(Shade, Shade, Shade, 1); 
} 

각면마다 같은 질감의 입방체가 나타납니다. 나는 예상 된 결과를 얻을 때마다 모든 샘플러로 이것을 시도했다. 흥미로운 점은 내가 할 때입니다 :

switch 문 다음에 나오는 명령이 효과를 덮어 쓰더라도 큐브를 볼 수 없습니다. 내 코드에 무슨 문제가 있습니까?

편집 : 그래서 분명히이없는 말은, 아직 내가 할 경우 때문에 (위키 백과 문서의 이유로 정확해야 함) :

큐브가 여전히 전혀 렌더링되지 않는

void main() 
{ 
    vec4 textColor; 
    vec4 textColor0 = texture(tex0, Textcoord); 
    vec4 textColor1 = texture(tex1, Textcoord); 
    vec4 textColor2 = texture(tex2, Textcoord); 
    vec4 textColor3 = texture(tex3, Textcoord); 
    vec4 textColor4 = texture(tex4, Textcoord); 
    vec4 textColor5 = texture(tex5, Textcoord); 
    switch(Textnum) 
    { 
     case 0u: textColor = textColor0; break; 
     case 1u: textColor = textColor1; break; 
     case 2u: textColor = textColor2; break; 
     case 3u: textColor = textColor3; break; 
     case 4u: textColor = textColor4; break; 
     case 5u: textColor = textColor5; break; 
    } 
    outColor = textColor * vec4(Shade, Shade, Shade, 1); 
} 
. 이것은 잘 작동하지 않습니다

void main() 
{ 
    vec4 textColor[6]; 
    textColor[0] = texture(tex0, Textcoord); 
    textColor[1] = texture(tex1, Textcoord); 
    textColor[2] = texture(tex2, Textcoord); 
    textColor[3] = texture(tex3, Textcoord); 
    textColor[4] = texture(tex4, Textcoord); 
    textColor[5] = texture(tex5, Textcoord); 
    outColor = textColor[Textnum] * vec4(Shade, Shade, Shade, 1); 
} 

EDIT2가 : GLSL에서 http://pastebin.com/R2scC0ZZ

+0

마지막 코드에서 glsl 컴파일 오류가 표시되지 않았습니까? 출력물 더미에 숨어있을 수도 있습니다. – javaLover

+0

아니요, 컴파일 오류를 확인하고 프로그램에서 의심스러운 사항을보고하지 않았습니다. –

+0

나는 추측을 할 것이다. (저는 초보자입니다.) 스위치에 "default :"를 추가하십시오. – javaLover

답변

4

텍스처 조회가 균일 한 제어 흐름에 있어야 : 여기에 관심있는 사람들을위한 완벽한 예입니다. 귀하의 경우 흐름은 속성에 따라 다르기 때문에 균일하지 않습니다. 이 경우 자동 그라디언트가 계산되지 않고 그라디언트 (밉맵, 이방성 필터링)에 의존하는 모든 것이 작동하지 않습니다.

This link이 얼굴에 대한 자세한 설명을 제공합니다.

편집 : 이제 전체 코드를 보았으므로 왜 작동하지 않는지 명확히 알 수 있습니다. 쉐이더는 단순히 다음과 같은 오류 메시지와 함께 연결하지 않습니다

0(4) : error C5215: Integer varying TextNum must be flat 

이 메시지는 문제에 대해 정확히 알려줍니다 : 정수 varyings는 쉐이더 단계 사이에 보간 될 수 없으며, 따라서 그들이 평면 보간으로 정의되어야한다. 분명히 링커 오류를 확인하지 않았습니다. 프로그램이 연결되지 않았기 때문에 glUseProgram에 대한 모든 호출은 GL_INVALID_ENUM을 생성합니다. 프로그램이 유효하지 않아 아무 것도 그려지지 않았기 때문입니다. 와 속성 정의를 교체 :

flat out uint Textnum; 

flat in uint Textnum; 

하면 문제를 해결해야한다.

+1

감사합니다. 이것은 각면을 개별적으로 렌더링하지 않고 각면에 서로 다른 텍스처를 가진 큐브를 얻는 방법이 없다는 것을 의미합니까? –

+0

@Piotr Olszewski 그 링크는 당신이 원하는 것을 담고 있습니다. 것이 가능하다. "조건에 따라 추가 만하면됩니다"단락을 참조하십시오. 나에게도 새롭다. 너희 둘 모두. :) – javaLover

+2

@PiotrOlszewski : 항상 6 개의 레이어가있는 2D 배열 텍스처를 사용할 수 있으며 속성을 통해 레이어를 인덱싱 할 수 있습니다 (또 다른 텍스처 좌표 임). – datenwolf