0

我的代码目前正在发生一些相当奇怪的事情。我在 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 值对完成的图像都没有影响。我无法弄清楚这一点。

4

2 回答 2

5

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

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

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

如果不支持给定的属性列表,这基本上会很奇怪。up 文件 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 位。在 PlayBook 上,32 会引发分段错误,尽管通常不支持 32。也许这会帮助那里的人试图弄清楚为什么提供的包含会导致我描述为我的问题的这个有趣的结果。

于 2012-11-15T06:02:00.197 回答
5

默认情况下,深度测试被禁用。您必须使用 glEnable(GL_DEPTH_TEST) 启用它。启用剔除时它起作用的原因是因为未绘制背面三角形,并且由于立方体是凸多面体,因此没有正面四边形与另一个正面四边形重叠。但是,如果您尝试渲染第二个立方体,您也会看到深度问题,除非您启用深度测试。

于 2012-11-13T05:42:19.463 回答