OpenGL ES初探:渲染流程及GLKit简介

2021-08-25 14:52:18 浏览数 (1)

1.1 简介

OpenGL是一套多功能开放标准库,用于处理可视化2D和3D数据。OpenGL可以将调用函数转换成图形处理命令并传送给底层图形硬件,因此OpenGL的绘制效率非常快。

OpenGL ES 是OpenGL的简化版本,是以手持和移动设备为目标的高级3D图形图像API,可以直接操作GPU硬件。其苹果官方文档描述如下:

OpenGL ES消除了一些OpenGL中移动端用不到的冗余功能,是目前主流的智能手机图形API,目前支持的平台包括:iOS、Android、BlackBerry、bada、Linux、Windows等。

1.2 OpenGL/OpenGL ES渲染管线及流程

1.2.1 渲染架构

如图所示,应用程序代码通过OpenGL ES Client准备好图元信息(这一部分由CPU完成),将数据传递给OpenGL ES Server进行图像图像的渲染(这一部分由GPU完成)。

有三个通道传递数据给着色器式:Attribute(参数属性)、Uniform(统一值)、Texture Data(采样器)

  • Texture:用于传递纹理数据,可以将纹理数据传递给片元着色器,也可以传递给顶点着色器,但是顶点着色器不能处理纹理,所以没有意义;
  • Uniform:统一数据,批次传递,将一些不变的数据传递给着色器,既可以传给顶点着色器,也可以传给片元着色器
  • Attribute:参数属性传递,只能将数据传递给顶点着色器,再通过顶点着色器间接的传递给片元着色器。

1.2.2 着色器业务

着色器本质上是一段程序代码:

在OpenGL/OpenGL ES中,开发者所能直接编程的着色器只有顶点着色器和片元着色器,其它着色器不能由开发者直接编程,因此这里只介绍顶点着色器和片元着色器业务。

1、 顶点着色器输入数据是顶点数组提供的每个顶点的数据,主要包括以下业务:

  • 矩阵位置变换,比如旋转、平移和缩放
  • 计算光照公式生成顶点颜色,比如设置点光源或者默认光源
  • 生成/变换纹理坐标

2、片元着色器的输入数据来自光栅化后的顶点着色器输出,需要注意的是顶点着色器后并不是片元着色器,而是要经过图元装配、光栅化、裁剪等过程。片元着色器的主要包括以下业务:

  • 计算颜色
  • 获取纹理值,将纹理坐标与图形坐标进行一一对应
  • 往像素点中填充纹理值/颜色值

1.2.3 渲染管线流程

如图所示是苹果官方文档中描述的OpenGL ES渲染流程,主要包括以下几步:

1、顶点着色器进行旋转、平移、缩放的矩阵变换,以及对光照进行设置,之后输出数据

  • 图元装配:确定图形显示为什么形状,点、线或者三角形
  • 光栅化:将图元转换为二维信息,因为屏幕是二维的
  • Clipping: 超出视景体的部分不在屏幕上显示,要进行裁剪

2、片元着色器接收到数据后,进行颜色计算和纹理获取,并进行纹理和颜色的填充

3、逐片段处理,这里部分包括像素归属测试、裁剪测试、深度测试、混合等操作

  • 像素归属测试:确定帧缓冲区中的像素是否归属于OpenGL ES上下文所有;例如两个view在一个像素点上有重叠,则在下面的view的像素点会被判定不属于OpenGL ES的Context所有,即被抛弃不显示。
  • 裁剪测试:确定一个像素(x, y)是否在矩形区域内,如果不在则被丢弃,不予显示
  • 深度测试:对深度值进行比较,确定显示层级
  • 混合:将新生成的片段颜色和保存在帧缓冲区的位置的颜色组合起来,例如两个view有重叠,并且上层view存在透明度,则会进行混合,产生一个新的颜色值,因为一个像素只能显示一种颜色

1.3 EGL

OpenGL ES API没有提供如何创建渲染上下文或者上下文如何链接到原生窗口。EGL是渲染API和原生窗口系统之间的接口,比如OpenGL ES和各个平台。iOS系统是唯一支持OpenGL ES但不支持EGL的平台,因为苹果提供了一套自己的EGL API实现,称为EAGL。这有些类似与我们日常开发中对第三方库的二次封装,OpenGL/OpenGL ES对于苹果来说就是他们的第三方库。

二、GLKit简介

GLKit 框架的设计⽬目标是为了了简化基于OpenGL / OpenGL ES 的应⽤用开发. 。它的出现 加快OpenGL ES或OpenGL应⽤程序开发。使⽤数学库,背景纹理加载,预先创建的着 ⾊器效果,以及标准视图和视图控制器来实现渲染循环。

GLKit框架提供了功能和类,可以减少创建新的基于着色器的应⽤用程序所需的⼯工作量量,或者⽀持依赖早期版本的OpenGL ES或OpenGL提供的固定函数顶点或片段处理理的现有应用程序。

GLKit提供的功能:

  • 加载纹理
  • 提供高性能的数学运算
  • 提供常见的着色器
  • 提供视图及视图控制器,即GLKView和GLKViewController

GLKit提供的类及接口:

  • GLKView:使用OpenGL ES绘制其内容的视图的默认实现。
  • GLKViewController:管理OpenGL ES呈现循环的视图控制器。
  • GLKTextureLoader:简化从各种图像文件格式加载OpenGL或OpenGL ES纹理数据的实用程序类。
  • GLKTextureInfo:关于由GLKTextureInfo类创建的OpenGL纹理的信息。
  • GLKBaseEffect:一个简单的照明和阴影系统,用于基于着色的OpenGL渲染。相当于固定管线着色器

三、总结

1、何为OpenGL ES?

OpenGL ES是OpenGL 的子集,提供了一个以移动设备和嵌入式设备为目标的图形处理API.

2、何为EGL?

一个连接OpenGL与原生窗口间的接口,iOS系统不支持EGL,但是有一套自己的实现,成为EAGL。

3、何为GLKit?

苹果对OpenGL ES进行的面向对象的封装,极大简化了OpenGL/OpenGL ES的开发。

0 人点赞