【问题标题】:OpenGL How to use a invisible mask to hide objects behind itOpenGL如何使用不可见的蒙版隐藏其背后的对象
【发布时间】:2015-08-12 15:52:54
【问题描述】:

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

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

一开始A在B前面,在旋转过程中,根据深度测试结果,在一定角度,B在A前面,但是由于B总是不可见的,所以B的部分应该用背景C填充.

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

模板测试是个好方法吗?基本上给物体B设置了颜色,将B的颜色与背景C进行比较,测试失败时显示背景C。

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

【问题讨论】:

  • 只是为了澄清 C 始终是背景 - 如果 B 呈现在 A 上方,您希望显示 C,如果 A 呈现在 B 上方,您想看到 A?
  • 是的,你是对的。 C 始终是背景。
  • ...所以就像 B 是你在 A 上渲染的一个洞?
  • 我认为他只是想让 B+A 成为漏洞——如果只是 B 超过 C,那么你应该看到 B 吗?
  • 看不懂要求,如果B不重叠A会怎样?您是否希望仅在 A 前面的 B 部分显示背景而不是 B?

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


【解决方案1】:

最简单的解决方案是:

  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);

【讨论】:

  • 我将撤回这个答案,等待对问题的澄清。
  • 按要求取消删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多