图形图像 opencv gles

OpenGL/OpenGL ES初探

2019-05-17  本文已影响0人  佐_笾
OpenGL/OpenGL ES 初探(一)

当初接触OpenGL的时候,也关注到了苹果爸爸弃用的问题,心里想着,苹果爸爸都弃用了OpenGL/Open LG ES,那么学这东西还有什么用呢?

Apple宣布iOS12.0弃用OpenGL/CL

值得注意的是:
1、苹果自身的系统迁移到Metal是花费了4年时间
2、在没有推出Metal时,苹果对于OpenGL ES是高度集成且配合相应图层和GLKit来辅助开发者能快速使用OpenGL ES
3、OpenGL ES的弃用,只是针对苹果内部系统底层API依赖而言,并不是想让iOS开发者从此不使用OpenGL ES。只是角色变成了第三方,毕竟它的跨平台以及稳定是很难让现有的开发放弃,而这几点Metal目前很难做到
4、目前大多数类似百度地图、高德地图和音视频处理的项目组已经很庞大了,暂时不会迁移到Metal,所以只学习Metal是不够用的
5、所以学习需要一步一步的走OpenGL -> OpenGL ES -> Metal,这个也是亲身体会,之前尝试过上来就学GPUImage或者是OpenGL ES,但是仅仅停留在会用,但是不知道原理,所以先要打好基础

本篇文章的目的

图形API

图形API简介

图形API的目的是解决什么问题

简单的说就是实现图形的底层渲染

本质:就是利用GPU芯片来高效渲染图形图像
图形API是iOS开发者唯一接近GPU的方式

OpenGL下专业名词解析

OpenGL上下文 context

OpenGL 状态机

OpenGL是一个状态机,它保持自身的状态,除非用户输入一条命令让它改变状态

渲染

将图形/图像数据转换成3D空间图像操作叫做渲染Rendering

顶点数组VertexArray和顶点缓冲区VertexBuffer

管线

着色器程序Shader

顶点着色器VertexShader

片元着色器FragmentShader

GLSL (OpenGL Shading Language)

OpenGL着色语言是用来在OpenGL中着色编码的语言,也就是开发人员写的短小的自定义程序,他们是在GPU(Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。
GLSL的着色器代码分成2个部分: VertexShader(顶点着色器) 和 Fragment Shader(片元着色器)

光栅化 Rasterization

纹理

纹理可以理解为图片。在渲染图形时需要在其编码填充图片,为了使得场景更加逼真,而这里使用的图片,就是常说的纹理。在OpenGL中,更加习惯叫纹理,而不是图片。

混合 Blending

变换矩阵 Transformation

图形想发生平移、缩放、旋转变换,就需要使用变换矩阵

投影矩阵 Projection

用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下进行绘制

渲染上屏/交换缓冲区 SwapBuffer

渲染缓冲区一般映射的是系统的资源,比如窗口。如果将图像直接渲染到窗口对应的缓冲区,则可以将图像显示到屏幕上。但是,值得注意的是,如果每个窗口只有一个缓冲区,那么在绘制过程中,屏幕进行了刷新,窗口可能显示出不完整的图像。

常规的OpenGL程序至少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上显示。

因为显示器的刷新一般是逐行进行的,因此为了防止交换缓冲区的时候,屏幕上下区域的图像分属于两个不同的帧,因此交换一般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进行交换,这个信号就被称为垂直同步信号,这个技术被称为垂直同步

使用了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进行下一帧的渲染,使得帧率无法完全达到硬件允许的最高水平,为了解决这个问题,引入了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏的缓冲区,而垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利用硬件性能的目的

上一篇下一篇

猜你喜欢

热点阅读