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

1,436 阅读6分钟

一、OpenGL ES简介

1.1 简介

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

The Open Graphics Library (OpenGL) is used for visualizing 2D and 3D data. It is a multipurpose open-standard graphics library that supports applications for 2D and 3D digital content creation, mechanical and architectural design, virtual prototyping, flight simulation, video games, and more. You use OpenGL to configure a 3D graphics pipeline and submit data to it. Vertices are transformed and lit, assembled into primitives, and rasterized to create a 2D image. OpenGL is designed to translate function calls into graphics commands that can be sent to underlying graphics hardware. Because this underlying hardware is dedicated to processing graphics commands, OpenGL drawing is typically very fast.

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

OpenGL for Embedded Systems (OpenGL ES) is a simplified version of OpenGL that eliminates redundant functionality to provide a library that is both easier to learn and easier to implement in mobile graphics hardware.

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

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

1.2.1 渲染架构

苹果官方提供的OpenGL ES简介图
如图所示,应用程序代码通过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渲染管线图
如图所示是苹果官方文档中描述的OpenGL ES渲染流程,主要包括以下几步:

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

2、进行图元装配、光栅化、裁剪等一系列操作后,将数据传递给片元着色器

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

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

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

  • 像素归属测试:确定帧缓冲区中的像素是否归属于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的开发。