如何使用OpenGL正确处理alpha合成

时间:2013-10-16 05:29:53

标签: opengl alpha

我正在使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)进行字母组合,正如文档所说的那样(实际上Direct3D文档中也有同样的内容)。

一切都很好,直到我从GPU下载结果并使其成为PNG图像。结果alpha分量是错误的。在绘图之前,我已经清除了具有不透明黑色的帧缓冲区。在我画了半透明的东西后,帧缓冲区变得半透明。

1 个答案:

答案 0 :(得分:10)

原因很明显。使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),我们实际上忽略了目标alpha通道并假设它始终为1.当我们将帧缓冲区视为不透明的东西时,这是可以的。

但是,如果我们需要正确的alpha值呢? glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)并使源预乘(预乘纹理/顶点颜色或将alpha组件与alpha组件相乘,然后再将其设置为gl_FragColor)。

glBlendFunc只能将原始颜色分量与一个因子相乘,但alpha合成需要将目标与one_minus_src_alphadst_alpha相乘。所以必须预先加倍。我们不能在帧缓冲区中进行预乘,但只要源和目标都是预乘,结果就是预乘。也就是说,我们首先使用任何预乘颜色清除帧缓冲区(例如:0.5, 0.5, 0.5, 0.5表示50%透明白色而不是1.0, 1.0, 1.0, 0.5),并使用glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)在其上绘制预乘片段,并且我们将在结果中使用正确的alpha通道。 但是如果最终结果不需要,请记得撤消预乘