2012-11-11 17 views
8

Wykonuję cieniowanie rozmyte Gaussa w GLSL. Ponieważ jądro splotu jest symetryczne, przechowuję jego połowę. Piszę:GLSL abs() jest uszkodzony?

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

To dziwne, rysuje rozmycie nieco na lewo od tego, co powinno być. Ale potem zastępuję tę trzecią linię:

uint j = i * sign(i); 

A teraz działa tak, jak oczekuję. Czy złamałem numer abs()? Czy naprawdę znalazłem błąd kierowcy?

+0

Jakie są Twoje "GL_VERSION" i "GL_SHADING_LANGUAGE_VERSION"? – Matthias

+0

Czy 'uint j = uint (abs (i));' działa? – Matthias

+0

Twoja sugestia nie działa dla mnie. Mam #version 420 na górze mojego pliku źródłowego. glxinfo pokazuje "4.2.0 NVIDIA 304.64" i "4.20 NVIDIA przez kompilator Cg". – dupersuper

Odpowiedz

1

Abs() rozpoczyna obsługę liczb całkowitych o godzinie 1.30, a podwaja o wersji 4.10. Może być nieoczywistym problemem z wersjami i typami. spróbuj debugować za pomocą spławik zamiast ints. Jeśli to nie pomoże, izoluj i debuguj abs() za pomocą shadera obszaru ekranu i użyj go jako koloru fragmentu.