• 离屏渲染 &FBO


    什么是FrameBuffer?

    用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在内存。
    ColorBuffer+DeptBuffer+StencilBuffer=帧缓冲什么是FBO?
    ⼀个 frameBuffer 对象(通常被称为⼀个FBO)。是一个收集颜色、深度和模板缓存区的附着点。描述属性的状态,例如颜⾊、深度和模板缓存区的大小和格式,都关联到FBO(Frame Buffer Object), FBO 什么的有什么作用?离屏渲染、延迟渲染基于FBO去做。
    深度附着点+颜色附着点+模板附着点=FBO

    为什么要有FrameBuffer与FBO?

    1. FrameBuffer(帧缓冲),只是一块内存区域,它并不能标识内存中的哪一块是颜色,哪一块是深度,哪一块是模板。
    2. FBO提供的附着点可以让 ColorBuffer+DepthBuffer+StencilBuffer能够对应到FrameBuffer的内存(我理解的是应该是告诉FrameBuffer,这些buffer的地址)。
    3. 一个FBO就对应一块内存(FrameBuffer)。

    FBO就像是一个仓库管理者,管理着FrameBuffer仓库(内存),一个个名叫ColorBuffer、DeptBuffer、StencilBuffer的货物运来,FBO给他们提供对应的卸货点(附着点),接收后就被FBO收录在册,FBO就拥有了管理这些货物能力。

    在OpenGL渲染管线中,几何数据和纹理经过多次转化和多次测试,最后以二维像素的形式显示在屏幕上。OpenGL管线的最终渲染目的地被称作帧缓存(framebuffer)。帧缓冲是一些二维数组和OpenG所使用的存储区的集合:颜色缓存、深度缓存、模板缓存和累计缓存。

    有两种类型的“帧缓存关联图像”:纹理图像(texture images)渲染缓存图像(renderbuffer images)。如果纹理对象的图像数据关联到帧缓存,OpenGL执行的是“渲染到纹理”(render to texture)操作。如果渲染缓存的图像数据关联到帧缓存,OpenGL执行的是离线渲染(offscreen rendering)。
    在这里插入图片描述

    上图显示帧缓存对象、纹理对象和渲染缓存对象之间的联系。多多个纹理对象或者渲染缓存对象能够通过关联点关联到一个帧缓存对象上。

    GPU渲染机制:

    CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。

    GPU屏幕渲染有以下两种方式:
    1)On-Screen Rendering
    意为当前屏幕渲染,指的是 GPU 的渲染操作是在当前用于显示的屏幕缓冲区中进行。
    2)Off-Screen Rendering

    意为离屏渲染,指的是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

    特殊的离屏渲染:如果将不在GPU的当前屏幕缓冲区中进行的渲染都称为离屏渲染,那么就还有另一种特殊的“离屏渲染”方式: CPU渲染。如果我们重写了drawRect方法,并且使用任何Core Graphics的技术进行了绘制操作,就涉及到了CPU渲染。整个渲染过程由CPU在App内 同步地完成,渲染得到的bitmap最后再交由GPU用于显示.

    离屏渲染的触发方式
    设置了以下属性时,都会触发离屏绘制:

    • shouldRasterize(光栅化)
    • masks(遮罩)
    • shadows(阴影)
    • edge antialiasing(抗锯齿)
    • group opacity(不透明)
    • 复杂形状设置圆角等
    • 渐变

    其中shouldRasterize(光栅化)是比较特别的一种:**光栅化概念:将图转化为一个个栅格组成的图象。光栅化特点:每个元素对应帧缓冲区中的一像素。
    shouldRasterize = YES在其他属性触发离屏渲染的同时,会将光栅化后的内容缓存起来,如果对应的layer及其sublayers没有发生改变,在下一帧的时候可以直接复用。shouldRasterize = YES,这将隐式的创建一个位图,各种阴影遮罩等效果也会保存到位图中并缓存起来,从而减少渲染的频度(不是矢量图)。
    相当于光栅化是把GPU的操作转到CPU上了,生成位图缓存,直接读取复用。
    当你使用光栅化时,你可以开启“Color Hits Green and Misses Red”来检查该场景下光栅化操作是否是一个好的选择。绿色表示缓存被复用,红色表示缓存在被重复创建。
    如果光栅化的层变红得太频繁那么光栅化对优化可能没有多少用处。位图缓存从内存中删除又重新创建得太过频繁,红色表明缓存重建得太迟。可以针对性的选择某个较小而较深的层结构进行光栅化,来尝试减少渲染时间。

    多重渲染MRT

    (多个render pass, colorbuffer depthbuffer stencilbuffer ) 允许应用程序一次渲染到多个缓冲区, 片段着色器可以输出多个颜色,可以用于保存 RGBA 颜色、 法线、 深度信息或者纹理坐标,每个颜色连接一个颜色缓冲区。是 OpenGL ES 3.0 新特性,它允许应用程序一次渲染到多个缓冲区。 利用 MRT 技术, MRT 技术,在图形图像算法中比较常用,主要用于获取算法中间结果、底图或者 Mask ,也用于多种高级渲染算法中,例如延迟着色和快速环境遮蔽估算
    在这里插入图片描述

    参考资料:

  • 相关阅读:
    [含毕业设计论文+PPT+源码等]ssm装潢应用系统小程序+Java后台管理系统|前后分离VUE
    3D印刷电路板在线渲染查看工具
    [CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
    javaweb
    WebGPU学习(10)---如何利用 WebGPU 实现高性能
    第一个MyBatis程序
    Maven仓库:repository
    Visual Studio 2019下编译OpenCV 4.7 与OpenCV 4.7 contrib
    递归查询实现
    【数据库】事务与并发控制
  • 原文地址:https://blog.csdn.net/chenweiyu11962/article/details/125512979