C++ 搞砸了OpenGL深度缓冲区?

C++ 搞砸了OpenGL深度缓冲区?,c++,opengl-es,blackberry-playbook,C++,Opengl Es,Blackberry Playbook,我的代码现在有点奇怪。我在黑莓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

我的代码现在有点奇怪。我在黑莓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_深度_测试)启用它。启用消隐时,该选项起作用的原因是未绘制后向三角形,并且由于立方体是凸多面体,因此任何前向四边形都不会与另一个前向四边形重叠。但是,如果您尝试渲染第二个立方体,您也会看到深度问题,除非启用深度测试。

我终于让它工作了。问题在于我使用的EGL设置代码。在bbutil.c(在我的例子中是.cpp)中有一些代码:

if(!eglChooseConfig(egl_disp, attrib_list, &egl_conf, 1, &num_configs)) {
        bbutil_terminate();
        return EXIT_FAILURE;
    }
(这不是文件中的全部代码,而是重要的部分)

如果给定的属性列表不受支持,这基本上是反常的。文件属性列表中较高的位置设置如下:

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_深度_尺寸和24。这将深度缓冲区设置为24位。在PlayBook上,32抛出分段错误,尽管通常32不受支持。也许这会帮助其他人找出为什么提供的include会导致我描述为我的问题的有趣结果。

这段代码太大,无法满足您的要求。尽量减少它,同时保留问题的本质。代码只是为了以防万一。大多数只是三角形的顶点和颜色或注释掉。我的问题是,为什么有些颜色似乎被抛到深度缓冲区的前面,而不是它们应用到的面的实际位置。经过再三考虑,当我得到任何更简单的工作时,我将重新编辑此颜色。与您无关的问题:您在glDrawArrays命令后撤消翻译。您可以使用glPushMatrix和glPopMatrix命令临时更改矩阵,然后恢复旧状态。@kakTuZ通常是。但在他的情况下,他仍然在那里,所以这是不一样的(如果这是另一个问题),我应该说,我尝试了,没有任何成功,但这仍然是一个很好的答案。我很想知道窗口API给了我一个没有深度的缓冲区。可能吗?这是否足以在openGL中启用深度?glEnable(GLU深度试验);glDepthMask(GL_TRUE);