弄乱了OpenGL深度缓冲区
Messed Up OpenGL Depth Buffer?
我目前使用代码有一些奇怪的事情。我正在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个分段故障。也许这将帮助某人试图弄清楚为什么提供的包含是导致我描述为我的问题的有趣结果。
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 从OpenGL应用程序中提取颜色/深度缓冲区
- 为什么为什么偏离gl_fragcoord.z偏离深度缓冲区
- DirectX-启用深度缓冲区后没有任何渲染
- OpenGL - 深度缓冲区在渲染半透明立方体时剪切掉不应该剪切的面
- C++深度缓冲区Oculus Rift DK2 VR HMD
- 多采样框架渲染对象和深度缓冲区
- GlReadPixel始终从深度缓冲区0中获取
- 有没有办法访问OpenGL的深度缓冲区
- Qopenglwidget和GlreadPixels和深度缓冲区
- 深度缓冲区的绝对距离
- 弄乱了OpenGL深度缓冲区
- OpenGL:只获取模具缓冲区而不获取深度缓冲区
- 使用帧缓冲区将深度缓冲区渲染到纹理中
- 是否可以在opengl中使用深度缓冲区渲染3D纹理
- Direct2D深度缓冲区
- OpenGL ES深度缓冲区渲染(iOS模拟器与真实设备)
- 深度缓冲区未正确渲染
- 将深度呈现缓冲区复制到深度缓冲区
- 为什么我们必须在渲染过程中清除 OpenGL 中的深度缓冲区