Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL GLSL纹理透明度_C++_Opengl_Textures_Glsl_Transparency - Fatal编程技术网

C++ OpenGL GLSL纹理透明度

C++ OpenGL GLSL纹理透明度,c++,opengl,textures,glsl,transparency,C++,Opengl,Textures,Glsl,Transparency,我想使用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);

我想使用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的像素才是透明的,我想保持纹理的淡入度。例如,在此图片中,第一个图像是纹理,第二个是纹理遮罩,第三个是所需结果:

纹理和纹理遮罩位于一个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);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
如果使用非预乘alpha

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

这是通过混合实现的。我知道,但这只是即时模式,它确实不准确,我想用着色器来实现。混合还使遮罩周围出现了一些恼人的透明边框。混合在着色器和现代OpengGL中效果很好。好的,谢谢你,你能告诉我,我如何去除纹理的残余,以便可以在纹理后面的对象上看到它?在这张图片中,你可以看到一个滑动条和插入符号。透明度在插入符号上,但通过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);