Android OpenGL ES Framebuffer对象-将深度缓冲区渲染为纹理 [英] Android OpenGL ES Framebuffer objects - rendering depth-buffer to texture

查看:556
本文介绍了Android OpenGL ES Framebuffer对象-将深度缓冲区渲染为纹理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using an Android device running Froyo supporting OpenGL ES 1.1 and OpenGL ES 2.0

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

I want to render the depth buffer to a texture. Having seen a number of examples for OpenGL, OpenGL ES on other platforms (including iPhone) I have tried a number of FBO configurations.

我似乎能够使用颜色纹理进行FBO设置,但是每次附加深度纹理都会失败.

I seem to be able to get an FBO set-up with a colour texture but every time I attach a depth texture it fails.

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

My current code is based on this example but creating a colour texture as well instead of setting draw and read buffers to none.

是否有一个简单的示例,可以在Android上配置OpenGL ES FBO来渲染纹理的深度?另外,是否有描述什么和不支持的文件?

Is there a simple example of configuring an OpenGL ES FBO on Android to render depth to a texture? Alternatively is there a document describing what is and is not supported?

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

Thanks for the comments - I specifically needed a solution for ES 1.1, if it could be found and work on Android. I also want to look at ES 2 - I am not sure I understand the idea of packing the depth information into colour buffer - do you have a reference I can look at to understand the idea better?

关于代码-我的来源与我上面发布的链接几乎没有什么不同.帧缓冲状态为未完成.

Regarding code - my source is barely different from the link I posted above. The Framebuffer status is that it is not complete.

感谢片段着色器的建议-我现在明白了.如果我无法使用其他解决方案,请看一下.我的理想是同时获取深度和颜色-如果可以的话,我真的不想单独渲染颜色和深度.

Thanks for the fragment shader suggestion - I get the idea now. Will look at that if I can't get another solution working. My ideal is to get depth and colour at the same time - don't really want to render colour and depth separately if I can help it.

推荐答案

好的,各种各样的答案.可以在具有OpenGL ES 2的Android 2.2上使用此功能

OK, an answer of sorts. Got this to work on Android 2.2 with OpenGL ES 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手册并按正确的顺序进行所有操作.

Pretty trivial really, follow the OpenGL ES2 manual and do everything in the right order.

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

Tried this with OpenGL ES 1.1, adding OES to the required function calls and _OES to the constants since frame buffer objects is an extension. Any attempt to attach a depth texture to the frame buffer results in an incomplete frame buffer object.

因此,目前我的结论是,这不适用于Android上的OpenGL ES 1.1,但显然适用于ES 2.2.

So at the moment my conclusion is that this doesn't work with OpenGL ES 1.1 on Android, but it clearly does work with ES 2.2.

如果有人对ES 1.1有解决方案,那么看到它会很有趣.

If anyone has a solution for ES 1.1 it would be interesting to see it.

这篇关于Android OpenGL ES Framebuffer对象-将深度缓冲区渲染为纹理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