tay*_*rak 1 c++ opengl graphics shader glsl
几天来我一直在尝试使用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];
}
Run Code Online (Sandbox Code Playgroud)
和我的着色器代码:
out float data;
void main()
{
data = 0.02;
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是我得到 0.0196078 作为输出。但当数据为 0.2 时一切都很好。如果数据为 0.002,则全为 0。什么可能导致这种情况?
这是由于您将浮点值存储在标准化的格式中引起的整数中,然后将其读回并将其转换为浮点值。
除非您使用的是帧缓冲区对象,否则您当前的帧缓冲区很可能正是您从 OpenGL 上下文中获得的内容。这可能GL_RGBA8用作图像。即每个通道 8 位,无符号且标准化,存储为整数。所以你写入的浮点值被钳制在[0, 1]范围内,然后通过乘以255并四舍五入转换为整数,然后存储。
当您将其作为浮点数读回时,转换将以相反的方式完成:将整数值转换为浮点数,除以 255,然后返回。
0.02 * 255 = 5.1 ~= 5
5 / 255 = 0.0196
Run Code Online (Sandbox Code Playgroud)
这就是你得到的回报。
如果您想从片段着色器写入浮点值,并且实际上从读回的内容中获得超过 2-3 位的精度,那么您需要渲染到包含具有合理图像格式的图像的 FBO。例如浮点图像(GL_R16F或GL_R32F,因为您只写入一个数据通道)。
| 归档时间: |
|
| 查看次数: |
2759 次 |
| 最近记录: |