zoukankan      html  css  js  c++  java
  • Linux OpenGL 实践篇-10-framebuffer

      在之前的实践中我们都是在当前的窗口中渲染,即使用的缓存都是由glutCreateWindow时创建的缓存,我们可称之为默认缓存。它是唯一一个可以被图形服务器的显示系统识别的帧缓存,我们在屏幕上看到的只能是这个缓存。

      虽然我们可以对这个缓存作非常多的操作,应用不同的技术,但在不同的缓存间迁移大量的数据,我们还需要很多的操作,而帧缓存对象(framebuffer object)就是为此存在的。帧缓存可以实现理屏渲染技术、纹理贴图的更新、以及缓存乒乓技术(GPGPU用到的一种数据传输技术)的实现非常的有意义,但需要注意的是,应用程序创建的帧缓存是不能与窗口系统的缓存关联的,窗口系统有一套自己的缓存对象。

      下面我们将实现离屏渲染,并把渲染的结果拷贝回默认缓存显示。

    创建帧缓存

      创建缓存对象的过程和OpenGL创建其它对象的过程非常类似,使用glGenFramebuffers和glBindFramebuffer,同时使用glFramebufferParameteri设置帧缓存对象的参数。

           glGenFramebuffers(1,&fbo);
           glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);

    创建渲染缓存

      渲染缓存(renderbuffer)是OpenGL管理的一处高效的内存区域,它可以存储格式花的图像数据。渲染缓存的数据必须关联到帧缓存对象才有意义,并且要保证图像缓存的格式必须与OpenGL要求的渲染格式相符。

      创建渲染缓存和创建帧缓存的步骤类似,分别使用glGenRenderbuffers和glBindRenderbuffer,使用glRenderbufferStorage分配存储空间和设置图像格式。

            glGenRenderbuffers(1,&rbo);                                  
            glBindRenderbuffer(GL_RENDERBUFFER,rbo);
         glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA,width,height);
           glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,rbo); //把渲染缓存关联到帧缓存

    拷贝到默认缓存

      创建好帧缓存和默认缓存后,我们就可以开始绘制了,首先我们设置绘制的目标为我们创建的帧缓存,不再绘制到默认缓存中。

           glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);

      然后正常绘制场景,这个时候图像的数据都会存储到fbo的存储空间中。

      接着我们以这个帧缓存为源,以默认帧缓存为目标开始拷贝。

             //指定绘制到创建的帧缓存中
             glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
             glViewport(0,0,width,height);
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
             //渲染
             tShader->Use();
             glBindVertexArray(vao);
             glDrawArrays(GL_TRIANGLES,0,3);
                                                                                                    
             //指定缓存操作的源和目的
             glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo);
             glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
     
             glViewport(0,0,width,height);
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
             //拷贝
             glBlitFramebuffer(0,0,width,height,0,0,width,height,GL_COLOR_BUFFER_BIT,GL_NEAREST);
             glBlitFramebuffer(0,0,width,height,0,0,128,128,GL_COLOR_BUFFER_BIT,GL_NEAREST);
             glFlush();

      最终效果:

      

      

  • 相关阅读:
    HttpRunner接口自动化测试框架
    使用Appium 测试微信小程序和微信公众号方法
    WiFi无线连接真机进行Appium自动化测试方法
    idea tomcat 乱码问题的解决及相关设置
    解决idea导入maven项目缺少jar包的问题
    Docker php安装扩展步骤详解
    Python之No module named setuptools 安装pip
    MySQL中group_concat函数 --- 很有用的一个用来查询出所有group by 分组后所有 同组内的 内容
    Nginx如何来配置隐藏入口文件index.php(代码)
    vueThink框架搭建与填坑(new)
  • 原文地址:https://www.cnblogs.com/xin-lover/p/8977307.html
Copyright © 2011-2022 走看看