OpenGL - mask with multiple textures(OpenGL - 具有多个纹理的蒙版)
问题描述
我已经根据以下概念在 OpenGL 中实现了遮罩:
I have implemented masking in OpenGL according to the following concept:
- 面具由黑白两色组成.
- 前景纹理应该只在蒙版的白色部分可见.
- 背景纹理应该只在遮罩的黑色部分可见.
我可以使用 glBlendFunc() 使白色部分或黑色部分按预期工作,但不能同时使用两者,因为前景层不仅混合到蒙版上,还混合到背景层上.
I can make the white part or the black part work as supposed by using glBlendFunc(), but not the two at the same time, because the foreground layer not only blends onto the mask, but also onto the background layer.
有没有人知道如何以最好的方式完成这项工作?我一直在网上搜索并阅读有关片段着色器的内容.这是要走的路吗?
Is there anyone who knows how to accomplish this in the best way? I have been searching the net and read something about fragment shaders. Is this the way to go?
推荐答案
这应该有效:
glEnable(GL_BLEND);
// Use a simple blendfunc for drawing the background
glBlendFunc(GL_ONE, GL_ZERO);
// Draw entire background without masking
drawQuad(backgroundTexture);
// Next, we want a blendfunc that doesn't change the color of any pixels,
// but rather replaces the framebuffer alpha values with values based
// on the whiteness of the mask. In other words, if a pixel is white in the mask,
// then the corresponding framebuffer pixel's alpha will be set to 1.
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
// Now "draw" the mask (again, this doesn't produce a visible result, it just
// changes the alpha values in the framebuffer)
drawQuad(maskTexture);
// Finally, we want a blendfunc that makes the foreground visible only in
// areas with high alpha.
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
drawQuad(foregroundTexture);
这相当棘手,所以如果有任何不清楚的地方,请告诉我.
This is fairly tricky, so tell me if anything is unclear.
不要忘记请求 alpha 缓冲区创建 GL 上下文.否则有可能在没有 alpha 缓冲区的情况下获得上下文.
Don't forget to request an alpha buffer when creating the GL context. Otherwise it's possible to get a context without an alpha buffer.
在这里,我做了一个插图.
Here, I made an illustration.
自从写下这个答案,我了解到有更好的方法来做到这一点:
Since writing this answer, I've learned that there are better ways to do this:
- 如果您仅限于 OpenGL 的固定功能管道,请使用纹理环境
- 如果您可以使用着色器,请使用片段着色器.
此答案中描述的方法有效,并且在性能上并不比这 2 个更好的选项差,但不够优雅且不那么灵活.
The way described in this answer works and is not particularly worse in performance than these 2 better options, but is less elegant and less flexible.
这篇关于OpenGL - 具有多个纹理的蒙版的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:OpenGL - 具有多个纹理的蒙版
基础教程推荐
- 使用从字符串中提取的参数调用函数 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01