0

我构建了一个“后处理管道”,它收集渲染调用并将它们放入纹理中。渲染完所有后处理效果后,我将所有结果放在一起。这是我的问题:

一开始,我用 glClearColor(0,0,0,0) 清除缓冲区。然后我调用绘图调用。当对象具有 0.5 alpha 的纹理时出现。这导致背景颜色和纹理之间的混合。我想避免混合。例如,如果纹理的像素为 0.5、0.5、0.5、0.5,则结果为 0.25、0.25、0.25、0.5,因为透明度为零的黑色背景受到影响。

我使用 glCopyTexImage2D 函数将渲染结果放入纹理中。我阅读了有关使用帧缓冲区的文章,但我想确定是否可以解决使用多个帧缓冲区的问题。

有人对我有建议吗?

4

1 回答 1

2

您可以尝试在绘图时使用预乘 alpha。基本上,确保所有颜色值都已经乘以 alpha 值。然后,而不是

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

你会用

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

纹理的像素将是 0.25、0.25、0.25、0.5。结果将是 0.25, 0.25, 0.25, 0.5,因为这都乘以 1。当然,您必须确保生成的输出纹理再次被正确解释为具有预乘 alpha。

在维基百科的一个尘土飞扬的角落里有一个很好的解释。

于 2011-01-20T17:50:20.447 回答