我使用 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
值测试)。随调用顺序不同,较近的最后抽出。
如果我先画粉色条:
如果我在奶油色条之后画粉色条:
最佳答案
当你看到 painter's algorithm(最后绘制的对象出现在前面)时,这意味着你的深度缓冲区有问题。在您的情况下,您需要在初始化(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/