2013-06-01 2 views
1

나는 flo30 데이터를 이틀 동안 glReadPixels으로 읽으려고했습니다.어떻게 glReadPixels로 float 데이터를 읽을 수 있습니까

내 CPP 코드 :

//expanded to whole screen quad via vertex shader 
glDrawArrays(GL_TRIANGLES, 0, 3); 

int size = width * height; 
GLfloat* pixels = new GLfloat[ size ]; 
glReadPixels(0, 0, width, height, GL_RED, GL_FLOAT, pixels); 

pixelVector.resize(size); 
for (int i = 0; i < size; i++) { 
    pixelVector[i] = (float) pixels[i]; 
} 

내 쉐이더 코드 :

out float data; 

void main() 
{ 
    data = 0.02; 
} 

이상하게도 나는 출력으로 0.0196078 얻을. 그러나 데이터가 0.2이면 모든 것이 좋습니다. 데이터가 0.002이면 모두 0입니다. 무엇이 이것을 일으킬 수 있습니까?

답변

3

이 문제는 부동 소수점 값을 정규화 된 정수에 저장 한 다음이를 다시 읽고 부동 소수점 값으로 변환함으로써 발생합니다.

framebuffer object을 사용하지 않는 한, 현재 프레임 버퍼가 OpenGL 컨텍스트에서 얻은 것뿐입니다. 아마도 GL_RGBA8image format으로 사용합니다. 채널 당 8 비트이고 부호가없고 표준화되어 정수로 저장됩니다. 그래서 여러분이 작성한 부동 소수점 값은 [0, 1] 범위에 고정되고 255를 곱하고 반올림하여 정수로 변환 된 다음 저장됩니다.

플로트로 다시 읽으면 변환은 반대로 수행됩니다. 정수 값은 부동 소수점으로 변환되어 255로 나뉘어 반환됩니다.

0.02 * 255 = 5.1 ~= 5 

5/255 = 0.0196 

그래서 다시 돌아 왔습니다.

프래그먼트 셰이더에서 부동 소수점 값을 쓰고 실제로 읽은 것의 정밀도가 2 ~ 3 자리 이상인 경우 합리적인 수준의 이미지가 포함 된 FBO로 렌더링해야합니다 이미지 형식. 부동 소수점 이미지 (GL_R16F 또는 GL_R32F)는 하나의 데이터 채널 만 쓰고 있기 때문에.

+0

그건 의미가 있습니다. 고맙습니다. – tayrak

관련 문제