图形1.4 图像API简介

图像API简介


 

什么是图像API

 

电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或简介使用驱动,让硬件去工作。而图形API则是一个图形库,用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),基于API让GPU去工作。

 


主流图像API

 

目前,有三个主流的图像API分别是DirectX,OpenGL,OpenGL ES。

OpenGL是一个不断进化的API,新的OpenGL的规范会定期由Khronos Group发布,新版本通过扩展API来支持各种新功能,每个版本的细节由Khronos Group的成员一致决定。

DirectX则是由微软公司创建的,在诞生之初时业界已经存在OpenGL,因此初期的缺乏硬件支持使其难以推行,但在DirectX3.0版本后逐渐得到厂商和玩家的认可。

OpenGL ES是OpenGL的API子集,由OpenGL裁剪定制而来的。去除了很多复杂图元等许多非绝对必要的特性。是专门针对手机、PDA和游戏主机等嵌入式设备而设计图形API。

 

Windows系统支持DirectX和OpenGL,Linux/Mac(Unix)系统支持OpenGL。

手机不管是iOS还是Android都支持OpenGL ES。

 

 


 

对应骁龙GPU型号所支持图形API库速查表

维基表格p一起:

图片链接:对应骁龙GPU型号所支持图形API库速查表

下图看不清的话,点击进上面的图片链接放大查看。

 

速查:例——可看到支持OpenGL ES3.2的骁龙GPU型号为Adreno420之后的所有型号。

 


 

对vulkan的看法

 

全是个人看法,没有半点技巧。瞎说的,别当真。

Vulkan号称下一代OpenGL,说是glNext,不过后来还是起了这个正经名字笑死,但是背后应该其实就是新的一代OpenGL。OpenGL和DirectX 11在渲染上的工作更多都是交给自己做,但是在Vulkan和DirectX12上却给了开发者很大的空间,Vulkan天然支持多线程,比较底层,意味着更加灵活自由,也更加硬核。也就是说Vulkan应该是去对标DirectX12的,DirectX 12现在各个开发者也还在探索,大抵Vulkan也会像这样和OpenGL一起共存很久,代替OpenGL暂且说不上。不过说到底它们的本质还是API,无论是DirectX12还是vulkan,越了解渲染才能越发挥它们的性能,当然同时也需要厂商开发者们去支持,生态旺盛了才有更广的发展空间。

 


 

OpenGL的发展

 

OpenGL的发展:

 

上面这张图是OpenGL1.0到OpenGL ES2.0的发展历史。在OpenGL ES这个过程中还经理了两个不同的版本,一个叫做OpenGL ES1.1,一个叫做OpenGL2.0。从OpenGL1.0到OpenGL2.0没有什么太大的改变,OpenGL1.0到OpenGL ES1.1则是更改了一些方法,替代了一些不支持的函数,如glBegin()和glEnd()。而从OpenGL2.0和OpenGL ES1.1到OpenGL ES2.0则是增加了新的片元着色器去替代原先的一些方法,更灵活且功能更强大。

 

 


 

OpenGL ES不同点

 

兼容性
OpenGL ES 3.0向后兼容OpenGL ES 2.0。即2.0编写的应用程序可以在3.0中继续使用
新特性
3.0采用了阴影贴图、体渲染( volume rendering ) 、基于GPU的粒子动画、几何形状实例化、纹理压缩和伽马校正等技术,同时继续适应嵌入系统的局限性。2.0中则不具备这些功能。
渲染管线
3.0中移除了Alpha测试和逻辑操作(LogicOp)两部分,这两部分存在于OpenGL ES2.0和 OpenGL ES 1.x中。
移除 Alpha测试是因为片段着色器可能抛弃片段,因此 Alpha测试可以在片段着色器中进行。移除逻辑操作( LogicOp)是因为它很少被使用。

着色器编写

版本声明:使用#version 100 es来声明为OpenGL ES 2.0版本,使用#version 300 es来生命为OpenGL ES 3.0版本。这是因为OpenGL ES 2.0是刚刚发布可编程图形管线的版本所以为100,而OpenGL ES 3.0为了匹配上版本号因此从1.0直接跳到了3.0。

输入输出:3.0中新增了in,out,inout 关键字,用来取代 attribute和varying 关键字。同时gl_FragColor和 gl FragData 也删除了,片段着色器可以使用out 声明字段输出。

变量赋值3.0中可以直接使用layout对指定位置的变量赋值。代码中,直接写上对应的 layout的值就可以赋值。而2.0中必须使用GLES20.gluniform1f(GLES2e.glGetAttribLocation(program,"a"),1f)这样的形式来赋值。

 

 


 

OpenGL ES 3.0新功能(碎碎念)

 

纹理

 

sRGB纹理和帧缓冲区——允许应用程序执行伽马校正渲染。

