2013-07-25 29 views
5

taşıyor Aşağıdaki shader parçası vardır:GLSL ES hassas hataları ve

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

Bu gölgelendirici çok mantıklı değil ama yine de doğru koşmak gerektiğini biliyorum ve onunla bir sorunu yeniden oluşturmaya çalışın. Ben Xcode OpenGL-ES analizörü ile bu shaderı analiz ettiğimizde bir hata gösterir:

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

ve aynı zamanda render çıkış taşmaları için ne bozuldu bu hatayı gösterir sadece. Dolayısıyla, gerçekte taşan analizörden yanlış bir pozitif değil.

Neden dis disinda herhangi bir yer olmamasina ragmen diski neden bir neden oldugunu açiklayabilir miyim?

cevap

10

'u gerçekten yapmadınız;

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.

ve 4.5.3 den (Varsayılan Hassas Elemeleri): GLSL ES spec bölüm 8 (Dahili Fonksiyonlar) den

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

Kodunuzdaki texture2D (uColorTexture, vTexCoord) bir lowp döneceğini demek oluyor ki, sen bunlardan ikisini ekleyerek, potansiyel olarak 2.0 değeriyle sonuçlanıyor.

4.5.2 (Hassas Elemelerinden) Gönderen:

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

(-2,2) parantezler o kadar değerleri (ancak bunu içermeyen) 2.

Yani bence içerir, yani açık bir aralığı gösterir İki tane lowp 'yı ekliyor olmanız aslında taştığınız anlamına gelir. Şu satırı değiştirmeyi deneyin:

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