OpenGL 深度测试不起作用

Ami*_*mit 4 c++ opengl glut

我正在尝试使用 OpenGL 创建模型,并尝试启用深度测试。

我在我的中使用这些命令main

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)

这在我的显示中:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)

我什至尝试添加:

glDepthFunc(GL_LEQUAL);
Run Code Online (Sandbox Code Playgroud)

它不起作用。我仍然可以看到我认为是深度问题。这是显示问题的视频:https : //www.youtube.com/watch?v=OafrRH4Mzjc

  • 注意:在那个视频中,电路板是从右到左,从上到下构建的,所以第一个角度是可以的,但任何其他角度都是不好的。

我错过了什么?


编辑:复制的最小示例文件:

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)

gen*_*ult 6

gluPerspective(50, width / height, 0, 20);
                                   ^ wat
Run Code Online (Sandbox Code Playgroud)

zNear需要大于零(强调我的):

深度缓冲区精度受为zNear 和指定的值影响zFar。更大的比例zFarzNear,就越有效深度缓冲器将处于彼此接近的其它表面之间进行区分。

如果r = zFar / zNear大约log2(r) 丢失了一些深度缓冲区精度。由于rzNear 接近 0 时接近无穷大,因此zNear 绝不能设置为 0。


编辑:鉴于新发布的 MCVE:

int main(int argc, char **argv) {
    /* Creation of the window */
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(900, 600);
    glEnable(GL_DEPTH_TEST);  // too soon

    glutCreateWindow("Chess");
    ...
}
Run Code Online (Sandbox Code Playgroud)

就像datenwolf 说的那样glEnable()在拥有当前 GL 上下文之前,您正在ing(glutCreateWindow()创建上下文并使其成为当前上下文)。

在 之后gl*()之前不要调用任何函数。 glutCreateWindow()