2012-11-11 7 views
8

Ich mache einen Gaussian Blur Shader in GLSL. Da der Faltungskern symmetrisch ist, speichere ich die Hälfte davon. Ich schreibe:GLSL abs() gebrochen?

vec3 glow = vec3(0.0); 
for (int i = -WIDTH; i <= WIDTH; i++) { 
    uint j = abs(i); 
    glow += kernel[j] + texelFetch(u_glowTexture, coord + ivec2(i, 0), 0); 
} 

Seltsamerweise zeichnet dies die Unschärfe etwas links von dem, was es sein sollte. Aber dann ersetze ich diese dritte Zeile mit:

uint j = i * sign(i); 

Und jetzt funktioniert es, wie ich es erwarte. Habe ich abs() gebrochen? Habe ich wirklich einen Treiberfehler gefunden?

+0

Was ist Ihre 'GL_VERSION' und' GL_SHADING_LANGUAGE_VERSION'? – Matthias

+0

Funktioniert? Uint j = uint (abs (i))? – Matthias

+0

Ihr Vorschlag funktioniert nicht für mich. Ich habe # Version 420 an der Spitze meiner Quelldatei. glxinfo zeigt "4.2.0 NVIDIA 304.64" und "4.20 NVIDIA via Cg compiler". – dupersuper

Antwort

1

Abs() beginnt, Ganzzahlen bei 1,30 zu unterstützen und verdoppelt sich bei Version 4.10. Könnte ein offensichtliches Problem mit Versionen und Typen sein. Versuchen Sie, mit Floats statt mit Ints zu debuggen. Wenn das nicht hilft, isolieren und debuggen Sie abs() über Screen-Space-Shader und verwenden Sie es als Fragmentfarbe.