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

Blu*_*rer 7 opengl alpha

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)正如文档所述,我正在使用alpha编写(实际上在Direct3D文档中说的是相同的东西).

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

Blu*_*rer 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.550%透明白色而不是1.0, 1.0, 1.0, 0.5),并在其上绘制预乘的片段glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA),我们将在结果中使用正确的alpha通道.但是如果不希望最终结果,请记得撤消预乘