OpenGL深度无法按预期工作

时间:2013-12-10 17:46:12

标签: c++ opengl 3d depth

我使用OpenGL在屏幕上绘制一些内容。

这是初始化:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 10, -10);
glMatrixMode(GL_MODELVIEW);

然后我用这个绘制对象:

void draw(...)
{
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBegin(GL_QUADS);  //Begining the cube's drawing
    {
        glTexCoord3f(tu1, tv1, 1);  glVertex3f(offset,      _y, _z);
        glTexCoord3f(tu2, tv1, 1);  glVertex3f(offset + w,  _y, _z);
        glTexCoord3f(tu2, tv2, 1);  glVertex3f(offset + w,  _y + h,  _z);
        glTexCoord3f(tu1, tv2, 1);  glVertex3f(offset,      _y + h,  _z);
    }
    glEnd();    
    glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
}

但深度不受尊重(使用大量_z值进行测试)。它随着呼叫的顺序而变化,越近将是最后绘制的。

如果我先画粉红色吧:

enter image description here

如果我在奶油条后绘制粉红色条:

enter image description here

2 个答案:

答案 0 :(得分:5)

当您看到画家的算法(最后一个对象出现在前面)时,这意味着您的深度缓冲区存在问题。在您的情况下,您需要启用深度测试和编写以及初始化(it's off by default):

glEnable(GL_DEPTH_TEST);

您还需要在每个帧的开头清除深度缓冲区(清除颜色缓冲区通常也是一个好主意):

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

看看OpenGL维基对depth buffering的评论。

答案 1 :(得分:-1)

请注意以下可能对您有帮助的项目: 1. OpenGL遵循右撇子规则。 2.如果您使用push和pop来处理矩阵,那么您推送的最后一个是在渲染时应用的第一个。