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

Write to framebuffer then read - glReadPixels gives result offset beyond a certain value limit

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

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;

这个偏移量可能来自哪里?

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

因为你除以256。而闭区间[0, 256]上有257个数。而且你不能在一个字节中放入 257 个单独的值,因为一个字节只包含 256 个值。其中一个迷路了;在你的情况下,256.

这就是为什么您通常会除以 255。这会将封闭范围 [0, 255](一个字节涵盖的数字)映射到浮点范围 [0, 1]。