我使用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值进行了测试)。它随调用顺序而变化,最接近的是最后绘制的。

如果我先画粉色条:



如果我在奶油条后画出粉红色条:

最佳答案

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

glEnable(GL_DEPTH_TEST);


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

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


看一下OpenGL Wiki关于depth buffering的说法。

关于c++ - OpenGL深度无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20501602/

10-12 14:28
查看更多