首页 > 解决方案 > 在 OpenGL 中混合 GL_ALWAYS 和 GL_LESS

问题描述

我有:

  1. 一组点
  2. 一组网格

我需要

  1. 根据深度以正确的 z 顺序绘制网格。为此我使用了glDepthFunc(GL_LESS)or glDepthFunc(GL_LEQUAL), orglEnable(GL_DEPTH_TEST)
  2. 要按绘图顺序渲染的点,忽略深度。为此,我使用了glDepthFunc(GL_ALWAYS), 或glDisable(GL_DEPTH_TEST). 它们是使用GL_POINTS和绘制的glVertex3d
  3. 要渲染的网格,就好像点在正确的深度中一样。

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

在此处输入图像描述

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

无论我尝试什么,它都会使网格要么在所有点的后面,要么在所有点的前面,无论每个对象的深度如何。我尝试的是绘制点,它可以根据需要工作,绘制网格并且它可以根据需要工作,但是当组合起来时,无论我先绘制点还是网格,它都不起作用。

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

标签: c++opengldepth-bufferstencil-buffer

解决方案


正如 Michael Nastenko 在评论中所说,您想要达到的效果需要绘制网格,然后关闭深度写入然后绘制“点”(深度测试仍然打开)。显然,在绘制下一帧之前,您必须重新打开深度写入。

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


推荐阅读