OpenGL:四边形似乎没有正确剔除

Posted

技术标签:

【中文标题】OpenGL:四边形似乎没有正确剔除【英文标题】:OpenGL: Quads seemingly not culled properly 【发布时间】:2018-01-03 05:43:26 【问题描述】:

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

问题是,蓝色的形状比红色的低,但不知何故会渗出。当我像下面这样旋转它时它看起来很合适:

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

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 个双精度值。我将这些 Vec3 类添加到向量中,并在我想绘制时遍历它们,如下所示:

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

【问题讨论】:

【参考方案1】:

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

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

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

【讨论】:

【参考方案2】:

glEnable:

glEnable — 启用或禁用服务器端 GL 功能

void glEnable(GLenum cap);

cap 指定一个表示 GL 能力的符号常量。

这意味着glEnable 的参数是一个常量,而不是一组位,GL_ALPHA_TESTGL_DEPTH_TESTGL_CULL_FACE 是符号常量,而不是位组的位。

像这样更改您的代码:

glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

见OpenGL Specifiction - 17.3.4 Depth Buffer Test, p. 500:

17.3.4 深度缓冲测试

如果深度比较失败,深度缓冲区测试会丢弃传入的片段。通过使用目标 DEPTH_TEST 的通用 Enable 和 Disable 命令启用或禁用比较。​​

见OpenGL Specifiction - 14.6.1 Basic Polygon Rasterization, p. 473:

通过使用目标 CULL_FACE 调用 Enable 或 Disable 来启用或禁用剔除。

【讨论】:

以上是关于OpenGL:四边形似乎没有正确剔除的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅介绍一下OpenGL ES的 光栅化 : 剔除多边形偏移

OpenGL 3.3 2D 渲染:VAO 配置不正确?

openGL中不正确的遮挡,正面剔除

片段着色器中未使用纹理数据 - OpenGL

使用 OpenGL 3.3 进行实例化似乎很慢

ffmpeg 视频到 opengl 纹理