iOS OpenGL ES 基础入门一

简介

关于OpenGL ES的开放式图形库(OpenGL的)用于可视化的二维和三维数据。它是一个多用途的开放标准图形库,支持2D和3D数字内容创建,机械和建筑设计,虚拟原型设计,飞行模拟,视频游戏等应用程序。您可以使用OpenGL配置3D图形管线并将数据提交给它。对顶点进行变换和光照,将其组装为图元,并进行栅格化以创建2D图像。
OpenGL旨在将函数调用转换为可发送到底层图形硬件的图形命令。由于此底层硬件专用于处理图形命令,因此OpenGL绘制通常非常快。

OpenGL for Embedded Systems(OpenGL ES)是OpenGL的简化版本,它消除了冗余功能,从而提供了一个更易于学习且更易于在移动图形硬件中实现的库。

iOS OpenGL ES 基础入门一

版本

  • OpenGL ES 3.0是iOS 7中的新功能。它添加了许多新功能,这些功能可实现更高的性能,通用的GPU计算技术以及更复杂的视觉效果,这些效果以前只能在台式机级硬件和游戏机上实现。
  • OpenGL ES 2.0是iOS设备的基准配置文件,具有基于可编程着色器的可配置图形管线。
  • OpenGL ES 1.1仅提供基本的固定功能图形管道,并且在iOS中主要用于向后兼容。

重要事项: OpenGL ES在iOS 12中已弃用。苹果官方推荐使用Metal框架。不过Metal的资料比较少,建议先熟悉OpenGL ES比较靠谱。

3D渲染

图形处理单元(GPU)能够结合几何、颜色、灯光和其他数据而产生一个屏幕图像的硬件组件。屏幕只有2维,因此显示3D数据的技巧就在于产生能够迷惑眼睛使其看到丢失的第2维的一个图像。

用3D数据生成一个2D图像的过程叫渲染。在计算机上显示的图片是由矩形的颜色点组成的,这些矩形的颜色点叫做像素,每个像素是由3个颜色元素组成的,即一个红点、一个绿点和一个蓝点。每个颜色元素都有个数值,代表着颜色的强度,以数组的形式存储于存储器中。

坐标系

OpenGL ES总是开始于一个矩形的笛卡尔坐标系。坐标是以浮点数来存储的。

iOS OpenGL ES 基础入门一

矢量

矢量是理解GPU的关键,因为图形处理器就是大规模并行矢量处理器。GPU能同时控制多个矢量,并执行用于定义喧嚷结果的矢量运算。具体算法得学习下线性代数。

点、线、三角形

OpenGL ES 使用顶点数据来定义点、线段和三角形。一个顶点会定义坐标系中的一个点的位置,两个顶点会定义一个线段,三个顶点会定义一个个三角形。OpenGL ES只渲染顶点、线段和三角形。

缓存

缓存(buffers)是提供数据最好的方式。缓存是指图形处理器能够控制和管理的连续RAM。程序从CPU的内存复制数据到OpenGL ES的缓存。在GPU取得一个缓存的所有权后,运行在CPU中的程序理想情况下将不在接触整个缓存。通过控制独占的缓存,GPU 就能够尽可能以最有效的方式读写内存。图形处理器把它处理大量数据的能力异步同时地应用到缓存上,这意味这在GPU使用缓存中的数据工作的同时,运行在CPU中的程序可以继续执行。

OpenGL ES部分运行在CPU上,部分运行在GPU上。OpenGL ES横跨在两个处理器之间,协调两个内存区域之间的数据交换。iOS OpenGL ES 基础入门一
为缓存提供数据具有7个步骤:

1、生成(Generate)——为图形处理器控制的缓存生成一个独一无二的标识符。
2、绑定(Bind)——为接下来的运算使用一个缓存。
3、缓存数据(Buffer Data)——为当前绑定的缓存分配并初始化足够的连续内存(通常是从CPU控制的你村复制数据到分配的内存)。
4、启用(Enable)或者禁止(Disable)——在接下来的渲染中是否使用缓存中的数据。
5、设置指针(Set Pointers)——在缓存中的数据的类型和所有需要访问的数据内存偏移值。
6、绘图(Draw)——使用当前绑定并启用的缓存中的数据渲染整个场景或者某个场景的一部分。
7、删除(Delete)——删除以前生成的缓存并释放相关的资源。

帧缓存

GPU需要知道应该在内存中的哪个位置存储渲染出来的图像像素数据。就像为GPU提供数据的缓存一样,接收渲染结果的缓冲区叫做帧缓存(frame buffer)。程序会像其他种类的缓存一样生成、绑定、删除。但是帧缓存不需要初始化,因为渲染指令会在适当的时候替换缓存的内容。帧缓存会在被绑定的时候隐式开启,同时OpenGL ES会自动根据特定的硬件配置和功能来设置数据的类型和偏移。

可以同时存在很多帧缓存,并且可以让GPU把渲染结果存储到任意数量的帧缓存中。但是,屏幕像素要受到保存在前帧缓存(front frame buffer)的特定帧缓存中的像素颜色元素的控制。程序和操作系统很少会直接渲染到前帧缓存中,因为那样会让用户看到还没渲染完成的图像。程序和操作系统会把渲染结果保存到包括后帧缓存(back frame buffer)在内的其他帧缓存中。当渲染后的后帧缓存包含一个完整的图像的时候,前帧缓存和后帧缓存会瞬间切换。后帧缓存变成新的前帧缓存,旧的前帧缓存变成后帧缓存。
iOS OpenGL ES 基础入门一

GLKit

UIKit框架定义的视图和视图控制器控制iOS上视觉内容的呈现。GLKit框架提供了这些类的OpenGL ES 感知版本。开发OpenGL ES 应用程序时将使用一个GLView对象来呈现OpenGL ES 内容。还可以使用GLKViewController对象来管理视图并为其内容添加动画效果。

除了绘制内容以填充整个屏幕或视图层次结构的一部分外,您还可以将OpenGL ES帧缓冲对象用于其他渲染策略。iOS实现了标准的OpenGL ES帧缓冲区对象,您可以将其用于渲染到屏幕外缓冲区或纹理,以在OpenGL ES场景中的其他地方使用。此外,iOS上的OpenGL ES支持渲染到Core Animation层(CAEAGLLayer该类),然后您可以将其与其他层组合以构建应用程序的用户界面或其他视觉显示。

参考文章

文档:苹果官方文档

书籍:OpenGL ES应用开发实践指南