在 OpenGl 中混合 GL_ALWAYS 和 GL_LESS

Mixing GL_ALWAYS with GL_LESS in OpenGl

我有:

  1. 一组点
  2. 一组网格

我需要

  1. 要根据深度以正确的 z 顺序绘制的网格。为此,我使用了 glDepthFunc(GL_LESS)glDepthFunc(GL_LEQUAL),或 glEnable(GL_DEPTH_TEST)
  2. 按绘制顺序渲染的点,忽略深度。为此,我使用了 glDepthFunc(GL_ALWAYS)glDisable(GL_DEPTH_TEST)。它们是使用 GL_POINTSglVertex3d
  3. 绘制的
  4. 要渲染的网格就像点在正确的深度。

图当考虑深度时,图 1 显示了点(平方)与网格的对比。图 2 显示了忽略深度渲染点时的外观(因此无论深度如何,红点都出现在蓝点的顶部),但无论深度如何,网格始终位于点的后面。我希望网格与点的关系与图 1 中的相同,但点之间的关系与图 2 中的相同。

我意识到我会进入两个点之间的网格之类的东西,但是深度较大的点呈现在深度较低的点之上,但在这种情况下,如果对于点更近的渲染在顶部。

无论我尝试什么,它都会使网格要么在所有点之后,要么在所有点之前,无论每个对象的深度如何。我试过的是画点,它按需要工作,画网格按需要工作,但是当组合时,它不起作用,无论我先画点还是先画网格。

问:这可能吗?如果可以,我该怎么做?

正如Michael Nastenko在评论中所说,你想要达到的效果需要绘制网格,然后转depth writing off,然后绘制"points"(深度test 还在)。显然,在绘制下一帧之前,您必须重新打开深度写入。

通过关闭深度写入(使用 glDepthMask(GL_FALSE)),您可以确保 "points" 不会将它们的深度写入深度缓冲区。因此,在您开始绘制 "points" 之前,每个 "point" 仅针对场景的深度进行测试。如果两个 "points" 重叠,则它们将按渲染顺序绘制。