15

我正在使用运行支持 OpenGL ES 1.1 和 OpenGL ES 2.0 的 Froyo 的 Android 设备

我想将深度缓冲区渲染为纹理。看过许多其他平台(包括 iPhone)上的 OpenGL、OpenGL ES 示例后,我尝试了许多 FBO 配置。

我似乎能够获得带有颜色纹理的 FBO 设置,但每次我附加深度纹理时它都会失败。

我当前的代码基于此示例,但也创建了颜色纹理,而不是将绘制和读取缓冲区设置为无。

是否有在 Android 上配置 OpenGL ES FBO 以将深度渲染到纹理的简单示例?或者是否有描述支持和不支持的文档?


感谢您的评论 - 我特别需要 ES 1.1 的解决方案,如果它可以在 Android 上找到并运行。我还想看看 ES 2 - 我不确定我是否理解将深度信息打包到颜色缓冲区中的想法 - 你有没有参考资料可以让我更好地理解这个想法?

关于代码 - 我的来源与我上面发布的链接几乎没有不同。Framebuffer 状态为未完成。


感谢片段着色器的建议——我现在明白了。如果我无法获得另一个解决方案,我会看看。我的理想是同时获得深度和颜色——如果我能提供帮助,我真的不想单独渲染颜色和深度。

4

2 回答 2

17

好的,一个答案。让它在带有 OpenGL ES 2 的 Android 2.2 上工作:

    // Create a frame buffer
    glGenFramebuffers( 1, &(frame_buffer ) );

    // Generate a texture to hold the colour buffer
    glGenTextures(1, &(colour_texture) );
    glBindTexture(GL_TEXTURE_2D, colour_texture);
    // Width and height do not have to be a power of two
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
            pixelWidth, pixelHeight,
            0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    // Probably just paranoia
    glBindTexture(GL_TEXTURE_2D, 0);

    // Create a texture to hold the depth buffer
    glGenTextures(1, &(depth_texture) );
    glBindTexture(GL_TEXTURE_2D, depth_texture);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
            pixelWidth, pixelHeight,
            0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glBindTexture(GL_TEXTURE_2D, 0);        

    glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer);

    // Associate the textures with the FBO.

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                    GL_TEXTURE_2D, colour_texture, 0);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                    GL_TEXTURE_2D, depth_texture, 0);

    // Check FBO status.    
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

    if ( status == GL_FRAMEBUFFER_COMPLETE )
    {
        // Success
    }

真的很简单,遵循 OpenGL ES2 手册并按照正确的顺序做所有事情。

使用 OpenGL ES 1.1 进行了尝试,将 OES 添加到所需的函数调用中,并将 _OES 添加到常量中,因为帧缓冲区对象是一个扩展。任何将深度纹理附加到帧缓冲区的尝试都会导致帧缓冲区对象不完整。

所以目前我的结论是,这不适用于 Android 上的 OpenGL ES 1.1,但它显然适用于 ES 2.2。

如果有人有 ES 1.1 的解决方案,看到它会很有趣。

于 2010-11-26T15:27:51.210 回答
0

许多设备不支持渲染到深度纹理。您需要为深度缓冲区附加渲染缓冲区。

于 2012-04-13T22:08:53.710 回答