理论

OpenGLl离线渲染就是通过OpenGL将绘制结果渲染到显存中的一张图片上,通过gl接口函数可以从显存读取到内存中。基于OpenGL的离线渲染机制,可以快速实现一个渲染器:

输入:图像,点,线。。。

输出:图像

实现方案

从一般到特殊:

1. 不支持FBO

主要介绍PC上,移动设备如果不支持FBO要实现离线渲染那就实在没辙了。

glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); 设置读写时后缓存区。 一般pc都支持双缓冲机制,如果没有GL_BACK就没辙了。

glDrawPixels 更新颜色缓冲区。

调用opengl绘制函数在GL_BACK绘制。

完成后glReadPixels将颜色缓冲区以从显存调入内存。 该函数会导致gpu阻塞,效率不高。

2. PC支持FBO

opengl支持多种缓冲区对象:

缓冲区对象说白了就是 显存中一块缓存区。OpenGL是业界渲染标准,具体接口功能由显卡驱动实现,OpenGL客户端是使用OpeGL的应用程序,OpenGL服务器可以理解成GPU,如果没有GPU就是OS内核中的一个模块,缓冲区对象定义在服务器端,减少客户端每次渲染时数据传输开销。每个缓冲区对象有唯一的ID,类似handle概念,客户端通过BufferId管理缓冲区对象。

1)纹理对象,最常见的从gl1.0就开始支持,基本操作指令:glGenTextures, glBindTextures, glDeleteTextures,后续有多重纹理增加新的指令。

服务器端的纹理数据,客户端只有写权限:glTexSubImage2D函数局部或者全部更新纹理缓冲区内容。

2)VBO(vertex buffer object)和PBO(pixel buffer object) 原理完全一样使用相同的gl指令:glGenBuffers,glBindBuffers,glDeleteBuffers。。。

只不过buffer中存的数据内容不一致,前者存顶点后者存像素。VBO的出现 顶点列表逐渐淡出了人们的视野。

服务器端的VBO,PBO,客户端有读写权限:glMapBuffer 将服务器端内存地址映射为客户端地址,操作完成调用glUnMapBuffer;或者直接通过glBufferSubData 更新数据。

3)VBO后又出现VAO(vertex array buffer),VAO的是GL3.0出来的东东,有点高处不甚寒 考虑移动设备 考虑Android行情木有研究。

4)RBO(render buffer object),rbo并不能单独使用,必须配合fbo,与opengl缓冲区对应,RBO可以存放颜色、深度、模板数据。指令集合:glGenRenderbuffers,glBindRenderbuffer,glDeleteRenderbuffers。

5)FBO(frame buffer object) 有一套专门的指令集合:glGenFramebuffers, glBindFramebuffer, glDeleteFramebuffers.。

FBO创建以后必须绑定缓冲区:颜色、深度必须,模板缓冲区看需求而定。

缓冲区对象并不局限于RBO,纹理对象也可以充当缓冲区对象:创建纹理是glTexImage2D最后一个参数为NULL,在显存中只需要创建纹理对象,而并不需要传纹理数据。

采用RBO的例子:

具体下载目录在 /2014年资料/3月/25日/OpenGL离线渲染和缓冲区对象

回到主题,通过fbo实现离线渲染流程如下:

主渲染流程,使用系统默认的缓冲区对象

保存OpenGL现场

—————————>> bind FBO

a) glClear 清空FBO对应的各种缓冲区内容

b) 在离线渲染之前,往颜色缓冲区中添加内容,如背景图片

c) set projectionMatrix

d) set modelviewMatrix

e) all draw calls // draw some stuff

f) glReadPixels // 如果需要,渲染结果图片从显存调入内存,在后续主渲染流程中创建纹理对象使用。

glCopyTexImage2D使用帧缓冲区的数据定义纹理单元,像素直接从颜色缓冲区读取,功能类似glCopyPixels

如果颜色缓冲区采用 纹理对象,后续在主渲染流程中 可以直接使用该纹理进行绘制

<

回到主渲染流程

3. Mobile 上离线渲染

移动设备,明显特点是受限,gles是opengl的缩减版,gles没有glDrawBuffer和glReadBuffer接口,没法直接操纵前后缓冲区,所以方案1失效 只能转向FBO。

gles1.1开始支持FBO,gl变量和指令加OES后缀。

手机上fbo离线渲染流程跟PC上基本类似,在此主要说两点主要差别:

1)关于离线渲染的步骤b,pc上最常见的做法glDrawPixels直接往颜色缓冲区拷贝数据,但是gles不支持glDrawPixels。

想到的第一种替代方案:正交投影模式下直接drawTextureQuad,走OpenGL标准流水线:纹理对象创建、数据传输,顶点传输、几何变换流程,光栅化、纹理坐标寻址取纹理单元,最终通过缓冲区各种测试将结果写到颜色缓冲区中。

优化后的方案:纹理对象作为FBO的颜色缓冲区,可以通过glTexSubImage2D函数直接将图像数据更新到颜色缓冲区中,全部或者局部,功能跟glDrawPixels完全一致,避免走OpenGL流水线。

2)在手机上效率优先,建议不要直接使用glReadPixels函数,可以参考ogl_fbo_pbo_readback示例。

