OpenGL如何使用隐形掩码隐藏它后面的对象

时间:2015-05-29 17:11:53

标签: opengl opengl-es depth depth-buffer stencils

我有一个要解决的OpenGL问题。我有一个对象/网格A,一个对象/网格B和一个背景纹理C.

最初,帧缓冲区填充了背景纹理C.我们绘制了A& B在帧缓冲区中。我们希望对象A保持可见,对象B始终不可见。

在开始时,A在B的前面。在旋转期间,在某个角度,B基于深度测试结果在A的前面,但由于B总是不可见的,B的部分应该用背景C填充

有谁知道解决此问题的简单方法?

模板测试是一种好方法吗?基本上用一种颜色设置对象B,比较B的颜色和背景C,并在测试失败时显示背景C.

有没有人有我能读的样本代码?

1 个答案:

答案 0 :(得分:2)

最简单的解决方案是:

  1. 画C;
  2. 使用颜色遮罩绘制B,防止写入帧缓冲区(但不要触摸深度掩码,以便仍然对深度缓冲区进行写入);
  3. 根据深度测试绘制A。
  4. 使用的具体内容是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);