OpenGL如何使用不可见的遮罩将物体隐藏在它后面
OpenGL How to use a invisible mask to hide objects behind it
我有一个 OpenGL 问题需要解决。我有一个 object/mesh A,一个 object/mesh B 和一个背景纹理 C。
最初帧缓冲区填充有背景纹理 C。我们在帧缓冲区中绘制 A 和 B。我们希望保持对象 A 可见,而对象 B 始终不可见。
一开始A在B的前面,在旋转的过程中,根据深度测试结果,在某个角度,B在A的前面,但是由于B一直是不可见的,所以B的部分应该用背景C.
有谁知道解决这个问题的简单方法吗?
模板测试是一种好方法吗?基本上给对象B设置一个颜色,比较B的颜色和背景C的颜色,当测试失败时显示背景C。
谁有我可以阅读的示例代码?
最简单的解决方案是:
- 绘制C;
- 使用防止写入帧缓冲区的颜色遮罩绘制 B(但不要触及深度遮罩,这样仍然会写入深度缓冲区);
- 画A,以深度测试为准
要使用的具体内容是 glColorMask
— 如果您通过它为每个通道提供 GL_FALSE
,那么后续几何体将不会写入任何颜色输出。但假设你没有触及 glDepthMask
它仍然会写入深度输出。
那么,您目前可能已经获得了代码:
drawBackground(C);
render(A);
render(B);
您只需将其调整为:
drawBackground(C);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
render(B);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
render(A);
我有一个 OpenGL 问题需要解决。我有一个 object/mesh A,一个 object/mesh B 和一个背景纹理 C。
最初帧缓冲区填充有背景纹理 C。我们在帧缓冲区中绘制 A 和 B。我们希望保持对象 A 可见,而对象 B 始终不可见。
一开始A在B的前面,在旋转的过程中,根据深度测试结果,在某个角度,B在A的前面,但是由于B一直是不可见的,所以B的部分应该用背景C.
有谁知道解决这个问题的简单方法吗?
模板测试是一种好方法吗?基本上给对象B设置一个颜色,比较B的颜色和背景C的颜色,当测试失败时显示背景C。
谁有我可以阅读的示例代码?
最简单的解决方案是:
- 绘制C;
- 使用防止写入帧缓冲区的颜色遮罩绘制 B(但不要触及深度遮罩,这样仍然会写入深度缓冲区);
- 画A,以深度测试为准
要使用的具体内容是 glColorMask
— 如果您通过它为每个通道提供 GL_FALSE
,那么后续几何体将不会写入任何颜色输出。但假设你没有触及 glDepthMask
它仍然会写入深度输出。
那么,您目前可能已经获得了代码:
drawBackground(C);
render(A);
render(B);
您只需将其调整为:
drawBackground(C);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
render(B);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
render(A);