gpt4 book ai didi

OpenGL 阿尔法 mask

转载 作者:行者123 更新时间:2023-12-04 15:21:51 24 4
gpt4 key购买 nike

我正在尝试将 alhpa 掩码与 glAlphaBlend 及其所有参数一起使用。我在 stackoverflow 上找到了很多类似的答案,但我什么都没意识到。

我有三张图片,背景 (1)、蒙版 (2) 和文本 (3)。

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

Image Example

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

但一切正常!

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

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

最佳答案

完成此操作的“真正方法”是使用 shader programsmodern OpenGL .你为什么使用那个已弃用的 API?我们在 2014 年使用 OpenGL 4.5 作为最新版本。你甚至不能声称你关心向后兼容性,因为即使是一些非常老的卡(嗯,5 岁)今天支持至少 GL 3.2 是完全可编程的。你知道吗,即使使用 GL 2.0,你仍然可以使用着色器,但是如果你计划在不久的将来为你的生活编写 OpenGL 代码,那么使用已弃用的 API 会让你无处可去。

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

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

#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.
}

尽可能简单。希望对您有所帮助。

P.S 确保你也对 alpha 纹理进行 mipmap,以防漫反射纹理被 mipmap。另请注意,我的示例并不是为了解决您的特定任务,而是向您展示如何在可编程 OpenGL 中完成基本掩码。从这里可以很容易地弄清楚要做什么 ;)

附录:

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

在许多复杂的应用程序中,用户使用称为 alpha 贴图的附加纹理来屏蔽主纹理的像素,同时在此过程中考虑该纹理的 alpha,并且没有理由将 alpha channel “合并”到一个纹理贴图中因为它需要一个额外的步骤和浪费运行时间而没有真正的目的。在一些复杂的渲染场景中,这些 alpha 贴图只能在不同的渲染过程中根据请求生成,然后提取到片段着色器中以供最终使用。所以在这种情况下,应用程序甚至在运行时之前都没有该数据。此外,许多不同的颜色纹理可能需要相同的 alpha 蒙版。那么将它合并到所有这些中是否有意义?当然不是。与在 CPU 上合并透明度数据只是为了避免额外的纹理采样相比,上述做法是众所周知的并且非常有效。

关于OpenGL 阿尔法 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25788952/

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