我想利用OpenGL对离散标量贴图进行采样。标量图以每个三角形为基础给出,即每个三角形一个标量。
首先,我使用平面着色和与标量贴图对应的颜色值绘制每个三角形。然后,我使用 glReadPixels(...)从帧缓冲区读取采样标量图。
我的问题如下:
出于某种原因,我只能恢复高达1e-2的颜色值!我不知道为什么这个精度太差了。我正在写帧并从帧缓冲区读取浮点数。
有谁知道为什么我只能从帧缓冲区恢复如此糟糕的浮点精度?
以下是重要的代码段,我只为每个三角形使用常量颜色值 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);
答案 0 :(得分:4)
你写入或从帧缓冲区读取的内容并不重要,因为帧缓冲实际上 存储 。
GL会很乐意整天将颜色转换为unsigned normalized。除非你有一个浮点帧缓冲区,否则会发生很多不愉快的事情,例如钳位([ 0.0 , 1.0 ])并缩放到定点值范围内(8通常是。)
给定一个8位无符号标准化颜色缓冲区,您可以存储和恢复的最小非零颜色值 ~0.0039 ( 1.0 / 255.0 强>)。
创建浮点默认帧缓冲区的过程是特定于平台/框架的。为了做到你想要的便携,最简单的事情实际上是绘制一个浮点颜色附件的FBO,你在 之后设置 你设置了默认的帧缓冲。