【发布时间】:2012-01-28 23:55:39
【问题描述】:
出于性能原因,我将 2D 和 3D 渲染分开。对于每种类型,我有两个 QGLFramebufferObject,因为 QGLFramebuffer 不支持以GL_TEXTURE_2D 作为目标的多重采样,因此一旦在多重采样缓冲区中完成绘图,它就会被传送到解析像素值的“普通”QGLFramebufferObject 中。一旦为一种/两种渲染类型完成此操作,缓冲区将用作着色器的纹理输入,将 2D“层”混合到 3D 层。
我应该提到我被锁定在使用 QGLFramebufferObjects 而不是纯 OpenGL 对象,因为我使用 QPainter 进行所有 2D 工作,而 QPainter 只能绘制到 Qt 类型上。
这个过程效果很好,除了抗锯齿太暗,几乎看起来像一个黑色的轮廓:
在做了一些研究后,我发现这归结为使用线性色彩空间而不是 sRGB(here 和 here)。所以我为我的 FBO blitting 启用了GL_FRAMEBUFFER_SRGB,将我所有 FBO 的纹理目标内部类型设置为GL_SRGB8_ALPHA8,并在我的着色器中进行混合计算之前执行 sRGB->Linear(并在最终输出之前再次返回)。
但它不起作用;它要么看起来太亮、太暗,要么看起来完全一样。每当整个画面太暗/太亮时,我知道这是因为我错过了色彩空间转换。但是当它看起来完全一样时——这是怎么回事!?
我真的可以请人解释启用GL_FRAMEBUFFER_SRGB 状态的操作顺序,如果 blitting 会影响色彩空间,以及哪些 FBO 需要在 sRGB 中才能使抗锯齿看起来正确。还是我完全错了,导致这些多重采样伪影的完全是其他原因吗?
【问题讨论】:
标签: c++ qt opengl framebuffer srgb