gpt4 book ai didi

opengl:非线性加色混合

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

我正在编写一个基于 PyOpenGL 的 UI 来手动对齐图像。我将我的两个图像显示为带纹理的四边形,即静态引用之上的移动图像。运动图像以红色显示,具有不同的 alpha,即 glColor4f(1.,0.,0.,overlay_opacity) ,静态图像以青色显示,不透明度恒定为 1,即 glColor4f(0.,1.,1.,1.) .然后用户可以更改 overlay_opacity通过鼠标滚动以在移动图像和引用图像之间淡入淡出。

目前我正在使用 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) .虽然这确实允许我在青色和红色图像之间平滑淡入淡出,但这也意味着当 overlay_opacity等于 0.5 我只得到红色和青色图像最大强度的一半,所以结果看起来暗淡和浑浊。如果我使用 glBlendFunc(GL_SRC_ALPHA,GL_ONE)我总是为我的青色图像获得最大强度,所以我不能淡出它。我真正想要的是某种非线性混合,看起来像下面的第三张图:

enter image description here

我想我也许可以在片段着色器中做到这一点,但似乎应该有一种更简单的方法来使用 glBlendFunc() 来实现相同的结果。 .我也试过 GL_SRC_ALPHA_SATURATE ,这在我的实现中似乎不起作用。

最佳答案

快速回答:不,仅使用 OpenGL 调用是不可能的。 GL_SRC_ALPHA_SATURATE也不应该做你想做的事,它的 RGB 因子是 min(Asrc, (1-Adest)) ,在你的情况下,它可能总是等于 Asrc ,因为我假设您的目标 alpha 始终为 0。

长答案:您最好也是唯一的选择是编写所述片段着色器。为了实现你想要的,你必须使用一些技巧。我建议预先将叠加颜色与 alpha 因子相乘,并输出另一个 alpha 值以混合目标颜色。与此类似的等式就足够了:

// Note I cap off the alpha values in both cases to achieve the desired non-linear ramp
float alpha = overlay_opacity * 2.0f;
out = vec4(color.rgb * min(1.0f, alpha), min(1.0f, 2.0f - alpha));

然后使用以下混合函数来确保目标颜色也混合:
glBlendFunc(GL_ONE, GL_SRC_ALPHA);

进一步优化,您注意到我将叠加不透明度乘以 2 以将其限制为两个 alpha 值。您可以在将其传递给着色器之前将其预先乘以 2,而不是这样,这将减少每个像素的一些乘法运算。

希望这能解决您的问题,祝您好运!

关于opengl:非线性加色混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16309461/

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