在 OpenGl 中混合 GL_ALWAYS 和 GL_LESS
Mixing GL_ALWAYS with GL_LESS in OpenGl
我有:
- 一组点
- 一组网格
我需要
- 要根据深度以正确的 z 顺序绘制的网格。为此,我使用了
glDepthFunc(GL_LESS)
或 glDepthFunc(GL_LEQUAL)
,或 glEnable(GL_DEPTH_TEST)
- 按绘制顺序渲染的点,忽略深度。为此,我使用了
glDepthFunc(GL_ALWAYS)
或 glDisable(GL_DEPTH_TEST)
。它们是使用 GL_POINTS
和 glVertex3d
绘制的
- 要渲染的网格就像点在正确的深度。
图当考虑深度时,图 1 显示了点(平方)与网格的对比。图 2 显示了忽略深度渲染点时的外观(因此无论深度如何,红点都出现在蓝点的顶部),但无论深度如何,网格始终位于点的后面。我希望网格与点的关系与图 1 中的相同,但点之间的关系与图 2 中的相同。
我意识到我会进入两个点之间的网格之类的东西,但是深度较大的点呈现在深度较低的点之上,但在这种情况下,如果对于点更近的渲染在顶部。
无论我尝试什么,它都会使网格要么在所有点之后,要么在所有点之前,无论每个对象的深度如何。我试过的是画点,它按需要工作,画网格按需要工作,但是当组合时,它不起作用,无论我先画点还是先画网格。
问:这可能吗?如果可以,我该怎么做?
正如Michael Nastenko在评论中所说,你想要达到的效果需要绘制网格,然后转depth writing off,然后绘制"points"(深度test 还在)。显然,在绘制下一帧之前,您必须重新打开深度写入。
通过关闭深度写入(使用 glDepthMask(GL_FALSE)
),您可以确保 "points" 不会将它们的深度写入深度缓冲区。因此,在您开始绘制 "points" 之前,每个 "point" 仅针对场景的深度进行测试。如果两个 "points" 重叠,则它们将按渲染顺序绘制。
我有:
- 一组点
- 一组网格
我需要
- 要根据深度以正确的 z 顺序绘制的网格。为此,我使用了
glDepthFunc(GL_LESS)
或glDepthFunc(GL_LEQUAL)
,或glEnable(GL_DEPTH_TEST)
- 按绘制顺序渲染的点,忽略深度。为此,我使用了
glDepthFunc(GL_ALWAYS)
或glDisable(GL_DEPTH_TEST)
。它们是使用GL_POINTS
和glVertex3d
绘制的
- 要渲染的网格就像点在正确的深度。
图当考虑深度时,图 1 显示了点(平方)与网格的对比。图 2 显示了忽略深度渲染点时的外观(因此无论深度如何,红点都出现在蓝点的顶部),但无论深度如何,网格始终位于点的后面。我希望网格与点的关系与图 1 中的相同,但点之间的关系与图 2 中的相同。
我意识到我会进入两个点之间的网格之类的东西,但是深度较大的点呈现在深度较低的点之上,但在这种情况下,如果对于点更近的渲染在顶部。
无论我尝试什么,它都会使网格要么在所有点之后,要么在所有点之前,无论每个对象的深度如何。我试过的是画点,它按需要工作,画网格按需要工作,但是当组合时,它不起作用,无论我先画点还是先画网格。
问:这可能吗?如果可以,我该怎么做?
正如Michael Nastenko在评论中所说,你想要达到的效果需要绘制网格,然后转depth writing off,然后绘制"points"(深度test 还在)。显然,在绘制下一帧之前,您必须重新打开深度写入。
通过关闭深度写入(使用 glDepthMask(GL_FALSE)
),您可以确保 "points" 不会将它们的深度写入深度缓冲区。因此,在您开始绘制 "points" 之前,每个 "point" 仅针对场景的深度进行测试。如果两个 "points" 重叠,则它们将按渲染顺序绘制。