比较轻松不带脑子的一节

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

笔记

概念

  • 应用端:调用图形API的程序。写个hello world里面调了个api就属于应用端。
  • 图元:要渲染的几何物体。
  • 纹理:就是图片。
  • 纹素:纹理的基本单元,还不是像素。
  • 顶点数组:包含图元各个顶点坐标的数组。
  • 顶点缓冲区:显存中存放顶点数组的一块缓冲区。
  • 顶点着色器:进行顶点变换操作的着色器。
  • 片元着色器:进行片元操作的着色器。

三种图形API

  1. OpenGL:Khronos制定。Windows、Linux、MacOS上支持。
  2. DIrectX:微软制定。Windows、Xbox上使用。
  3. 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不讲人话。相信也没人看。

纹理

  1. sRGB纹理和帧缓冲区:方便着色器在线性空间下操作。
  2. 2D纹理数组:方便帧动画实现。
  3. 3D纹理
  4. 深度纹理和阴影比较
  5. 无缝立方图
  6. ETC2/EAC纹理压缩
  7. 各种乱七八糟的纹理支持
  8. 流化mipmap
  9. 纹理调配
  10. 不可变纹理。优化性能。
  11. 纹理大小限制提高。

着色器

  1. 加载链接过的二进制程序
  2. 强制在线编译着色器
  3. 方阵之外的矩阵类型
  4. 完善整数支持
  5. 质心采样
  6. 允许显式声明插值类型
  7. 统一变量块,加载更快,方便多着色器间共享。
  8. layout属性。写起来更方便。
  9. 可访问实例ID、顶点ID。
  10. 可控制片段深度值。
  11. 更多内建函数
  12. 放宽一些着色器限制

几何形状

  1. 在帧缓冲区获取顶点着色器输出
  2. 应用程序中查询一个像素是否通过深度测试
  3. 有效地渲染相同的几何体
  4. 图元重启
  5. 支持更多的顶点格式

缓冲区对象

  1. 统一变量块。多个变量一起打包。减少变量绑定代价。
  2. 顶点数组对象
  3. 分离采样器对象和纹理对象
  4. fence。等待GPU操作进行同步。
  5. 提供异步传输机制
  6. 子缓冲区映射。CPU操作不需要获取整个缓冲区
  7. 缓冲区对象间数据拷贝不需要CPU参与

帧缓冲区

  1. MTR
  2. 多重采样渲染缓冲区
  3. 缓冲区失效提示
  4. 新的混合方式

骁龙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