C++ 搞砸了OpenGL深度缓冲区?
我的代码现在有点奇怪。我在黑莓Playbook上运行这个,它是OpenGL ES 1.1 编辑4:我删除了我发布的所有内容,以简化我的问题 我把代码简化为画两个重叠的三角形。以下是包含坐标的数组以及包含颜色的数组: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
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);