基础概念
应用端:
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
OpenGL的发展过程中,从1.0开始有一个分支,一个是OpenGL ES1.1 ,一个是 OpenGL 2.0,最后都是 OpenGL ES 2.0。
在 2.0 中都是增加了一些片元着色器,替代了一些原先的方法。
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 中
不同点:
兼容性:
OpenGL ES 3.0 是向后兼容 OpenGL ES 2.0的。也就是说使用 2.0 编写的应用程序可以在 3.0 中继续使用的
新特性:
采用阴影贴图,体渲染(volume rendering),基于 GPU 的例子动画,几何形状实例化,纹理压缩和伽马校正等技术的重要功能在 2.0 都不具备。3.0 将这些功能引入,同时继续适应嵌入系统的局限性。
渲染管线:
3.0 中移除了 Alpha 测试 和 逻辑操作(LogincOp)两部分,这两部分存在于 OpenGL ES 2.0 和 OpenGL ES 1.x 中移除 Alpha 测试是因为片元着色器可能抛弃片段,因此 Alpha 测试可以在片段着色器 中进行,移除 逻辑操作(LogicOp)是因为它很少被使用
着色器脚本编写:
着色器脚本的辨析发生了比较大的变化,其中几点为:
1)版本声明
必须在着色器脚本中使用 #version 300 es 声明为指定使用 OpenGL ES 3.0 版本而不添加脚本声明或者使用 #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 版本
Adreno 是骁龙手机端的 GPU 框架。
从 Adreno 302 开始,支持 OpenGL ES 3.0。
从 Adreno 405 开始,支持 OpenGL ES 3.1。
从 Adreno 420 开始,支持 OpenGL ES 3.2。
Adreno 305、306、320、330、405、420 支持 OpenGL ES 3.0 版本
Adreno 320 开始支持 OpenGL ES 3.0 是指的稳定支持
关于Vulkan
Vulkan 被视作是 OpenGL 的后续产品。 它是一种多平台 API,可支持开发人员准备游戏、CAD 工具、性能基准测试等高性能图形应用。
它可在不同的操作系统(比如 Windows*、Linux* 或 Android*)上使用
是新一代的 API ,但是相对 OpenGL 来说,在复杂度和维护难度上,Vulkan 的门槛很高,虽然有更高效的计算性能,作为新兴的具有
生命力的 Vulkan ,相信在以后的运用中更加广泛
作业——说出支持OPenGL ES3.2的骁龙GPU型号有哪些
Adreno 420 以后的都支持
作业——怎么看待Valken
跨平台,基本上支持了除苹果以外的平台
Vulkan支持的比OPenGL做得事情多
更倾向于一个“类平台”的概念,深入硬件底层,上手难度大
OpenGL 当时声称是跨平台的图形学API,却在移动平台上裁剪搞出 OpenGL ES,如今移动平台硬件性能强悍起来了,统一的 API 又浮出
水面了。AMD 捐献出铺路的 Mantle,成了后来的 Vulkan
主要的短板在于驱动支持