glDisable(GL_DEPTH_TEST)只做Sky-Sphere Render

时间:2018-03-08 00:10:55

标签: c++ opengl

编辑:在场景中的所有其他对象之前渲染天空盒可修复此问题。

我看到问题here但是添加了

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

似乎没有帮助。

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

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

知道为什么会这样吗?

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

2 个答案:

答案 0 :(得分:1)

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

glDisable(GL_DEPTH_TEST);

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

默认情况下,当每个帧清除深度缓冲区时,它应该清除它的最大值,可能是1.0。默认情况下,深度函数为GL_LESS,这意味着片段着色器中出现的任何深度值都小于深度缓冲区中的深度值并被写入帧缓冲区。

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

如果特别需要让您的对象始终在天空盒前面绘制,例如天空盒跟随相机位置,那么:

1)禁用深度书写。

2)画出天空盒。

3)启用深度书写。

4)画出你的物体。

答案 1 :(得分:0)

嗯,是的。这就是深度测试的目的。没有它,没有任何东西可以向OpenGL表明天空盒不应该在其他所有东西上呈现。

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