OpenGL:Quads似乎没有被正确淘汰

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL:Quads似乎没有被正确淘汰相关的知识,希望对你有一定的参考价值。

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

Scene

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

Scene rotated

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

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类只有3个双倍的x,y,z坐标。我将这些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);
答案

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

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

它们不是旗帜。你不能以这种方式使用它们。

另一答案

glEnable

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

void glEnable(GLenum cap);

cap指定表示GL功能的符号常量。

这意味着glEnable的参数是一个常数而不是一组位和qazxsw poi,qazxsw poi,qazxsw poi是符号constats而不是位集。

像这样更改你的代码:

GL_ALPHA_TEST

GL_DEPTH_TEST

17.3.4深度缓冲测试

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

GL_CULL_FACE

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

以上是关于OpenGL:Quads似乎没有被正确淘汰的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:GL_QUADS 不绘制正方形

OpenGL - 在加快 QUADS 渲染的道路上更进一步

创建 OpenGL 阴影

OpenGL没有将最近的片段绘制到相机

OpenGL 在 GL_QUADS 之上绘制 GL_LINES

openGL之API学习(一八零)POINTS LINES TRIANGLES QUADS 绘图顺序规则