2015-01-13 8 views
2

각 조각의 높이를 기준으로 텍스처 사이의 부드러운 전환을 포함하는 여러 텍스처가 포함 된 지형을 렌더링하고 있습니다. 가 여기 내 조각 쉐이더입니다 :mix()와 함께 사용하면 Opengl 텍스처가 깜빡입니다.

#version 430 

uniform sampler2D tex[3]; 

uniform float renderHeight; 

in vec3 fsVertex; 
in vec2 fsTexCoords; 

out vec4 color; 

void main() 
{ 
    float height = fsVertex.y/renderHeight; 

    const float range1 = 0.2; 
    const float range2 = 0.35; 
    const float range3 = 0.7; 
    const float range4 = 0.85; 

    if(height < range1) 
     color = texture(tex[0], fsTexCoords); 
    else if(height < range2) //smooth transition 
     color = mix(texture(tex[0], fsTexCoords), texture(tex[1], fsTexCoords), (height - range1)/(range2 - range1)); 
    else if(height < range3) 
     color = texture(tex[1], fsTexCoords); 
    else if(height < range4) //smooth transition 
     color = mix(texture(tex[1], fsTexCoords), texture(tex[2], fsTexCoords), (height - range3)/(range4 - range3)); 
    else 
     color = texture(tex[2], fsTexCoords); 
} 

'높이'항상 범위 [0,1]에있을 것입니다.

다음은 이상한 깜박임입니다. 내가 볼 수있는 것에서는 mix()을 사용할 때 '높이'가 rangeN 변수 중 하나와 같을 때 발생합니다.

flickering

Contours highlighted

어떤이의 원인이 될 수있다? 나는 또한 일부 계산에서 '편향 (bias)'변수를 더하거나 뺀 것으로 놀았지만 아무런 운이 없었습니다.


+0

나는 두 가지 유물이 균일 한 높이에서 일어난다는 것을 확신합니다. – Pilpel

+0

그래, 네 말이 맞아. 나는 제대로 보려고 이미지 에디터에서 그 점들을 직접 연결해야만했다. 육안으로 볼 때 광학 환상이었다. 높이를 더 선명하게 만드는 이미지를 추가했습니다. –

+0

고맙습니다. 이 원인이 무엇인지 상상할 수 있습니까? 나는 아직도 그것을 이해할 수 없다 ... – Pilpel

답변

1

문제는 non-uniform flow control입니다. 기본적으로 if 내부에서 texture()를 호출 할 수 없습니다.

두 솔루션 :.

  • 텍스처에 대한 모든 호출을() 먼저 믹스와 함께 결과()
  • 이 dFdx & 공동으로 텍스처 좌표 (의 일부 파생 상품을 계산을 혼합,이 만들 위의 링크의 예) texture() 대신에 textureGrad()를 사용하십시오.

매우 간단한 경우, 첫 번째 해결책은 약간 더 빠를 수 있습니다. 두 번째 방법은 많은 텍스처 (노멀 맵 등)를 원한다면 이동하는 방법입니다.하지만 내 말을 취하지 마십시오.