写入帧缓冲然后读取 - glReadPixels给出超出某个值限制的结果偏移量

时间:2016-03-20 10:13:55

标签: opengl glsl

我有一个测试情况,我使用以下代码写入帧缓冲区

varying vec4 vertex_color;
void main(void)
{
 gl_FragColor = vec4(129.0,129.0,129.0,256.0)/256.0;
}

稍后用glReadPixels调用

读回来
GLubyte data[4] = {0};
glReadPixels( pick.x, pick.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);

直到值128.0我准确读回了我所写的内容,超出了值范围129-255,值减少了一个,例如

gl_FragColor r(1.0) -> data[0]=1;
...
gl_FragColor r(128.0) -> data[0]=128;
gl_FragColor r(129.0) -> data[0]=128;
...
gl_FragColor r(255.0) -> data[0]=254;
gl_FragColor r(256.0) -> data[0]=255;

这种抵消可能来自哪里?

1 个答案:

答案 0 :(得分:2)

如果你的帧缓冲区使用颜色分量的标准化无符号字节(即:是RGBA8帧缓冲区),那么这正是你应该得到的行为。为什么呢?

因为你除以256.在闭合范围[0,256]上有257个数字。并且您不能在一个字节中放入257个单独的值,因为一个字节只保存 256 值。其中一人迷路了;在你的情况下,256。

这就是你通常除以255的原因。这会将闭合范围[0,255](一个字节覆盖的数字)映射到浮点范围[0,1]。