弄乱了OpenGL深度缓冲区

Messed Up OpenGL Depth Buffer?

本文关键字:缓冲区 深度 OpenGL 乱了      更新时间:2023-10-16

我目前使用代码有一些奇怪的事情。我正在Blackberry Playbook上运行此操作,它是OpenGL ES 1.1

编辑4:我删除了我发布的所有内容以简化我的问题。

我拿了代码并将其简化为绘制两个重叠的三角形。这是包含坐标的数组以及包含颜色的数组:

GLfloat vertices[] =
{
          // front
           175.0f, 200.0f, -24.0f,
           225.0f, 200.0f, -24.0f,
           225.0f, 250.0f, -24.0f,
          // back
           200.0f, 200.0f, -25.0f,
           250.0f, 200.0f, -25.0f,
           250.0f, 250.0f, -25.0f
};

static const GLfloat colors[] =
{
       /* front  */  1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f, //Red
       /* back  */  0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f //Green
};

请注意,我的坐标为x方向的0到1024,在y方向上为0至600,在z方向上为0至-10000。

这是我的设置代码,它反映了这一点:

    glClearDepthf(1.0f);
    glClearColor(1.0f,1.0f,1.0f,1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glShadeModel(GL_SMOOTH);
    glViewport(0, 0, surface_width, surface_height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(0, surface_width, 0, surface_height, 0, 10000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);

我试图排除应该在选择某个矩阵模式时应该使用它的可能性时,在两个地方具有深度。

最后是我的渲染代码:

void render()
{
    //Typical render pass
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(4, GL_FLOAT, 0, colors);
    glDrawArrays(GL_TRIANGLES, 0 , 6);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    //Use utility code to update the screen
    bbutil_swap();
}

问题在于,无论我做什么,绿色三角形总是覆盖在红色的三角形上。更改z值无论哪种方式都不会影响完成的图像。我无法弄清楚。

默认情况下,禁用深度测试。您必须使用glenable(gl_depth_test)启用它。当您启用淘汰时它可以正常工作的原因是因为没有绘制脸部三角形,并且由于立方体是凸多面体,因此没有前面的四边形会重叠另一个前面的四分之一。但是,如果您尝试渲染第二个立方体,则除非启用深度测试,否则您也会看到深度问题。

我终于使它起作用。问题是我使用的EGL设置代码。在bbutil.c(在我的情况下为.cpp)中有一些代码:

if(!eglChooseConfig(egl_disp, attrib_list, &egl_conf, 1, &num_configs)) {
        bbutil_terminate();
        return EXIT_FAILURE;
    }

(这不是文件中的所有代码,而是重要的位)

如果给定的属性列表是不支持的,则基本上会怪异。在文件attrib_list中较高的设置如下:

EGLint attrib_list[]= { EGL_RED_SIZE,        8,
                        EGL_GREEN_SIZE,      8,
                        EGL_BLUE_SIZE,       8,
                        EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,
                        EGL_RENDERABLE_TYPE, 0,
                        EGL_NONE};

没有指定深度缓冲区。现在,如果您在EGL规格中查看,则说没有默认值是没有深度的。宾果游戏,这就是问题所在。因此,我只是对它进行了修改,使其看起来像这样:

EGLint attrib_list[]= { EGL_RED_SIZE,        8,
                        EGL_GREEN_SIZE,      8,
                        EGL_BLUE_SIZE,       8,
                        EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,
                        EGL_RENDERABLE_TYPE, 0,
                        EGL_DEPTH_SIZE, 24,
                        EGL_NONE};

注意egl_depth_size和24.这将深度缓冲区设置为24位。在剧本32上,尽管通常不支持32个分段故障。也许这将帮助某人试图弄清楚为什么提供的包含是导致我描述为我的问题的有趣结果。