我建立了一个简单的场景,如下所示:

c++ - OpenGL:Quads似乎未正确剔除-LMLPHP

问题是,蓝色的形状要比红色的形状要小,但会以某种方式渗出。当我按如下所示旋转它时,它看起来很合适:

c++ - OpenGL:Quads似乎未正确剔除-LMLPHP

根据我的搜索,这可能与发送顶点的顺序有关,这是我对这些顶点的定义:

Shape* Obj1 = new Quad(Vec3(-5.0, 5.0, 0.0), Vec3(5.0, 5.0, 0.0), Vec3(5.0, 5.0, -10.0), Vec3(-5.0, 5.0, -10.0));
Shape* Obj2 = new Quad(Vec3(-5.0, 3.0, 0.0), Vec3(5.0, 3.0, 0.0), Vec3(5.0, 3.0, -10.0), Vec3(-5.0, 3.0, -10.0));

Vec3类仅对x,y,z坐标保留3个 double 值。我将这些Vec3类添加到 vector 中,并在想要绘制时对其进行遍历,如下所示:
glBegin(GL_QUADS);
    for (auto it = vertex_list.begin(); it != vertex_list.end(); ++it)
        glVertex3d(it->get_x(), it->get_y(), it->get_z());
glEnd();

最后,我的设置:
glEnable(GL_ALPHA_TEST | GL_DEPTH_TEST | GL_CULL_FACE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glAlphaFunc(GL_GREATER, 0.0f);
glViewport(0, 0, WINDOW_X, WINDOW_Y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0f, 300.0);
// camera origin xyz, point to look at xyz, camera rot xyz
gluLookAt(10, 10, -20, 2.5, 2.5, -10, 0, 1, 0);

最佳答案

您应该分别启用深度测试,面部剔除和Alpha测试。

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

它们不是标志。您不能以这种方式使用它们。

10-08 11:57