【问题标题】:how to render framebuffer directly in opengl es2.0?如何在opengl es2.0中直接渲染帧缓冲区?
【发布时间】:2013-02-26 07:27:45
【问题描述】:

我想创建一个程序,使用自己制作的所有 fbo 进行渲染。我知道这样渲染的常见程序: 1.egl初始化。 2.程序使用。 3.输入纹理数据 4. 交换缓冲区。 ,但是当我把它改成fbo渲染时,发生了一些我不知道原因的事情。这是我添加的代码:

glGenFramebuffers(1,frame_buf);
    glBindFramebuffer(GL_FRAMEBUFFER, frame_buf);
    glGenRenderbuffers(1, &color_buf);
    glBindRenderbuffer(GL_RENDERBUFFER, s->color_buf);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, screen_width, screen_height);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, s->color_buf);

我想当我添加这个时,gl 将在我制作的绑定 fbo 中运行。但窗口中没有图像显示..

【问题讨论】:

    标签: opengl-es render framebuffer


    【解决方案1】:

    当然没有图像出现。一般来说,您必须渲染到默认帧缓冲区才能使其可见。这就是可见图像所在的位置:默认帧缓冲区。

    您可以对 FBO 进行中间渲染。但是您必须先将其 blit 或渲染到默认帧缓冲区,然后才能使用交换缓冲区调用。

    【讨论】:

    • 感谢您的回答,但据我所知,在 ios api 中,opengl 渲染的实现都使用 fbo,它绑定到渲染层以显示图像。所以我想知道是否有类似的方法使用egl api来做同样的事情..你能告诉我如何将fbo直接blit到默认fbo吗?
    【解决方案2】:

    如果您想直接呈现到屏幕上,请使用此代码而不是您使用的代码

    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, screen_width, screen_height);
    

    改变

    [eaglContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(id<EAGLDrawable>)eaglLayer];
    

    glRenderbufferStorage() 绘制到屏幕外

    如果您在 Android 中工作,请遵循此规则

    #ifdef IOS 
    

    glBindFramebuffer(GL_FRAMEBUFFER, s_FrameBuffer);

    #elif ANDROID 
    

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    #endif 
    

    【讨论】:

    • 我知道来自ios api,但我工作的环境是android...你的建议不起作用
    • 我没有提到。好的,在IOS&ANDROID之间设置FBO有点不同。
    • 我更新了我的答案,如果你想直接渲染不要使用 glRenderbufferStorage()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多