c++ - 使用 glReadPixels(...) 读取帧缓冲区时精度较低

标签 c++ opengl framebuffer glreadpixels

我想利用 OpenGL 对离散标量图进行采样。标量图是按每个三角形给出的,即每个三角形一个标量。

首先,我用平面阴影和与标量图相对应的颜色值绘制每个三角形。然后,我使用 glReadPixels(...) 从帧缓冲区读取采样的标量图。

我的问题如下:

出于某种原因,我只能恢复最多 1e-2 的颜色值!我不知道为什么这个精度这么差。我正在从帧缓冲区写入和读取 float 。

有谁知道为什么我只能从帧缓冲区恢复如此糟糕的浮点精度?

这是重要的代码片段,我只是为每个三角形使用一个恒定的颜色值colorValue。如果我设置 colorValue 例如到 1e-4,我只能从帧缓冲区恢复零。

// Set viewport to desired map size
glViewport(0,0,imageWidth, imageHeight);
glClearColor(0.,0.,0.,1.); // Black background
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glDisable(GL_LIGHTING);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1,1.,-1,1);
glMatrixMode(GL_MODELVIEW);

// Draw scalar map
glBegin(GL_TRIANGLES);
for (unsigned int f=0; f<F.rows(); ++f)
 {
  val = colorVal;
  glColor3f(val, val, val);

  glVertex3f(...);
  glVertex3f(...);
  glVertex3f(...);
}
glEnd();
glFlush();
glFinish();

GLfloat* fbuffer = new GLfloat[imageWidth*imageHeight];
glReadPixels(0,0,imageWidth,imageHeight,GL_RED,GL_FLOAT,fbuffer);

最佳答案

向帧缓冲区写入或读取内容并不重要,重要的是帧缓冲区实际存储的内容。

GL 会很乐意整天在 unsigned normalized 之间转换颜色。除非您有浮点帧缓冲区,否则会发生很多令人不快的事情,例如钳位([0.0,1.0])和缩放到定点值范围(8 -位通常)。

给定一个 8 位无符号标准化颜色缓冲区,您可以存储和恢复的最小非零颜色值是 ~0.0039 (1.0/255.0强>)。

创建浮点默认帧缓冲区的过程是特定于平台/框架的。要以可移植的方式实现您想要的功能,最简单的方法实际上是使用您在设置默认帧缓冲区之后创建的浮点颜色附件绘制到 FBO 中。 p>

关于c++ - 使用 glReadPixels(...) 读取帧缓冲区时精度较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747349/

相关文章:

c++ - 将 vector 模拟为二维数组

c++ - Qt 与正在运行的工作线程的通信

c++ - OpenGL:使用 2500*2500 像素的纹理是否可以接受?

opengl - 为什么定义 float 时的 'f' 后缀有时会导致 GLSL 编译器错误?

c++ - 为什么从帧缓冲区创建的纹理没有正确映射

java - LWJGL 无法在着色器中采样帧缓冲区纹理

c++ - 单击按钮时全局变量包含垃圾

c++ - 在着色器上计算标准化设备坐标会显示与在 cpu 上计算不同的结果

linux - 从帧缓冲区读取之前是否需要使缓存失效?

c++ - 容器类型转换