【问题标题】:Low precision and clamping when writing to floating point FBO写入浮点 FBO 时精度低且钳位
【发布时间】:2012-06-08 14:25:24
【问题描述】:

我有一个通过以下方式创建的 FBO:

glGenRenderbuffers(1, &m_depthStencilBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, m_width, m_height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_texture);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, m_width, m_height, 0, GL_RGBA, GL_FLOAT, 0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);

glGenFramebuffers(1, &m_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, m_texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
assert(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER));
glBindFramebuffer(GL_FRAMEBUFFER, 0);
assert(GL_NO_ERROR == glGetError());

然后我用这个最小的片段程序渲染到这个:

void main() {
    gl_FragColor = float4(3.001001f, 2.00002f, 7.00003f, 4.00004f);
}

如果我像这样读出像素:

glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, &pixels[0]);

并检查上面片段程序写入的像素是(1,1,1,1)。我只添加了glReadPixels 用于测试目的,如果我尝试使用textureRect 在另一个片段程序中对FBO 进行采样,我会遇到同样的问题。

【问题讨论】:

    标签: opengl


    【解决方案1】:

    是的,它将被限制在 (0, 1) 范围内 - 查看 glClampColor 并禁用颜色限制。

    希望这会有所帮助!

    【讨论】:

    • 它不应该应用于采样浮点纹理,但是(如 OP 所述)。
    • 它适用于 glReadPixels AFAIK。因此,虽然结果可能不会在 GPU 上被限制,但它们可能会在读取时被限制。从文档“glClampColor 控制在 glReadPixels.target 期间执行的颜色钳制必须是 GL_CLAMP_READ_COLOR。如果钳位是 GL_TRUE,则启用读取颜色钳位;如果钳位是 GL_FALSE,则禁用读取颜色钳位。如果钳位是 GL_FIXED_ONLY,则读取颜色钳位是仅当所选的读取缓冲区具有固定点组件并禁用否则时才启用。“ span>
    • 看来我可能需要 glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);让着色器工作。
    • @AndreasBrinck 对于片段颜色,默认其实应该是GL_FIXED_ONLY,不过是一试。
    • glClampColor 链接已失效
    【解决方案2】:

    问题是我的一个愚蠢的错误,在我调用的 FBO 调整大小代码中:

    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, ...);
    

    而不是

    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, ...);
    

    【讨论】:

      猜你喜欢
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2023-03-31
      • 2018-07-06
      相关资源
      最近更新 更多