启用深度测试后,OpenGL ES 2.0对象消失

时间:2013-07-08 04:59:07

标签: c++ opengl-es-2.0 egl

修改:结果证明这是正确的,希望它仍可以帮助处理类似问题的其他人。

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

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

我缺少什么想法? (如果没有别的,我希望这总结了其他人已经遇到的一些问题。)

1 个答案:

答案 0 :(得分:0)

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