glDisable(GL_DEPTH_TEST) makes nothing but Sky-Sphere Render

glDisable(GL_DEPTH_TEST) makes nothing but Sky-Sphere Render

本文关键字:but nothing Sky-Sphere Render makes TEST GL DEPTH glDisable      更新时间:2023-10-16

编辑:在场景中所有其他对象之前渲染天空盒解决了这个问题。

我在这里看到了这个问题,但添加

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

似乎没有帮助。

我正在尝试为我的场景渲染一个球形天空盒,出于某种原因,当我在这样做之前禁用深度测试时,天空盒是唯一渲染的东西。

[Render other objects..]
// Disable depth test & mask, faceculling
glDisable(GL_DEPTH_TEST); // Adding this makes everything else invisible
glDepthMask(GL_FALSE);
glCullFace(GL_FRONT);
[Render texture onto inside of sphere..]
// Re-enable faceculling, & depth
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glCullFace(GL_BACK);

知道为什么会发生这种情况吗?

我不确定要包含什么代码来保持清晰,所以不要犹豫,要求更多。

只是为了让你知道,这个:

glDisable(GL_DEPTH_TEST);

禁用深度测试和写入,因此您不需要两者并将深度掩码设置为 GL_FALSE。

默认情况下,当您清除每一帧的深度缓冲区时,它应该清除最大值,可能是 1.0。默认情况下,深度函数GL_LESS表示从片段着色器中产生的任何深度值都小于深度缓冲区中的深度值传递并写入帧缓冲区。

在我看来,您正在做的是将深度缓冲区清除到 1.0,禁用深度测试和写入,绘制对象,然后启用深度测试以及写入和绘制天空盒。这样做的问题是,对象的绘制不会向深度缓冲区写入任何内容,因此当需要绘制天空盒(启用深度测试)时,缓冲区中的所有像素深度值都是 1.0(因为您从未向其写入任何内容),并且因为深度函数GL_LESS您绘制的天空盒的每个像素都通过了深度测试并写入帧缓冲区。

如果特别需要始终在天空盒前面绘制对象,例如天空盒跟随摄像机位置,则:

1) 禁用深度写入。

2)绘制天空盒。

3) 启用深度写入。

4)绘制对象。

嗯,是的。这就是深度测试的目的。没有它,就没有什么可以向OpenGL表明天空盒不应该渲染在其他一切之上。

如果您不希望发生这种情况,请不要禁用深度测试...或者在其他所有内容之前绘制天空盒,而不是之后。