渲染到 QGLFrameBufferObject 与屏幕时 Alpha 合成错误

Posted

技术标签:

【中文标题】渲染到 QGLFrameBufferObject 与屏幕时 Alpha 合成错误【英文标题】:Alpha compositing wrong when rendering to QGLFrameBufferObject vs screen 【发布时间】:2012-03-28 18:58:08 【问题描述】:

在将具有部分不透明度的简单形状渲染到 Qt 中的 QGLFrameBufferObjects 时,我遇到了问题。

我已将问题简化为:

当我将一个简单的四边形渲染到颜色设置为 (1,0,0,.5) 的 QGLFrameBufferObject,然后将其 blit 到屏幕上时,我得到的结果对于 50% 的不透明度来说太亮了红色.如果我用相同的颜色(实际上是相同的代码)直接在屏幕上绘制相同的四边形,我会得到正确的颜色值。如果我用不透明度 == 1.0 渲染四边形,那么结果是相同的……在这两种情况下我都会得到一个完整的深红色。通过使用 buffer.toImage().save("/tmp/blah.tif") 直接将缓冲区转储到磁盘,我已经确认缓冲区中的颜色确实错误。

在这两种情况下,我在执行操作之前都将输出缓冲区清除为 (1,1,1,1)。

为什么我绘制的部分透明的东西在绘制到屏幕外缓冲区时比直接在屏幕上绘制时更亮?我必须在 FBO 或其他东西上设置一些状态,但我不知道它是什么。

【问题讨论】:

【参考方案1】:

Alpha 并不意味着“透明”。这并不意味着任何东西。只有当赋予它一个意义时,它才具有意义。当您设置使用 Alpha 控制透明度的混合模式时,它仅表示“透明”。因此,如果您没有 set up a blend mode 和 creates the effect of transparency,那么 alpha 只是另一个颜色分量,将完全按原样写入帧缓冲区。

【讨论】:

如果你说的确实是我的问题的根源,那么你是说我的混合模式在绘制到屏幕时设置正确,但在绘制到屏幕外缓冲区时却没有。然而,这两种情况的唯一区别是我创建了一个屏幕外缓冲区并将其绑定到我当前的上下文。那么如何解释我的混合模式在一种情况下是正确的而在另一种情况下是错误的。是否有特定于屏幕外缓冲区的混合模式,我需要独立于环境的其余部分进行设置? @Steve: So what would explain my blend mode being right in one case and wrong in the other. 你的代码有错误。但是你没有显示你的代码,所以我不能说。

以上是关于渲染到 QGLFrameBufferObject 与屏幕时 Alpha 合成错误的主要内容,如果未能解决你的问题,请参考以下文章

QGLFramebufferObject浮点纹理

在具有多重采样的 QGLFramebufferObject 中使用 sRGB 颜色

QPaint 到 QGLFramebufferObject 纹理上?

在 QGLFrameBufferObject 中绘制

大于 GL_MAX_VIEWPORT_DIMS 的视口平铺渲染

Qt OpenGL帧缓冲区到图像