2020-07-06 OpenGL离屏渲染等

613 阅读1分钟

离屏渲染

双缓存+垂直同步信号

  • 离屏渲染
    • 常用的渲染方式是读取帧缓冲区(Frame Buffer)渲染好的数据然后显示在屏幕上,离屏渲染(OffScreen Buffer)是将多个图层的数据依次渲染完成之后,放入帧缓冲区然后统一在屏幕上显示

离屏渲染的逻辑是由于计算机按层渲染,渲染后就会将相应的缓存清空,但是由于需要对画面进行圆角等渲染,因此苹果推出离屏渲染是将每个图层分别渲染并写入缓冲区,最后进行图层的渲染叠加,避免了不必要的开销。

补充 处理图像圆角的几种方案

方案1

    _imageView.clipsToBounds=YES;
    _imageView.layer.cornerRadius=4.0;

方案2

UIGraphicsBeginImageContextWithOptions(self.size,NO,scale);
[[UIBezierPath bezierPathWithRoundedRect:imageFrame cornerRadius:cornerRadius] addClip];
[self drawInRect:imageFrame];
image= UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

方案3

增加圆角图片进行覆盖

离屏渲染的限制

  • 离屏渲染的空间有限制,限制为屏幕大小的2.5倍
  • 渲染由于是分层渲染,导致性能问题
  • 掉帧

渲染架构图分析

根据上图可以得到渲染流程如下 首先客户端Client代表上层封装的Api Server服务端代表底层实现架构

  • 设置顶点数据以及参数
  • 在顶点着色器中运算
  • 进入细分的着色器
  • 设置图元,并构成点线以及三角形
  • 裁剪
  • 光栅化
  • 偏远着色器填充颜色
  • 渲染 (参考 www.jianshu.com/p/dc65d6e7e…

OpenGL数据传递的三种方式

Attributes 属性传递,只能传递给顶点着色器,其他不可以 Uniforms 可以传入顶点着色器和片元着色器 Texture Data 数据纹理对象也可传递到顶点着色器和片元着色器