c++ - 无法使 mask 与 OpenGL 一起正常工作

标签 c++ opengl masking

我正在尝试使用 OpenGL 遮盖图像,以便它的一部分是透明的。这是我的代码,它不起作用:

draw_img(background);

...

glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);

draw_img(foreground);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这是我的背景图片,我正在尝试在其上绘制:

background image

这里分别是贴图和蒙版(蒙版中的白色真的很透明,我只是把它压平了所以你可以看到):

texture mask

这是我期望得到的:

expected result

这是我实际得到的:

actual result

知道可能是什么问题吗?

最佳答案

首先,我认为这不会达到您的预期:

glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);

这是将 mask 与背景混合,但您说的是“始终采用 100% 的 mask ,始终采用 0% 的目标”。在这一步之后,帧缓冲区中将不再有红色像素,因为您已经用 mask 纹理替换了帧缓冲区的所有 channel 。

我猜你可能打算只替换 alpha channel ,而让颜色保持不变?如果在绘制 mask 之前 mask 颜色 channel ,则可以使用 glColorMask(GL_FALSE,GL_FALSE,GL_FALSE, GL_TRUE);

我认为如果您这样做可能会奏效。

我认为这种效果通常可以通过 glTexEnv 的多纹理操作来完成,但如果您不想使用多纹理,这应该可行。

关于c++ - 无法使 mask 与 OpenGL 一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10400651/

相关文章:

c++ - 使用声明中的元素类型隐式初始化 std::array

c++ - v8::Script::Compile(v8::String::New (".make.some.syntax.errors"), v8::String::New ("main"))->Run() 导致段错误

c++ - 将正交相机转换为透视 OpenGL

c++ - 尝试渲染高度贴图时 OpenGL 在 glDrawElements 上崩溃

java - java [android] 中小数点后 3 位的 EditText 掩码

database - 共享数据库上的数据屏蔽策略错误

c++ - 用.dll文件编译可执行文件,.dll文件相对于.exe

c++ - g++-8 和早期版本之间的奇怪行为

c++ - 使用 OpenGL 进行实时逐像素过滤的最佳方法?

javascript - 如何使 Angular 掩码适用于各种信用卡?