c++ - OpenGL 深度无法按预期工作

标签 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

最佳答案

当你看到 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/

相关文章:

c++ - 奇怪的段错误

opengl - Xamarin Android 播放器 : OpenGL server is unreachable

performance - OpenGL在渲染“虚拟画廊”(纹理)方面的性能

java - 如何绘制 Java 3D 切片形状或切片

c++ - 简单运动模拟中的段错误

C++11 的采用和兼容性策略?

opengl - 在片段着色器中根据地形高程数据计算法线

matlab - 沿曲线移动点(3D 动画图)

r - 获取RGL View 参数

c++ - 将 Unicode UTF-8 和 UTF-16 数据写入 QByteArray