11

正如文档所说,我正在使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)alpha 撰写(实际上在 Direct3D 文档中也说了同样的话)。

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

4

1 回答 1

14

好吧,原因很明显。使用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_alpha和相乘dst_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 通道。但是如果最终结果不需要预乘,请记住撤消预乘

于 2013-10-16T05:29:53.140 回答