2012-11-11 7 views
8

Sto creando uno shader sfocatura gaussiano in GLSL. Poiché il kernel della convoluzione è simmetrico, ne memorizzo metà. Scrivo:GLSL abs() rotto?

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

Stranamente, questo è il disegno della sfocatura leggermente a sinistra di quello che dovrebbe essere. Ma sostituisco la terza riga con:

uint j = i * sign(i); 

E ora funziona come mi aspetto. Ho rotto abs()? Ho davvero trovato un bug del driver?

+0

Qual è il tuo 'GL_VERSION' e' GL_SHADING_LANGUAGE_VERSION'? – Matthias

+0

'uint j = uint (abs (i));' funziona? – Matthias

+0

Il tuo suggerimento non funziona per me. Ho #version 420 nella parte superiore del mio file sorgente. glxinfo mostra "4.2.0 NVIDIA 304.64" e "4.20 NVIDIA tramite compilatore Cg". – dupersuper

risposta

1

Abs() inizia a supportare numeri interi a 1.30 e raddoppia alla versione 4.10. Potrebbe essere un problema non ovvio con versioni e tipi. prova a eseguire il debug con float al posto di ints. Se questo non aiuta che isolare ed eseguire il debug di abs() tramite shader dello spazio dello schermo e usarlo come colore del frammento.