前言
电脑的工作原理:电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动
定义:图形API是一个图形库,用于渲染 2D,3D 矢量图形的跨语言,跨平台的应用程序编程接口(API)。针对 GPU
基础概念
应用端:
即我们自己的程序端,相对用 OpenGL ES,我们属于应用端
什么是应用端?应用端就是我们程序自己,相对于 OpenGL,、OpenGL ES、DirectX来说,我们都是应用端
图元:
要渲染的几何物体,或者形状。比如要渲染一个正方形的图片,就是一个图元,要渲染两条直线,这两条直线也是图元
纹理:
通俗点,可以理解为一张图片,在 OpenGL ES 中纹理就是图片的另外一种叫法
纹素:
纹素是纹理的基础单位,但并不是像素,图像时由像素排列而成,纹理时由纹素排列表示的,两个具有本质上的区别
顶点数组:
顶点指的是组成图元的各个顶点的坐标数据(在3D笛卡尔坐标中即 x,y,z 坐标),这些坐标数据可以一起存到一个内存数组中,这个数据叫做顶点数组
顶点缓冲区:
在显存中专门分配一块显存来存储这个顶点数组,这个显存就称为顶点缓冲区
顶点着色器
片元着色器
DirectX、OpenGL、OpenGL ES 发展史
Khronos 定义了 OpenGL ,微软自己定义了 DirectX
手机: IOS 和 Android都是支持 OpenGL ES
电脑: Windows 系统支持 DirectX 和 OpenGL,Linux/Mac(Unix)系统支持 OpenGL
20 世纪 90 年代
OpenGL 开放
2000 年
OpenGL ES 开放
直到现在的年代,OpenGL ES 已经到了 3.2 版本
2005 年
OpenGL SC 开放
2008 年
开放基层更高效计算的 OpenCL
2014 年
开放 SPIR
2015 年
Vulkan 开放,更加高效的 GPU 使用效率
OpenGL ES
相同点:相比于 OpenGL ES 1.x 系列的古董功能管线,OpenGL ES 2.0 和 OpenGL ES 3.0 都是可编程图形管线。开发者可以自己编写图形管线中的 顶点着色器 和 片元着色器 两个阶段的代码
OpenGL ES 渲染流程
2.0 版本
模型准备—顶点着色器编辑—图元重组—光栅化—片元着色器编写—通过三种测试,最后输出到 Frame Buffer 中
3.1版本
先拿到这些 Buffer 缓存—顶点池—顶点着色器—顶点着色器进行分布 Transform 的 Feedback,进行一个返回,让我们去了解一些数据给下一阶段使用,之后要去进行光栅化—片元着色器的计算—逐片元渲染,然后输入到 Frame Buffer 中
不同点
1.兼容性
OpenGL ES 3.0 是向后兼容 OpenGL ES 2.0的。也就是说使用 2.0 编写的应用程序可以在 3.0 中继续使用的
2.新特性
采用阴影贴图,体渲染(volume rendering),基于 GPU 的例子动画,几何形状实例化
纹理压缩和伽马校正等技术的重要功能在 2.0 都不具备。3.0 将这些功能引入,同时继续适应嵌入系统的局限性。
3.渲染管线
3.0 中移除了 Alpha 测试 和 逻辑操作(LogincOp)两部分,这两部分存在于 OpenGL ES 2.0 和 OpenGL ES 1.x 中,移除 Alpha 测试是因为片元着色器可能抛弃片段,因此 Alpha 测试可以在片段着色器中进行,移除逻辑操作(LogicOp)是因为它很少被使用
4.着色器脚本编写
着色器脚本的辨析发生了比较大的变化,其中几点为:
1)版本声明
必须在着色器脚本中使用 #version 300 es 声明为指定使用 OpenGL ES 3.0 版本
#version 300 es
而不添加脚本声明或者使用 #version 100 es 声名版本则指定使用 OpenGL ES 2.0
2)输入输出
3.0 中新增了 in ,out,inout 关键字,用来取代 attribute 和 varying 关键字。同时 gl_FragColor 和 gl_FragData也删除了,片段着色器可以使用 out 声明字段输出
3)变量赋值
3.0 中可以直接使用 layout 对指定位置的变量赋值。例如:
#shader 脚本 layout(location = 1 ) uniform float a;
代码中,直接写上对应的 layout 的值就可以赋值
GLES30.glUniformlf(1,1f);
而 2.0 中必须使用如下形式赋值
GLES20.glUniformlf(GLES20.glGetAttribLocation(program,"a"),1f)
骁龙Adreno 对应的 OpenGL ES 版本
1.历史
Adreno由高通开发的SIP核GPU并用于自家的SOC,核心最初作为BitBoys从事GPU开发。 06年,BitBoys被ATI收购开设Imageon产品线。06年AMD收购ATI,09年1月,AMD出售Imageon予高通。随后,Imageon更名为Adreno。
作业
支持OpenGL ES 3.2的骁龙的GPU型号
Adreno 320后支持3.0
Adreno 420后支持3.1
Adreno 420后支持3.2
Adreno 320后稳定支持OpenGL ES 3.0
如何看待Vulkan
Vulkan API适用于从高性能电脑到移动低功耗设备的显卡(OpenGL具有名为OpenGL ES的移动设备API子集,它仍是支持Vulkan设备的备选API)。
优势
-
相比于Direct3D 12,Vulkan与前身OpenGL类似,受多种操作系统支持。Vulkan已经能在Windows 7、Windows 8、Windows 10、Tizen、Linux与Android上运行(iOS和macOS有第三方支持)。
-
通过批量处理(Batching)减少CPU负载,使CPU可以执行更多其他的计算或渲染任务。
-
在多核心CPU上,Vulkan能对核心与线程进行优化。Direct3D 11与OpenGL 4最初为单核心CPU设计,尽管后来出现了针对多核心CPU优化的扩展,不过与Vulkan相比,优化仍不是很好。
-
减少了驱动程序的开销与维护工作。OpenGL使用高级着色语言GLSL编写着色器,不同的驱动在程序运行时需要执行自身的GLSL编译器,将程序的着色器转换为GPU可执行的机器代码。而Vulkan驱动将着色器语言预先转化为SPIR-V(Standard Portable Intermediate Representation)的中间二进制格式,其行为类似于Direct3D的HLSL着色器。通过着色器预编译,应用程序加载速度更快,并且3D场景可以使用更多种着色器。Vulkan驱动只需对GPU进行优化并生成代码,这使得驱动程序更容易维护,驱动程序包更小(GPU供应商仍需在驱动程序中提供OpenGL与OpenCL的支持)。
-
计算与图形处理的统一管理,因此Vulkan无需与单独的计算API配合使用。
由于OpenGL的复杂度和维护难度比Vulkan低很多,在多数情况下也能提供理想的整体性能,现阶段OpenGL仍是个很好的选择。 ——英伟达
在OpenGL中,在屏幕上显示某些内容要容易得多。即使没有经典的固定函数,仅仅渲染全屏效果或图像处理也只需要几行代码。Vulkan在到达屏幕上第一个像素时的冗长程度要高得多。正如上一篇博文中所暗示的资源绑定或内存管理需要编写更多复杂的代码。特别是对于不熟悉图形的人来说,最好使用OpenGL或渲染中间件来隐藏这种复杂性并专注于实际任务。