2012-11-11 4 views
8

GLSL에서 가우시안 블러 쉐이더를 만들고 있습니다. 컨볼 루션 커널은 대칭이므로, 나는 그 중 절반을 저장합니다. 나는 다음과 같이 씁니다 :GLSL abs()가 고장 났습니까?

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

이상하게도, 이것은 약간 왼쪽의 흐림 효과를 그립니다. 하지만 그 세 번째 줄은 다음과 같이 바꿉니다.

uint j = i * sign(i); 

이제 예상대로 작동합니다. 내가 깨졌어 abs()? 드라이버 버그를 찾았나요?

+0

당신의'GL_VERSION'과'GL_SHADING_LANGUAGE_VERSION'은 무엇입니까? – Matthias

+0

'uint j = uint (abs (i));가 작동합니까? – Matthias

+0

제안이 저에게 효과적이지 않습니다. 내 소스 파일 맨 위에 #version 420이 있습니다. glxinfo는 "4.2.0 NVIDIA 304.64"및 "4.20 NVIDIA via Cg 컴파일러"를 보여줍니다. – dupersuper

답변

1

Abs()는 1.30에서 정수를 지원하고 4.10 버전에서 두 배가됩니다. 버전 및 유형에 대한 명백한 문제 일 수 있습니다. int 대신에 float로 디버깅을 시도하십시오. 그게 화면 공간 쉐이더를 통해 abs()를 분리하고 디버그하고 그것을 조각 색상으로 사용하는 것보다 도움이되지 않는다면.

관련 문제