我怎样才能读取glReadPixels浮点数据(How can I read float data

2019-10-18 05:07发布

我一直在试图读取浮点数据几天与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。 什么都不可能导致此?

Answer 1:

这是由你存储在规范化的整数浮点值,然后回读,并将其转换成一个浮点值造成的。

除非您使用的是帧缓冲区对象 ,赔率是非常好的,你目前的帧缓冲区是你从OpenGL上下文得到了什么。 这可能使用GL_RGBA8作为图像格式 。 这是每通道8比特,无符号和归一化的,存储为整数。 所以你写的浮点值被钳位在[0,1]的范围,然后通过255相乘并舍入,然后存储被转换成整数。

当读回作为浮子,所述转化是在反向完成:将整数值转换成浮点型,除以255,并返回。

0.02 * 255 = 5.1 ~= 5

5 / 255 = 0.0196

所以,这就是你会得到什么。

如果你想从你的片段着色器写一个浮点值,实际从你所读的背部得到的精度超过2-3个数字,然后你需要渲染到包含有一个合理的图像格式图像的FBO。 如浮点图像( GL_R16FGL_R32F ,因为你只写一个数据信道)。



文章来源: How can I read float data with glReadPixels