2017-05-24 6 views
0

float brightness에 2 개의 벡터가 도트로 생성됩니다. brightness은 대부분 양수 여야하지만 max(brightness, 0.0)을 사용해야합니다. 내 조명 시스템에 brightness을 사용하려고하면 아무 것도 표시되지 않습니다. 나는 이것을 if-statement로 디버깅하려했지만 항상 진실 또는 뭔가를 반환하는 것 같다. 따라서 if(brightness > 99999)if(brightness < 99999) 또는 if(brightness == 12345)은 모두 픽셀을 버립니다. GLSL 버전 430 코어를 사용하고 있습니다.GLSL 항상 true를 반환하는 경우

float brightness = dot(vector1, vector2); 
brightness = max(brightness, 0.0); 

if(brightness < -999) { 

    discard; 

} 

따라서이 예에서는 픽셀을 버립니다.

답변

0

아마도 vector1 또는 vector2 구성 요소에 NaN이있을 것입니다 (NaN => 숫자가 아니며 vector1 또는 vector2 계산 중에 0으로 나누기가 발생할 수 있습니다).

NaN이 감지 할 수있는 방법이를 참조하십시오 How to deal with NaN or inf in OpenGL ES 2.0 shaders

그래서 당신이 vector1 & vector2이 계산되는 방법을 볼 필요가 문제를 해결하기 위해. 이것은 NaN의 문제입니다 확인하기 위하여

는 vector1에 대한 상수 값을 사용/좋아 vector2 :

// force values so we are sure dot will be 1.0 
vector1 = vec3(1.0,0.0,0.0); 
vector2 = vec3(1.0,1.0,0.0); 

float brightness = dot(vector1, vector2); 
brightness = max(brightness, 0.0); 

// so this should never execute since dot is 1.0 
if(brightness < -999) { 
    discard; 
} 

폐기가 위의 코드를 실행하는 것이 완전히 불가능하다. 이 문제가 계속 발생한다고 생각되면 if 테스트 후의 코드가 fragColor.rgb를 검정으로 설정하거나 fragColor.a를 0으로 설정하여 블렌딩이 활성화 된 경우 픽셀을 표시하지 않게 할 수 있습니다.

+0

저는 이것이 NaN 일 수 있다고 생각했습니다. 실제로 이러한 벡터의 모든 변화를 추적하려고했습니다. 나는 이제 그것을 다시 보게 될 것이다. – Maineri

+0

실수를 발견했습니다. 당신이 옳았. vector2는 NaN입니다. 나는 실수로 벡터 2를 정점 쉐이더에서 vec4로 출력하고 그것을 조각 쉐이더에서 vec3으로 입력했습니다. 고맙습니다! – Maineri