OpenGL如何使用不可见遮罩隐藏其后面的对象

OpenGL如何使用不可见遮罩隐藏其后面的对象,opengl,opengl-es,depth,depth-buffer,stencils,Opengl,Opengl Es,Depth,Depth Buffer,Stencils,我有一个OpenGL问题要解决。我有一个对象/网格A、一个对象/网格B和一个背景纹理C 最初,帧缓冲区由背景纹理C填充。我们在帧缓冲区中绘制A和B。我们希望使对象A可见,而对象B始终不可见 开始时,A在B前面。在旋转过程中,根据深度测试结果,在一定角度下,B在A前面,但由于B始终不可见,B的部分应填充背景C 有人知道解决这个问题的简单方法吗 模板测试是一种好方法吗?基本上将对象B设置为a颜色,将B的颜色与背景C进行比较,并在测试失败时显示背景C 有人有我可以阅读的示例代码吗?最简单的解决方案是:

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

最初,帧缓冲区由背景纹理C填充。我们在帧缓冲区中绘制A和B。我们希望使对象A可见,而对象B始终不可见

开始时,A在B前面。在旋转过程中,根据深度测试结果,在一定角度下,B在A前面,但由于B始终不可见,B的部分应填充背景C

有人知道解决这个问题的简单方法吗

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


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

最简单的解决方案是:

  • 画C
  • 使用颜色遮罩绘制B,防止写入帧缓冲区(但不要触摸深度遮罩,以便仍对深度缓冲区进行写入)
  • 根据深度测试绘制A
  • 具体使用的是
    glColorMask
    -如果通过该通道为每个通道提供
    GL\u 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);
    

    只是为了澄清C始终是背景-如果B呈现在A上方,您希望显示C,如果A呈现在B上方,您希望看到A?是的,您是对的。C永远是背景。。。。这就像是你在a上画的一个洞?我想他只是想让B+a成为这个洞-如果它只是B/C,那么你应该看到B?我不明白要求,如果B不与a重叠会发生什么?你想只为A前面的B部分显示背景而不是B吗?我将撤回此答案,等待对问题的澄清。按要求取消删除。