代码之家  ›  专栏  ›  技术社区  ›  Heiner

写入framebuffer,然后读取-glReadPixels,结果偏移量超过某个值限制

  •  0
  • Heiner  · 技术社区  · 10 年前

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

    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的范围内,值降低了1,例如

    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 回复  |  直到 10 年前
        1
  •  2
  •   Nicol Bolas    10 年前

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

    因为你除以256。在闭合范围[0256]上有257个数字。你不能在一个字节中放入257个单独的值,因为一个字节只能容纳 256 价值观其中一个迷路了;在你的情况下是256。

    这就是为什么你通常会除以255。这将把闭合范围[0,255](一个字节包含的数字)映射到浮点范围[0、1]。