gpt4 book ai didi

c++ - OpenGL GLSL 纹理透明度

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:02 24 4
gpt4 key购买 nike

我想使用 GLSL 使我的 32 位位图纹理透明。我的片段着色器看起来像这样:

#version 120
uniform sampler2D myTexture;
varying vec2 TexCoord;

void main(void)
{
if(texture2D(myTexture, TexCoord).a != 1.0f)
{
discard;
}
gl_FragColor = texture2D(myTexture, TexCoord);
}

但这只会使 alpha 等于 0 的像素透明,并且我想保持纹理的淡入淡出。例如在这张图片中,第一张图片是纹理,第二张是纹理 mask ,第三张是想要的结果:

Example

纹理和纹理 mask 在一个 32 位位图中。

有谁知道如何使用 GLSL 实现这一点?

最佳答案

您需要启用 GL_BLEND,片段着色器的 alpha 输出将用于将片段输出与帧缓冲区混合。

glEnable(GL_BLEND);
glBlendFunc(..., ...);

glDraw????(...);

// You don't have to do it here, but GL_BLEND will remain enabled
// until you disable it again.
glDisable(GL_BLEND);

如果您使用预乘 alpha,

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

如果使用非预乘 alpha,

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

片段着色器无法进行混合,因为它无法访问帧缓冲区。

关于c++ - OpenGL GLSL 纹理透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28079159/

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