2013-07-25 14 views
5

을 넘쳐 나는 다음과 같은 단편 셰이더 있습니다GLSL ES 정밀 오류 및

precision highp float; 
varying highp vec2 vTexCoord; 
uniform sampler2D uColorTexture; 
void main() { 
    highp vec4 tmp; 
    tmp = ((texture2D (uColorTexture, vTexCoord) + texture2D (uColorTexture, vTexCoord))/2.0); 
    gl_FragColor = tmp; 
} 

나는이 쉐이더 훨씬 이해가되지 않습니다하지만 여전히 올바른 실행해야합니다 알고 내가 가진 문제를 재현하려고합니다. 내가 엑스 코드는 OpenGL-ES 분석기이 쉐이더를 분석 할 때 오류 보여줍니다

Overflow in implicit conversion, minimum range for lowp float is (-2,2)

을하고 또한 렌더링 출력이 오버 플로우를 어떻게 고장이 오류를 보여줍니다 아닙니다. 따라서 실제로 오버플로되는 것은 분석기에서 가양 성이 아닙니다.

내가 highp를 선택했는데 왜 dis가 오버플로를 생성하는지 설명 할 수 있습니까?

답변

10

실제로는 어디서나 highp를 선택하십시오.

Precision qualifiers for parameters and return values are not shown. For the texture functions, the precision of the return type matches the precision of the sampler type.

및 4.5.3에서 (기본 정밀 예선) : 다음 GLSL ES spec 8 장 (내장 기능)에서

The fragment language has the following predeclared globally scoped default precision statements: ... precision lowp sampler2D; ...

코드에 texture2D (uColorTexture, vTexCoord)lowp를 반환합니다 즉, 당신 그 중 두 개를 추가하여 잠재적으로 2.0의 값을 얻습니다.

4.5.2 (정밀 예선)에서 :

The required minimum ranges and precisions for precision qualifiers are: ... lowp (−2,2) ...

(-2,2)의 괄호는 최대 값 (그러나 포함하지 않음) 2.

그래서 나는 생각을 포함 즉, 개방 범위를 나타냅니다 두 개의 lowp을 함께 추가한다는 사실은 당신이 넘칠다는 것을 의미합니다. 해당 행을 다음으로 변경해보십시오.

tmp = texture2D(uColorTexture, vTexCoord)/2.0 + texture2D(uColorTexture, vTexCoord)/2.0;