gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:07:39 29 4
gpt4 key购买 nike

我正在使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)对于文档所说的 alpha 组合(实际上在 Direct3D 文档中也说了同样的事情)。

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

最佳答案

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

但是如果我们需要正确的 alpha 值呢? glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)并制作源预乘 (预乘纹理/顶点颜色或在将其设置为 gl_FragColor 之前将 alpha 分量与 alpha 分量相乘)。

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 channel 。 但是如果最终结果不想要,请记住取消预乘

关于opengl - 如何使用 OpenGL 正确处理 alpha 合成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19395874/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com