【问题标题】:OpenGL ES 2.0 Objects disappearing when depth test enabled启用深度测试时,OpenGL ES 2.0 对象消失
【发布时间】:2013-07-08 04:59:07
【问题描述】:

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

在 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) 我有一个场景,但没有我想要的深度测试遮挡。

在着色器中,输出gl_Positionz 组件在视觉上按预期工作(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);
}

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

任何想法我错过了什么? (如果没有别的,我希望这能总结其他人遇到的一些问题)。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 它不会让我再过“2天”
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多