openg离线包_OpenGL离线渲染和缓冲区对象相关推荐

  1. OPenGL中的缓冲区对象

    引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...

  2. 如何正确选择集体渲染(云渲染)和gpu离线渲染

    在数字娱乐领域,渲染是制作高质量影像的关键步骤之一.随着技术的不断发展和应用的广泛普及,渲染方式也在不断演进.目前,集体渲染(云渲染)和GPU离线渲染是两种比较流行的渲染方式.那么,哪种方式会更快呢? ...

  3. Renderbus瑞云渲染正式支持UE云渲染!离线渲染+实时渲染=渲染起飞!

    2022年已经到了尾声,回顾今年CG圈里最具讨论性的话题,除了AI绘图,就是虚幻引擎了,这两者如同一股风潮,从概念创意到后期制作,一路以"席卷"之势影响到了视觉领域的各个行业. R ...

  4. OpenGL ES之离屏渲染的帧缓冲区对象FBO的说明和使用

    一.什么是 FBO ? FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO). FBO 本身不能用于渲染,只有添加 ...

  5. ue4 离线渲染_[译]Real Shading in Unreal Engine 4(UE4中的真实渲染)(2)

    利用假期接着把剩下的部分搞完吧,其实,纯粹的翻译应该还是比较简单的,但是,为了更好地理解,我一般都会多找一些资料来进行互相印证.在上面一部分Shader Model的改变过程中,我主要是参考了一些PB ...

  6. 实时渲染、离线渲染、实时云渲染、混合渲染是什么?

    渲染,就是将 3D 模型转换成 2D 图像,并最终呈现在屏幕上的过程.虽然这里只有一句话,但是这一句话里面包含了太多的数学.物理和计算机方面的知识,它描述了我们用计算机来虚拟化真实世界的基本逻辑.渲染 ...

  7. 干货:实时渲染和离线渲染的区别?实时云渲染又是什么?

    常见的渲染类型有以下几种:实时渲染.离线渲染.实时云渲染.混合渲染.那么什么是实时渲染?实时渲染和离线渲染有哪些区别?各自有哪些典型应用场景...... 有没有人感觉知道了,但又没完全知道? 今天小编 ...

  8. 【vim离线升级---vim 缓冲区错误漏洞】

    [vim离线升级---vim 缓冲区错误漏洞]

  9. UE离线渲染X云上制作!助力王者荣耀盾山梦圆「繁星」

    11月1日,王者荣耀携手中国航天ASES推出盾山航天主题新皮肤「盾山·梦圆繁星」.角色整体颜色设计源自中国航天的色彩体系,造型上十分巧妙地将卫星.太阳能电池板等空间站元素与盾山的巨盾相结合,还原空间站 ...

  10. 红宝书阅读笔记——缓冲区对象

    前面的顶点数组使得几何图元的显示方便了很多,但是如果每次都要向OPENGL发送一大块数据,而这数据其实并没有修改过,那么这传输就是冗余的.所以这里添加了缓冲区对象,将顶点数组存储在服务器端的缓冲区对象 ...

最新文章

  1. c#竖直射线法判断点是否再多边形里面
  2. 任务和特权级保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记34
  3. xamarin android pdf,Xamarin.Android - 下载pdf和视频到应用空间并打开
  4. 微服务架构下的安全认证与鉴权
  5. latex中bibtex中引用会议和期刊论文时的写法及规则
  6. java 运行时路径_如何在运行时检查当前Java类路径(重复)
  7. C语言: ---windows下VS Debug调试
  8. 西安后宰门小学_重磅!西安市教育局召开发布会,将有大动作!
  9. Kafka 消息序列化反序列化
  10. 高质量程序设计指南c++/c语言(30)--引用
  11. html源码蔡,html基础代码详解
  12. 840万应届生创历史新高,企业大规模缩招,互联网行业首次出现需求负增长
  13. 记HTML5 a 标签的一个小坑 1
  14. 响应式微服务架构-分布式系统设计原则
  15. CentOS 6.5编译安装MySQL5.7.7rc
  16. RHEL网络设置,来自于hyper-v中的虚拟机
  17. 数字基带信号功率谱理论研究和实验仿真【含有MATLAB仿真实验以及实验报告】
  18. ubantu 终端屏幕查找字符串
  19. 孤尽班第四天--数据模型设计总结
  20. 工程数学(经常用到的工程数学知识进行整理)

热门文章

  1. wgs84转cgcs2000 java_CGCS2000坐标系与WGS84的相互投影转换
  2. 微信小程序python选择题_微信小程序头脑风暴2答题辅助
  3. pdf用什么软件打开编辑最简单
  4. linux 流程图软件有哪些,除了visio,流程图软件还有哪些?
  5. 小瞥linux下UML工具
  6. 微信文章编辑的html在哪里,微信公众号的文章编辑界面在哪里?怎么编辑排版? | 微信公众号指南...
  7. 软考中级网络工程师学习笔记(知识点汇总)详细版本
  8. Servlet容器与Servlet的关系
  9. 如何选择适合的大数据分析软件
  10. 干货| 机器学习模型与算法最全分类汇总!