技美 百人计划 1.4PC手机图形API介绍
1.4PC手机图形API介绍
前言
电脑的工作原理:电脑是由不同的硬件组成,由驱动软件驱动硬件工作。所有的软件工程师都会直接或间接的使用到驱动
基础概念
-
应用端
-
图元
-
纹理
- 纹素
- 顶点数组
- 顶点缓冲区
- 顶点着色器
- 片元着色器
DirectX、OpenGL、OpenGL ES 发展史
Khrons 定义了OpenGL ,微软自己定义了DirectX,目前手机不管是IOS还是Android,都支持OpenGL ES
电脑:Windows系统支持DirectX和OpenGL,Linux/Mac(Unix)系统支持OpenGL
OpenGl 的发展过程中,从1.0开始有一个分支,一个是OPenGL ES1.1,一个是OPenGL2.0,最后都是OPenGL ES2.0
在中都是增加了一些片元着色器,替代了一些原先的方法
OpenGL ES
相同点
相比于OpenGL ES1.x系列的古董功能管线,OpenGL ES2.0 和OpenGL ES 3.0都是可编程渲染管线。开发者可以自己编写图形管线中的顶点着色器和片元着色器两个阶段的代码
OpenGL ES渲染流程
2.0版本
3.0版本
不同点
1.兼容性
OpenGL ES 是向后兼容 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 ES1.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对指定位置的变量赋值例如
layout(location=1)uniform float a;
代码中 直接写上对应的layout的值就可以赋值
GLES30.glUniformlf(1,1f);
而2.0中必须使用如下赋值
GLES20.glUnformlf(GLES20.glGetAttribLocation(program,"a"),1f)
OpenGL ES 3.0新功能,
这块有点多看了一遍也记不太住,碰到了再查吧,这里暂时找了个其他人做的总结
骁龙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 版本
关于 Vulkan
Vulkan 被视作是 OpenGL 的后续产品。 它是一种多平台 API,可支持开发人员准备游戏、CAD 工具、性能基准测试等高性能图形应用。 它可在不同的操作系统(比如 Windows*、Linux* 或 Android*)上使用
Vulkan相当于OpenGl 的下一代产品用来替代OpenGl但是短期应该还不会。