OpenGL ES 系列之开篇
OpenGL ES 系列之开篇
很久前一直想研究 OpenGL 无奈自己的惰性,现在准备开始完整的学习下 OpenGL, 一来工作需要,二来也是自我学习的成长。 我是一名 iOSer,OpenGL 是与平台无关的一种开发技术,虽然苹果在 iOS 12 推荐使用自家的 Metal, 但这个做为学习还是有必要的。
关于 OpenGL
OpenGL 全称:Open Graphics Library,用来处理2D、3D视觉数据的。是一个多用途的开放标准图形库,支持2D、3D数字内容的创建、机械和建筑设计、虚拟样机、飞行模拟、视频游戏等应用程序。你可以使用 OpenGL 配置3D图形的管道并提交数据。对顶点进行转换和点亮、组装成基本类型并进行栅格化以创建2D图像。OpenGL设计用来将函数调用转换成可以发送到底层图形硬件的图形命令。因为这个底层硬件专用于处理图形命令,所以 OpenGL 绘图通常非常快。
OpenGL ES 全称: OpenGL for Embedded System, 是OpenGL的一个精简版本,消除了冗余的功能,提供了一个简单学习和在手机图形硬件上轻松实现的库
简介
OpenGL ES 允许应用利用底层图形处理器的能力。iOS设备的GPU可以执行复杂的2D、3D绘制,与在最终的图片上每个像素点的复杂阴影计算。如果应用的设计需求需要最直接和全面访问GPU硬件,那最好要使用OpenGL ES。最典型的应用是视频游戏和呈现3D图形模拟。
OpenGL ES 是底层的、面向硬件的API。虽然提供了最强大的和最灵活的图形处理工具,但它的学习也是很困难且对你的应用程序整体设计也有重大的影响。对于需要高性能处理图形的应用, iOS提供了高层级的框架, 如 SpritKit(为2D游戏提供硬件加速动画的优化)、Core Image(提供对静态和视频图像的实时过滤和分析)、 CoreAnimation(提供图形渲染硬件加速和是所有iOS应用的动画基础,同时也是简单的声明式编程模型使得实现复杂的用户界面动画变得简单)
因为OpenGL ES 是基于 C 语言的 API,因此它具有极大的可移植性和广泛的支持。作为C语言API,与 Objective-C Cocoa 应用无缝衔接。OpenGL ES规范没有定义窗口层,所以宿主系统必须提供函数来创建OpenGL ES渲染上下文(用来接收命令)和 framebuffer(将绘制命令的结果写入其中)。在 iOS 中使用 OpenGL ES 需要使用 iOS 类设置和呈现绘图平面和使用平台无关的 API 来呈现内容。
GLKit 提供绘图平面和动画支持。神视图和视图控制器定义在 UIKit 中, 在 iOS 中控制视觉内容的呈现。 GLKit 为 OpenGL ES 提供了类似的这些类。当开发一个 OpenGL ES 应用, 你要使用 GLKView 对象渲染你的 OpenGL ES 内容。 你也要使用 GLKViewController 对象管理你的视图和内容动画的支持。
除了绘制内容填充整个屏幕或视图的一部分,你可以使用 OpenGL ES 的 framebuffer 对象对其它的渲染策略。 iOS 实现了标准的 OpenGL ES framebuffer 对象,可以渲染离屏缓存区或者 OpenGL ES 场景中其它使用纹理的地方。此外, OpenGL ES 在 iOS 上支持渲染到 Core Animation 图层(CAEAGLLayer),可以结合其它图层创建应用的界面或视觉展示。
图形处理器是为优化图形处理的并行设备。为了在应用中获得更好的性能,你必须仔细设计应用,给 OpenGL ES 提供数据和命令,那样图形硬件才能很好的并行运行在你的应用中。一个调差的应用让CPU或GPU去等待另一个处理命令的结束。
应用运行在后台时 可能不会调用 OpenGL ES 函数。如果应用在后台访问图形处理器, iOS 系统会自动中断。为了避免此种情况发生,你的应用在进入后台前要刷新任何在先前提交给 OpenGL ES 的尾部命令,避免在回到前台时调用 OpenGL ES。
利用迸发来设计应用程序对提高应用的性能非常有帮助。如果你想给 OpenGL ES 添加迸发,你必须要保证不能同时被两个线程访问同一个上下文。