gpt4 book ai didi

OpenGL 默认管道 alpha 混合对于 alpha 分量没有任何意义

转载 作者:行者123 更新时间:2023-12-02 04:17:04 28 4
gpt4 key购买 nike

问:有没有办法使用默认管道正确混合 Alpha 分量?

问题:我正在将半透明表面绘制到纹理中,然后我想将该纹理传输到主框架后台缓冲区中。通常,当您使用直接的 Alpha 混合来实现透明度或抗锯齿时,会将颜色分量混合到后台缓冲区(默认情况下没有 Alpha channel )。

但是,当混合到具有 alpha 分量的纹理时,通常的 GL_SRC_ALPHA、GL_ONE_MINUS_DST_ALHPA 无法正确混合“alpha”分量:

enter image description here

注意死星上方红色和蓝色圆圈边缘的问题区域; alpha 分量应该是完全不透明的。请注意,RGB 分量按预期混合。

因此,我尝试了 BlendFunc 的不同设置,最接近我想要的设置是使用 GL_DST_ALPHA 作为我的 dst alpha 缩放因子。

enter image description here

这种方法仍然存在问题,因为混合两个不透明度为 50% 的表面应该会得到一个不透明度为 75% 的组合表面。但使用 OpenGL 默认公式,我得到 (0.50.5) + (0.50.5) = 0.5。更令人不安的是,如果我有 2 个不透明度为 40% 的表面,我会得到一个不透明的表面:(.4*.4)+(.4*.4) = 0.32。

真正的公式 ( 1 - ( 1 - srcAlpha ) * ( 1 - dstAlpha ) ) 意味着我可以在 alpha 分量的混合方程中使用 GL_FUNC_MULT 而不是 GL_FUNC_ADD。不幸的是,这并不存在。

所以我放弃了并尝试使用着色器来做解决方案。如果您要渲染的纹理也是您读取的纹理,那么这会变得非常复杂。特别是当您渲染多个半透明表面时。

我正在寻找尚未尝试过的替代解决方案。欢迎任何想法。

编辑:我还尝试了 GL_ONE 作为 src 和 dst 缩放因子。这使得 alpha 分量太不透明,因为 1*.5 + 1*.5 将给出 1 作为结果 alpha。让我想知道 GL_ONE 和 GL_DST_ALPHA 是否会给出更好的结果。

附: :我用过Anders Riggelsen的图像混合工具。

最佳答案

完美混合的标准技术是使用

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

请注意,它需要对源和目标进行预乘,并生成预乘结果。

预乘基本上意味着对颜色执行color.rgb *= color.a。通常,您在加载纹理时将其应用到纹理,应用到着色器中的最终颜色。

推论:如果alpha == 1,预乘没有区别。

<小时/>

如果源未预乘,但目标已预乘,请改用:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

关于OpenGL 默认管道 alpha 混合对于 alpha 分量没有任何意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37532428/

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