2013-06-01 54 views
1

我一直在嘗試使用glReadPixels讀取浮動數據幾天。如何使用glReadPixels讀取浮動數據

我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_RGBA8作爲image format。這是每通道8位,無符號和標準化,存儲爲整數。所以你寫的浮點值被鉗位到[0,1]範圍,然後通過乘以255和舍入轉換成一個整數,然後存儲。

當您將其作爲浮點數讀取時,轉換完成反向:將整數值轉換爲浮點數,除以255,然後返回。

0.02 * 255 = 5.1 ~= 5 

5/255 = 0.0196 

所以這就是你回來的。

如果您想從片段着色器中編寫浮點值,並且實際從讀回的內容中獲取超過2-3位數的精度,則需要將其渲染爲包含合理圖像的FBO圖像格式。如浮點圖像(GL_R16FGL_R32F,因爲您只寫入一個數據通道)。

+0

這很有道理。謝謝。 – tayrak