TA百人计划 图形 1.4 PC手机图形API介绍
比较轻松不带脑子的一节
地址:【技术美术百人计划】图形 1.4 PC手机图形API介绍
笔记
概念
- 应用端:调用图形API的程序。写个hello world里面调了个api就属于应用端。
- 图元:要渲染的几何物体。
- 纹理:就是图片。
- 纹素:纹理的基本单元,还不是像素。
- 顶点数组:包含图元各个顶点坐标的数组。
- 顶点缓冲区:显存中存放顶点数组的一块缓冲区。
- 顶点着色器:进行顶点变换操作的着色器。
- 片元着色器:进行片元操作的着色器。
三种图形API
- OpenGL:Khronos制定。Windows、Linux、MacOS上支持。
- DIrectX:微软制定。Windows、Xbox上使用。
- OpenGL ES:iOS、Android上使用。网页上WebGL也用的OpenGL ES规范。
OpenGL ES
为移动端制定的图形API标准。版本:OpenGL ES 1.x、OpenGL ES 2.0、OpenGL ES 3.0
OpenGL ES 1.x只支持固定功能渲染管线。OpenGL2.0开始使用可编程渲染管线
OpenGL ES 3.0兼容OpenGL ES 2.0
OpenGL ES 3.0支持阴影贴图、体渲染、基于GPU的粒子动画、几何形状实例化、纹理压缩、伽马矫正。
OpenGL ES 3.0移除Alpha测试(需要做片段着色器中做)、逻辑操作(没人用)。
GLSL编写
// 必须指定使用的版本。这里指定为OpenGL ES 3.0
// OpenGL ES 2.0声明为 #version 100 es。因为
// OpenGL ES 2.0才开始支持可编程渲染管线
#version 300 es
// 声明输入输出参数
// 3.0中输出参数用in 输出参数用out
// 不再使用varying和attribute
// 不再使用gl_FragColor和gl_FragData
// 需要自己声明out输出
layout(location = 0) in vec4 vPosition;
// 3.0中可以直接使用layout对指定位置赋值
// 应用端代码中GLES30.glUniform1f(1, 1f);
// 2.0中 GLES20.glUniform1f(GLES20.glGetAttribLocation(program, "a"), 1f);
layout(location = 1) uniform float a;
void main(){
gl_Position = vPosition;
}
OpenGL ES 3.0新功能
ppt不讲人话。相信也没人看。
纹理
- sRGB纹理和帧缓冲区:方便着色器在线性空间下操作。
- 2D纹理数组:方便帧动画实现。
- 3D纹理
- 深度纹理和阴影比较
- 无缝立方图
- ETC2/EAC纹理压缩
- 各种乱七八糟的纹理支持
- 流化mipmap
- 纹理调配
- 不可变纹理。优化性能。
- 纹理大小限制提高。
着色器
- 加载链接过的二进制程序
- 强制在线编译着色器
- 方阵之外的矩阵类型
- 完善整数支持
- 质心采样
- 允许显式声明插值类型
- 统一变量块,加载更快,方便多着色器间共享。
- layout属性。写起来更方便。
- 可访问实例ID、顶点ID。
- 可控制片段深度值。
- 更多内建函数
- 放宽一些着色器限制
几何形状
- 在帧缓冲区获取顶点着色器输出
- 应用程序中查询一个像素是否通过深度测试
- 有效地渲染相同的几何体
- 图元重启
- 支持更多的顶点格式
缓冲区对象
- 统一变量块。多个变量一起打包。减少变量绑定代价。
- 顶点数组对象
- 分离采样器对象和纹理对象
- fence。等待GPU操作进行同步。
- 提供异步传输机制
- 子缓冲区映射。CPU操作不需要获取整个缓冲区
- 缓冲区对象间数据拷贝不需要CPU参与
帧缓冲区
- MTR
- 多重采样渲染缓冲区
- 缓冲区失效提示
- 新的混合方式
骁龙Adreno支持的OpenGL ES版本
https://zh.wikipedia.org/wiki/Adreno
https://zh.wikipedia.org/wiki/%E9%AB%98%E9%80%9A%E9%A9%8D%E9%BE%8D%E5%85%83%E4%BB%B6%E5%88%97%E8%A1%A8#Snapdragon_888
Adreno320开始支持完整的OpenGL ES 3.0
作业
支持OpenGL ES 3.2的骁龙GPU型号
- Adreno 420
- Adreno 430
- Adreno 5xx
- Adreno 6xx
怎么看vulkan
大概接下来了会跟OpenGL、DirectX一直并存下去吧。至少替代掉其中一个不太可能。
很多人不知道除了OpenGL、DirectX外还有一个Glide。这个Glide是Voodoo显卡的公司3dfx搞出来的。早些时候3dfx的显卡是吊打nvidia的,基本上买显卡都只买3dfx的Voodoo系列。
也就是因为当时的垄断地位,大家都乐意用Glide来开发游戏。但是后面3dfx不思进取把自己给搞没了,Glide也不支持新的显卡特性,自然而然的被OpenGL、DirectX替代掉。
现在这种局面OpenGL不太可能放弃维护,DirectX因为新特性跟进特别快,性能高,一直都是PC平台的主力图形库,也不太可能被替代。
从vulkan主打的特性看,一个是跨平台,一个是更高效的GPU操作API。从目前同时支持OpenGL和vulkan的游戏来看,vulkan下的性能确实要比OpenGL高上不少,但是使用难度也要高很多。
原先的工作流程,辅助工具都是围绕OpenGL和DX来做的,这些基础组件没有适配vulkan的话,这一部分用户可能还是继续使用OpenGL或者DirectX。
而新进干员可能因为目前的图形学教程都是按照OpenGL来的,也继续用着OpenGL(有国内CentOS环境的感觉)。
最终会用vulkan的群体大概就是大厂需要压榨GPU性能,才会特别去使用vulkan进行开发了吧。
哦。还有一部分,就是单纯喜欢vulkan的人,自己搞着玩。有点像Rust,公司不喜欢用,但是开发者都很喜欢,自己做的小东西都偷着用。比如说这个Real-ESRGAN-ncnn-vulkan