2013-07-25 10 views
5

Ho il seguente frammento di shader:errori di precisione GLSL ES e trabocca

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; 
} 

So che questo shader non ha molto senso, ma dovrebbe ancora funzionare correttamente e cerco di riprodurre un problema con esso. Quando analizzo questo shader con l'analizzatore Xcode OpenGL-ES mostra un errore:

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

e non solo mostra questo errore, anche l'uscita di rendering è rotto fare per overflow. Quindi non è solo un falso positivo dall'analizzatore che trabocca effettivamente.

Qualcuno può spiegarmi perché dis produce un overflow anche se ho scelto highp ovunque?

risposta

10

Non si è in realtà scegliere highp ovunque; dal GLSL ES spec capitolo 8 (Funzioni built-in):

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.

e da 4.5.3 (Default Precision Qualificazioni):

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

Il che significa che nel codice texture2D (uColorTexture, vTexCoord) restituirà un lowp, si ne stanno aggiungendo due, potenzialmente con un valore di 2.0.

Da 4.5.2 (Precision Qualificazioni):

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

Le parentesi in (-2,2) indicano un intervallo aperto, il che significa che comprende i valori fino a (ma non compreso) 2.

Quindi penso che la Il fatto che stai aggiungendo due lowp insieme significa che stai traboccando. Prova a cambiare riga su:

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