2016-02-06 73 views
0

我正在使用Qt5及其OpenGL集成,并且在尝试绘制半透明物体时遇到问题。当一个对象是半透明的时候,在我的OpenGL窗口后面可见的任何东西都会显示在该对象的屏幕区域内,而不是与已存在于颜色缓冲区中的对象混合。我已经开始通过我的半透明物体观看YouTube视频,因为无论显示的是现场直播。Qt OpenGL - 半透明物体显示窗口后方的内容

Translucency

有趣的是,最看穿物体变得似乎在半透明度出现 - 完全不透明使得它坚实的,而零不透明度呈现什么都没有(和任何以前在3D的背景场景仍然在那里)。最后渲染半透明物体并不能解决问题。

我注意到,当我在纹理上启用mipmap时,也会发生这种情况 - 随着物体上某个点的距离增加,相关像素变得更加半透明并显示OpenGL窗口后面的任何内容。这个问题出现在我的Windows和OSX机器上。

这是一个已知的问题?有没有解决方法?谷歌没有证明太有帮助。

回答

1

哈,这很有趣。我无法告诉你发生了什么事情,因为通常需要额外的努力才能使窗口实际透明。在Windows中,你必须选择一个alpha通道的framebuffer格式,并调用DwnEnableBlurBehindWindow来实现这个效果。而据我所知,Qt并没有这样做。

但是,如果它确实在这里有一些提示:

  • 确保你清楚你的帧缓冲的α= 1
  • 当渲染半透明物体保持目的地阿尔法值1,即不使用混合模式和函数修改目标alpha值,或强制它为1.

实际上,除了实现窗口半透明效果外,主窗口framebuffer上的alpha通道几乎没有用处。除非你需要这些,否则你应该为你的窗口framebuffer选择一个没有alpha通道的像素格式,或者在完全不透明的情况下保留所有像素的alpha值。

+0

你说的像素格式是正确的 - 我将默认格式设置为使用8位阿尔法缓冲区,并且输出的是我的分片代码中输入的任何alpha值的颜色。它看起来像是设置窗口帧缓冲区的alpha值,这意味着从后面的东西显示通过。我是否认为这意味着OpenGL混合函数只使用输入alpha来计算最终的RGB颜色,因此我不需要从片段着色器中写入该alpha? – x6herbius

+0

@ x6herbius:您可以配置OpenGL如何使用'glBlendFunc'或'glBlendFuncSeparate'使用源(传入像素)和目标(帧缓冲中已存在的内容)alpha值 - 完全可以使用目标alpha进行计算。但是,在主要帧缓冲区上使用这种情况的情况很少(这对于创建中间图像来说是非常有意义的)。 – datenwolf