编辑:事实证明这是正确的,希望它仍然可以帮助其他有类似问题的人。
在 OpenGL ES 2.0(使用 EGL)中设置深度测试管道时,我是否遗漏了一部分?
我发现了很多关于此的问题,但所有问题都通过在上下文初始化时正确设置深度缓冲区来解决:
EGLint egl_attributes[] = {
...
EGL_DEPTH_SIZE, 16,
...
EGL_NONE };
if (!eglChooseConfig(
m_eglDisplay, egl_attributes, &m_eglConfig, 1, &numConfigs)) {
cerr << "Failed to set EGL configuration" << endl;
return EGL_FALSE;
}
或者通过正确启用和清除深度缓冲区,并在上下文初始化后这样做:
// Set the viewport
glViewport(0, 0, m_display->width(), m_display->height());
// Enable culling and depth testing
glEnable(GL_CULL_FACE);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
// Clear the color and depth buffers
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepthf(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Draw elements
m_Program->drawAll();
注释掉glEnable(GL_DEPTH_TEST)
我有一个场景,但没有我想要的深度测试遮挡。
在着色器中,输出视觉上的z
组件gl_Position
按预期工作(z
值在 [0, 1] 范围内):
// Vertex Shader
uniform mat4 u_matrix;
attribute vec4 a_position;
varying float v_depth;
void main() {
vec4 v_position = u_matrix * a_position;
v_depth = v_position.z / v_position.w;
gl_Position = v_position;
}
// Fragment shader
varying float v_depth;
void main() {
gl_FragColor = vec4((v_depth < 0.0) ? 1.0 : 0.0,
v_depth,
(v_depth > 1.0) ? 1.0 : 0.0,
1.0);
}
正如预期的那样,所有物体都是纯绿色的阴影,越近越暗,越远越亮。可悲的是,一些更远(更亮)的物体被绘制在更近(更暗)的物体上。
有什么我想念的想法吗?(如果没有别的,我希望这总结了其他人一直存在的一些问题)。