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。

谁有我可以阅读的示例代码?

最简单的解决方案是:

  1. 绘制C;
  2. 使用防止写入帧缓冲区的颜色遮罩绘制 B(但不要触及深度遮罩,这样仍然会写入深度缓冲区);
  3. 画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);