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