0

编辑:事实证明这是正确的,希望它仍然可以帮助其他有类似问题的人。

在 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);
}

正如预期的那样,所有物体都是纯绿色的阴影,越近越暗,越远越亮。可悲的是,一些更远(更亮)的物体被绘制在更近(更暗)的物体上。

有什么我想念的想法吗?(如果没有别的,我希望这总结了其他人一直存在的一些问题)。

4

1 回答 1

0

看来我没有遗漏任何东西。我有一个流氓多边形(在不同的着色器程序中),当启用深度时,它会遮挡所有东西。以上是正确的设置。

于 2013-07-08T05:23:38.820 回答