学习地址
目录
7.1 说出支持OpenGL ES 3.2的骁龙GPU型号有哪些?
1 主流3个API
三个分别是:DirectX, OpenGL, OpenGL ES
科纳斯Khronos Group定义了OpenGL
微软自己定义了DirectX
OpenGL ES 又OpenGL发展而来。
1.1 PC和手机都对应支持哪些API?
手机——无论是Android还是IOS都支持OpenGL ES
电脑——Windows系统支持DirectX和OpenGL,Linux/Mac(Unix)系统支持OpenGL
1.2 Khronos都有哪些开放标准?
开放标准以下顺序逐渐发展:
OpenGL --> OpenGL ES --> OpenGL SC --> OpenCL --> SPIR --> Vulkan
2 OpenGL ES各种版本一览
OpenGL ES Overview - The Khronos Group Inc
直接放上了Khronos官网页面介绍OpenGL ES不同版本预览的截图,能看到很清楚的描述了从1.X到3.2每一个版本专注于什么。
OpenGL ES 2.0——引入可编程着色器,弃用了1.x中需对固定功能
OpenGL ES 3.x——在功能强大的2.0基础上增加了更多东西,例如多个渲染目标 multiple render targets、标准化纹理压缩 texturing capabilities、新的着色语言等等。
3 OpenGL ES 2.0和3.0对比
3.1 管线一览
3.2 相同点
相同点显而易见,与1.x相比,OpenGL ES 2.0和OpenGL ES 3.0都是可编程的图形管线,开发者可以自己编写管线中的顶点着色器和片元着色器,算是抛弃了固定函数着色器这个只能完成一些简单效果的古老着色器。
3.3 不同点
以下讨论不同点会主要从OpenGL ES 3.0所具备的特点入手。
3.3.1 兼容性
OpenGL ES 3.0是向下兼容的,2.0编写的应用程序可以在3.0中继续使用,高版本兼容低版本。
3.3.2 加入新的功能(第5节详细讲述)
OpenGL ES 3.0引入了新的功能
- 阴影贴图
- 体渲染(volume rendering):【技术美术百人计划】图形 5.3 体渲染基础 (bilibili.com)
- 基于GPU的粒子动画
- 几何形状实体化
- 纹理压缩:【技术美术百人计划】图形 3.6 纹理压缩——包体瘦身术 (bilibili.com)
- 伽马矫正
3.3.3 渲染管线区别
与1.x和2.0版本相比,3.0移除了Alpha测试(Alpha Test)和逻辑操作(LogicOp)两个部分,因为片元着色器可以抛弃片元,因此透明度测试可以在片元着色器中进行,移除逻辑操作是因为他很少被使用。
3.4 着色器脚本编写发生变化
这部分讨论也从3.0入手。
3.4.1 版本声明
3.0必须在脚本中生命为指定使用OpenGL ES 3.0版本
#version 300 es
layout(location = 0) in vec4 vPosition;
void main(){
gl_Position = vPosition;
}
如果不添加#version 300 es则默认使用2.0版本。
3.4.2 输入输出
3.0新增了in,out,inout关键字,用来取代attribute和varying关键字,同时删除了gl_FragColor和gl_FragData,字段输出可以用out声明。
3.4.3 变量赋值
3.0中可以直接使用layout对指定位置的变量赋值。
layout(location = 1) uniform float a;
3.0可以直接赋值
GLES30.glUniform1f(1, 1f);
2.0还需要用更复杂的形式
GLES20.glUniform1f(GLES20.glGetAttribLocation(program, "a"), 1f);
4 OpenGL ES 3.0的新功能
加入了一些新的功能和特性,主要围绕纹理、着色器、几何形状、缓冲区对象、帧缓冲区等。
4.1 纹理
有14个变化:
1 sRGB纹理和帧缓冲区
3.0允许应用程序执行伽马矫正渲染。纹理可以保存经过伽马矫正后的sRGB空间,在着色器读取时反矫正到线性空间,然后在输出到帧缓冲区时转换回sRGB伽马矫正空间,通过在线性空间中正确地进行照明和其他计算,可能得到更高的视觉保真度。
伽马矫正将在后续重点讲到:【技术美术百人计划】图形 2.6 伽马校正_哔哩哔哩_bilibili
sRGB我认为会在色彩空间讲到:【技术美术百人计划】图形 2.1 色彩空间介绍 (bilibili.com)
2 2D纹理数组
能保存一组2D纹理的纹理目标,可以用于执行纹理动画。在2D纹理数组出现时,纹理动画一般通过在单个2D纹理平铺动画帧并修改纹理坐标、改变动画帧实现的,有了2D纹理数组,可以很方便地指定。
3 3D纹理
2.0中通过拓展支持3D纹理,而3.0将3D纹理作为了强制功能。
4 深度纹理和阴影比较
启用储存在纹理中的深度缓存区。深度纹理最常见地用途是渲染阴影,这时深度缓存区从光源的角度渲染,用于在渲染场景时进行比较,判定片段是否在阴影中。
5 无缝立方图
3.0之前的立方图渲染可能在立方图各面之间的边界产生伪像,3.0中立方图可以使用相邻面数据并删除接缝处的伪像。
6 浮点纹理
3.0拓展了支持的纹理格式,支持并可以过滤16位的半浮点纹理,可以支持但无法过滤32位的全浮点纹理。
7 ETC2/EAC纹理压缩
3.0强制支持ETC2/EAC纹理压缩,带来更好的性能并减少GPU内存占用。
除此之外,还有整数纹理、其他纹理格式、非2幂次纹理、纹理细节级别(LOD)——可以强制基本和最大Mipmap级别、纹理调配、不可变纹理、纹理资源最小尺寸。
这之后的几个点都是简单的罗列新功能,水平有限也没办法每个名词都解释到位~
4.2 着色器
12个变化,分别是:二进制程序文件、强制的在线编译器、非方矩阵、全整数支持、质心采样、统一变量块、布局限定符、片段深度、新的内建函数、放宽了着色器限制。
4.3 几何形状
变换反馈、布尔遮挡查询、实例渲染、图元重启、新顶点格式。
4.4 缓冲区对象
引入了许多新的缓冲区对象——统一变量缓冲区对象、顶点数组对象、采样器对象、同步对象、像素缓冲对象、缓冲区子界映射、缓冲区对象拷贝。
4.5 帧缓冲区
增添了MRT技术——多重渲染目标、多重采样渲染缓冲区、帧缓冲区失效提示等。
5 骁龙Adreno
目前的手机芯片厂商有高通、海思麒麟、联发科、三星还有苹果。移动端GPU主要有Adreno, Mali, powerVR, 以及苹果自研GPU核心。
骁龙Adreno是由高通开发的SIP核GPU并用于其自家的SoC,该核心从事GPU开发工作。
SoC是什么?早期的移动设备CPU和GPU是分开的,后来随着技术的进步,手机的GPU和其他运算单元集成在一起,统称为SoC。
不同版本Adreno支持的OpenGL ES版本
从Adreno200开始,支持OpenGL ES 2.0
从Adreno302开始,支持OpenGL ES 3.0
从Adreno405开始,支持OpenGL ES 3.1
从Adreno420开始,支持OpenGL ES 3.2
6 Vulkan
这部分参考了
Vulkan相比于OpenGL、DX12、Metal和Mantle有什么优势、劣势? - 知乎 (zhihu.com)
大概搜索了一下Vulkan的历史:
2013年AMD主导开发了Mantle图形API——新一代的面向3D游戏API,它特点在于开发人员可以直接操作GPU底层,提高硬件利用率和游戏性能,影响效果显著,微软也顺着Mantle的开发思路开发了DX 12。
但由于AMD影响力不足,Mantle就没能像Khronos的OpenGL和微软的DX一样称为行业的标准,2015年AMD宣布不再维护Mantle,领域又需要新一代的跨平台GPU API,且对新一代API有更高的诉求。于是Khronos在Mantle的基础上推出了Vulkan,Vulkan应运而生。
Vulkan的几项优势
- GPU做更少的事情,把内存管理、多线程管理等控制权交给了开发,虽然增加了API的使用难度,但提升了性能!
- Vulkan引入了 command buffer 概念,每个线程都可以往 command buffer提交渲染命令,CPU的多核多线程优势得以充分发挥!
- 可移植性——可以实现跨平台移植!
7 课程布置的拓展任务
7.1 说出支持OpenGL ES 3.2的骁龙GPU型号有哪些?
420及429之后的430、505、506、508、509等等往后的版本
7.2 你们怎么看待Valken的?
系统兼容性是毋庸置疑的。很多公司都在大力支持,这一点对于发展来说太重要了。
但由于Vulkan更底层,开发难度肯定会更大(易用性低),但对于硬件的优化也会更加好做。
相比于OpenGL单线程渲染,Vulkan支持多线程啊!这就意味着又多了一个可以优化的角度!
一番对比的话,简要总结优劣势:
优——跨平台、性能、效率提升,可控度更高
劣——没做到全平台第一支持?比如目前我玩的游戏只有大表哥2有Vulkan的选项。