2013-07-25 13 views
5

Mam następujący fragment shadera:GLSL ES błędy precyzyjne i przelewa

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

Znam ten shader nie ma większego sensu, ale powinna nadal działać poprawne i spróbuj odtworzyć problem z nim. Kiedy analizuje ten shader z analizatorem Xcode OpenGL-ES to pokazuje błąd:

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

i to nie tylko pokazuje ten błąd, również wyjście renderowania jest uszkodzony zrobić do przepełnienia. To nie jest tylko fałszywy alarm z analizatora, który faktycznie przepełnia.

Czy ktoś może mi wyjaśnić, dlaczego dis powoduje nadmiar, mimo że wybrałem highp wszędzie?

Odpowiedz

10

Nie udało się naprawdę wybrać highp wszędzie; z GLSL ES spec rozdziale 8 (funkcje wbudowane):

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.

oraz 4.5.3 (Domyślnie Precision kwalifikatorów):

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

Co oznacza, że ​​w kodzie texture2D (uColorTexture, vTexCoord) zwróci lowp, ty dodaje dwa z nich, potencjalnie dając wartość 2,0.

Od 4.5.2 (Precision Kwalifikujacych):

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

Nawiasy w (-2,2) oznaczać otwartą zasięg, co oznacza, że ​​zawiera wartości do (ale nie włącznie) 2.

więc myślę, że Fakt, że dodajesz dwa numery: lowp oznacza, że ​​jesteś przepełniony. Spróbuj zmienić tę linię na:

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