2D纹理数组——保存一组2D纹理的纹理目标。

3D纹理——一些OpenGL ES 2.0实现通过扩展支持3D纹理,而OpenGL ES3.0将此作为强制的功能。

深度纹理和阴影比较——启用存储在纹理中的深度缓冲区。

无缝立方图——立方图可以进行采样如过滤来使用相邻面的数据并删除接缝处的伪像。

浮点纹理——支持并可以过滤半浮点纹理(16位),也支持全浮点纹理(32位),但不能过滤。

 ETC2/EAC纹理压缩——OpenGL ES 3.0中强制支持ETC2/EAC格式。(ETC2/EAC的格式为RGB8,RGBA888和单通道及双通道有符号/无符号纹理数据)

整数纹理——OpenGL ES 3.0引人了渲染和读取保存为未规范化有符号或无符号8位、16位和32位整数纹理的能力。

其它纹理格式——OpenGL ES 3.0还包含了对特殊纹理格式的支持。(如11-11-10RGB浮点纹理、共享指数RGB 9-9-9-5纹理、10-10-10-2整数纹理以及8位分量有符号规范化纹理)

非2幂次纹理(NPOT)——纹理现在可以指定为不为2的幂次尺寸。

纹理细节级别(LOD)——现在可以强制使用用于确定读取哪个Mipmap的LOD参数。

纹理调配——允许独立控制纹理数据每个通道(R、G、B、A)在着色器中的映射。

不可变纹理——为应用程序提供在加载数据之前指定纹理格式和大小的机制。

最小尺寸增大——OpenGL ES 3.0支持远大于OpenGL ES 2.0的纹理资源。

 

  


 

着色器:

 

二进制程序文件——完全链接过的二进制程序文件可以保存为离线二进制格式,运行时不需要链接步骤。

强制的在线编译器——在OpenGL ES 3.0中,所有实现都有在线着色器编译器。

非方对阵——支持方阵之外的新矩阵类型,并在API中增加了相关的统一调用。

全整数支持——支持整数(以及无符号整数)标量和向量类型以及全整数操作。

质心采样——避免在多重采构时产生伪像。

平面/平滑插值程序——插值留序可以显式声明为平面或者平滑着色。

统一变量块——统一变量值可以组合为统一变量块,可以更高效地加载,共享。

布局限定符——显式绑定着色器源代码中的位置,还用于控制统一变量块的内存布局。

实例和顶点ID——可以在顶点着色器中访问顶点索引,实例渲染中访问实例ID。

片段深度——不依赖差值,显式控制当前片段的深度值。

新的内建函数——支持新的纹理功能、片段导数、半浮点数据转换和矩阵及数学运算。

宽松限制——着色器不再限于指令长度,支持变量为基础的循环和分支和数组索引.

 

 


 

几何形状

 

变换反馈——可以在缓冲区对象中捕捉顶点着色器的输出。

布尔遮挡查询——应用程序可以查询绘制调用的任何像素是否通过深度测试。

实例渲染——有效地渲染包含类似几何形状但是属性(变化矩阵、颜色或者大小)不同的对象。

图元重启——允许特殊的索引值表示新图元的开始。

新顶点格式——支持更多新的顶点格式。(包括10-10-10-2有符号和无符号规范化顶点属性;8位、16位和132位整数属性;以及16位半浮点)

 

 


 

缓冲区对象:

 

统一变量缓冲区对象——为存储/绑定大的统一变量块提供高效的方法。

顶点数组对象——提供绑定和在顶点数组状态之间切换的高效方法。

采样器对象——将采样器状态(纹理循环模式和过滤)与纹理对象分离。

同步对象——为应用程序提供检查一组操作是否在GPU上完成执行的机制。

像素缓冲对象——使应用程序能够执行对像素操作和纹理传输操作的异步数据传输。

缓冲区子界映射——使应用程序能够映射缓冲区的一个子区域,供CPU访问。

缓冲区对象间拷贝——提供了高效地从不同的缓冲区对象互相传输数据的机制,不需要CPU干预。

 

 


 

帧缓冲区

 

多重渲染目标(MRT)——允许应用程序同时渲染到多个颜色缓冲区。

多重采样渲染缓冲区——使应用程序能够渲染到具备多重采样抗锯齿功能的屏幕外帧缓冲区。

帧缓冲区失效提示——为应用程序提供了通知驱动程序不再需要帧缓冲区内容的机制。

新的混合方程式——新增支持最大值/最小值函数作为混合方程。

 


 

参考

 

【技术美术百人计划】图形 1.4 PC手机图形API介绍

Adreno维基百科

 

跳转回百人合集

posted @ 2022-01-05 23:59  anesu  阅读(386)  评论(0编辑  收藏  举报