OpenGL Alpha Mask

May*_*eur 2 opengl alpha mask freetype

我正在尝试使用alAlp masking与glAlphaBlend及其所有参数.我在stackoverflow上找到了很多相似的答案,但我没有意识到任何事情.

我有三个图像,一个背景(1),一个面具(2)和一个文本(3).

我想要的是绘制背景,将我的蒙版减去文本以最终获得图像(A).

图像示例

Draw background

glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
glBegin(GL_QUADS);
glColor4ub(0,0,0,255);
glVertex2d(mxIncrust0 - bgwidth, myIncrust0);
glVertex2d(mxIncrust0, myIncrust0);
glVertex2d(mxIncrust0, myIncrust0 + textheight);
glVertex2d(mxIncrust0 - bgwidth, myIncrust0 + textheight);
glEnd();
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_ZERO, GL_ONE);

Draw Text
Run Code Online (Sandbox Code Playgroud)

但是一切正常!

实现它的真正方法是什么?

我的问题不同,因为它不是基于OpenGL ES而是仅基于Open GL.

Mic*_* IV 7

实现这一目标的"真正方法"是使用着色器程序和现代OpenGL.为什么使用这个已弃用的API?我们在2014年将OpenGL 4.5作为最新版本.你甚至不能声称你关心向后兼容性因为即使是一些非常古老的卡(好吧,5岁)今天至少支持GL 3.2,它完全可编程.你知道吗,即使使用GL 2.0,你仍然可以使用着色器,但是如果使用已弃用的API,那么无论如何您计划在不久的将来为您的生活编写OpenGL代码.

现在,使用着色器,屏蔽是最琐碎的任务之一.您通常会将2个纹理传递到片段着色器中.1 - 漫反射纹理(覆盖表面的实际纹理)2 - 蒙版纹理(可能是单通道灰度纹理)

片段着色器看起来像这样:

#version 150
uniform sampler2D maskTex;
uniform sampler2D colorTex;

out vec4 colorOut;
in smooth vec2 texCoords;
void main(){ 

     vec4 color = texture(colorTex,texCoords);
     vec4 mask  = texture(maskTex,texCoords);

     colorOut =vec4(color.rgb,color.a * mask.r);//alpha value can be in any channel ,depends on texture format.
}
Run Code Online (Sandbox Code Playgroud)

尽可能简单.希望它有所帮助.

如果弥散纹理是mipmap的,PS也要确保你也可以对alpha纹理进行mipmap.另请注意我的示例不是为了解决您的具体任务,而是向您展示如何在可编程OpenGL中完成基本屏蔽.从这里可以很容易地找出要做的事情;)

附录:

下面的评论中有人想知道为什么在地球上会想要使用额外的纹理来保存alpha蒙版数据.这是我的答案:

在许多复杂的应用程序中,用户使用称为alpha贴图的其他纹理来遮盖主要纹理的像素,同时还要考虑到该过程中纹理的alpha值,并且没有理由将alpha通道"合并"到一个纹理贴图中,因为它会在一些复杂的渲染场景中,这些alpha映射只能在请求时在不同的渲染过程中生成,然后被提取到片段着色器中以供最终使用.所以在这种情况下,应用程序在运行时之前甚至没有那些数据.此外,许多不同的颜色纹理可能需要相同的alpha蒙版.将它合并到所有这些中是否有意义?当然不是.上面的做法是众所周知的,并且与在CPU上合并透明度数据相比,只是为了避免额外的纹理采样.