2013-07-25 16 views
5

Ich habe folgendes Fragment-Shader:GLSL ES Präzision Fehler und überläuft

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

Ich weiß, das Shader nicht viel Sinn machen, aber es sollte noch richtig laufen und ich versuche, ein Problem damit zu reproduzieren. Wenn ich diesen Shader mit dem Xcode OpenGL-ES-Analysator analysieren zeigt es einen Fehler:

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

und es zeigt nicht nur diesen Fehler, auch die Rendering-Ausgabe gebrochen zu überläuft tun. Es ist also nicht nur ein falsches positives Ergebnis vom Analysator, das tatsächlich überläuft.

Kann mir jemand erklären, warum Dis einen Überlauf erzeugt, obwohl ich überall Highp gewählt habe?

Antwort

10

Sie haben nicht wirklich wählen Sie Highp überall; vom GLSL ES spec Kapitel 8 (Integrierte Funktionen):

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.

und von 4.5.3 (Standard Precision-Qualifikation):

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

was bedeutet, dass in Ihrem Code texture2D (uColorTexture, vTexCoord) ein lowp zurückkehren, Sie fügen zwei von ihnen hinzu, was möglicherweise zu einem Wert von 2,0 führt.

Von 4.5.2 (Precision-Qualifikation):

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

Die Klammern in (-2,2) zeigen einen offenen Bereich, dh es Werte beinhaltet bis zu (aber nicht einschließlich) 2.

Also ich denke, das Tatsache, dass Sie zwei lowp zusammen hinzufügen bedeutet, dass Sie überlaufen sind. Versuchen Sie, diese Zeile zu ändern:

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