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

标签 linux qt opengl opacity

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

我把问题简化为:

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

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

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

最佳答案

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

关于linux - 渲染到 QGLFrameBufferObject 与屏幕时 Alpha 合成错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9913957/

相关文章:

c++ - 链接两个 QListWidget

Qt动画按钮

c++ - Linux 上 gcc 4.9.2 的奇怪行为

c++ - 奇怪的 OpenGL 阴影映射行为

linux - 如何替换一堆文件中的多行字符串

linux - 在 ARM-OABI 上实现 syscall()。什么是 "svc#0x900071"?

c - 操作系统: Isn't it a wrong practice to switch to another process with the interrupt blocked?

javascript - 我想从 200 页中删除以下脚本

Qt 在两个 QListWidget 之间拖放

c++ - 使用 glm 沿四元数平移相机