美文网首页
OpenGL,OpenGL ES,Metal详解1

OpenGL,OpenGL ES,Metal详解1

作者: 非洲小白猿 | 来源:发表于2019-11-27 15:36 被阅读0次

    学习OpenGL、OpenGL ES、Metal等图形API之前,我们需要先掌握一些相关的概念,否则在后面的学习中,提到相关概念的时候,会不知所云。

    图形API简介

    OpenGL(Open Graphics Library):是一个跨编程语言、跨平台的编程图形程序入口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。

    OpenGL ES(OpenGL for Embedded Systems):是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。

    Metal :Apple为游戏开发者推出的新的平台技术,该技术能为3D图像提高10倍的渲染性能。Metal是Apple为了解决3D渲染而推出的框架。

    DirectX是由很多API组成的,DirectX并不是一个单纯的图形API。而且DirectX是属于Windows上一个多媒体处理API,并不支持Windows以外的平台,可以分为四大部分,显示部分、声音部分、输入部分、网络部分。

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

    简单来说就是实现图形的底层渲染,比如:

    • 在音视频开发中,对于视频解码后的数据渲染
    • 在游戏开发中,对于游戏场景、游戏人物的渲染
    • 在地图引擎中,对于地图上的数据渲染
    • 在动画中,实现动画的绘制
    • 在视频处理中,为视频加上滤镜效果
      总的来说,OpenGL/OpenGL ES/Metal在任何项目中解决问题的本质都是利用GPU芯片来高效渲染图形图像。

    OpenGL专业名词解析

    OpenGL上下文(context)

    在调用任何OpenGL指令之前,我们首先需要创建一个状态机。这个上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执行的基础。

    OpenGL的函数不管是在哪个语言中,都是类似C语言一样的面向过程的函数,本质上都是对OpenGL上下文这个庞大的状态机中的某个状态或者对象进行操作,当然你得首先把这个对象设置为当前对象。因此,通过对OpenGL指令的封装,是可以将OpenGL的相关调用封装成为一个面向对象的图片API的。

    由于OpenGL上下文是一个巨大的状态机,切换上下文往往会产生较大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理。因此,可以在应用程序中分别创建多个不同的上下文,在不同线程中使用不同的上下文,上下文之间共享纹理、缓冲区等资源。这样的方案,会比反复切换上下文,或者大量修改渲染状态,更加合理高效的。

    渲染

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

    顶点数据(VertexArray)和顶点缓冲区(VertexBuffer)

    画图一般是先画好图像的骨架,然后再往骨架里面填充颜色,这对于OpenGL也是一样的。顶点数据就是要画的图像的骨架,和现实中不同的是,OpenGL中的图像都是由图元组成的。在OpenGL ES中,有3种类型的图元:点、线、三角形。

    那这些顶点数据最终是存储在哪里呢?开发者可以选择设定函数指针,在调用绘制方法的时候,直接由内存传入顶点数据,也就是说这部分数据之前是存储在内存当中的,被称为顶点数组。而性能更高的做法是,提前分配一块显存,将顶点数据预先传入到显存当中。这部分的显存,就被成为定点缓冲区。

    顶点指的是我们在绘制一个图形时,它的顶点位置数据。而这个数据可以直接存储在数组中或者将其缓存到GPU内存中。

    管线

    在OpenGL下渲染图形,就会有经历一个一个节点的操作,而这样的操作可以理解为管线。大家可以想象成流水线,每个任务类似流水线般执行。任务之间有先后顺序。管线是一个抽象的概念,之所以称之为管线是因为显卡在处理数据的时候是按照一个固定的顺序来的,而且严格按照这个顺序。就像水从一根管子的一端流向另一端,这个顺序是不能打破的。

    固定管线/存储着色器

    在早期的OpenGL版本,它封装了很多种着色器程序,内置了一段包含光照、坐标变换、裁剪等等诸多功能的固定shader程序来完成,来帮助开发者完成图形的渲染。而开发者只需要传入相应的参数,就能快速完成图形的渲染。类似于iOS开发会封装很多的API,而我们只需要调用这些API,就可以实现功能,不需要关注底层实现原理。

    但是由于OpenGL的使用场景非常丰富,固定管线或者存储着色器无法完成每一个业务,这时就需要将相关的部分开放成可编程。

    着色器程序Shader

    就全面的将固定渲染管线架构变为了可编程渲染管线。因此OpenGL在实际调用绘制函数之前,还需要指定一个由shader编译成的着色器程序。常见的着色器主要有顶点着色器

    相关文章

      网友评论

          本文标题:OpenGL,OpenGL ES,Metal详解1

          本文链接:https://www.haomeiwen.com/subject/rkipwctx.html