iOS开发之初识OpenGL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发之初识OpenGL相关的知识,希望对你有一定的参考价值。

参考技术A 既然有了 Metal 我们是否还有学习 OpenGL ES 的必要呢.我个人认为暂时还是有必要的.OpenGL /OpenGL ES/ Metal 在任何项目中解决问题的本质就是利用GPU芯片来⾼效渲染图形图像.所以它们底层的原理相近,首先了解OpenGL之后再去了解Metal会更加容易, 其二OpenGL是跨平台的框架.保不齐以后会在其他的地方用到,所谓技多不压身.毕竟不可能保证一直都做苹果开发吧.

理论枯燥且乏味, 但是我们联想一下flutter开发中用到的context, ios开发中CoreGraphics里也有用到context. 是不是此时心中就有了一定的答案.我个人理解其设计模式大同小异. 顾名思义我们能够通过context拿到很多必要的状态和数据.

比如需要显示一个正方形, 则需要两个正等边三角形图元来完成

为了读取效率起见, 提前分配一块显存, 将顶点数组存放在显存中. 这部分显存就叫做 顶点缓冲区

OpenGL渲染的过程中会经历很多节点. 这些节点串起来就是管线.

常见的着⾊器主要有: 顶点着⾊器(VertexShader) , ⽚段着⾊器(FragmentShader) , 几何着⾊(GeometryShader) , 曲⾯细分着⾊器(TessellationShader)

OpenGL ES 中只⽀持 顶点着⾊器 和 片段着⾊器 .

光栅化就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。

如果把渲染比作是画画, 那么顶点着色器操作相当与确定画的内容的框架. 而之后往框架里填充内容的过程就是光栅化.

填充好内容之后就是片元着色器操作像素点填充颜色等操作

这里附上一张流程图:

纹理可以理解为图⽚。 在渲染图形时需要在顶点围成的区域中填充图⽚,使得场景更加逼真。⽽这⾥使⽤的图⽚,就是常说的纹理。只是在OpenGL,我们更加习惯叫纹理,⽽不是图⽚。

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 添加迸发,你必须要保证不能同时被两个线程访问同一个上下文。

OpenGL ES 官方网址

以上是关于iOS开发之初识OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

iOS底层探索之多线程—初识GCD

iOS开发——初识

IOS开发之UITableView的奇技

iOS开发_初识视频直播

Swiper之初识

Swift开发之初识