OpenGL 渲染架构
3个数据传递通道
Attribute
用于传递数据到
Vertex Shader
,无法直接传递到Fragment Shader
。可以将数据先传入
Vertex Shader
(图中的&some Ins
),不作处理/作处理 的数据被间接传递到Fragment Shader
(这部分数据被包含在图中的Ins
)。-
传递对每个顶点都要做改变的数据元素 (经常发生改变的参数),如:
- 顶点数据,
x, y, z, w
- 颜色数据
- 纹理坐标 (图片映射坐标),实际是通过
Vertex Shader
传递给Fragment Shader
- 光照法线
- (需要经常变的) 投影矩阵,模型矩阵
- 顶点数据,
Uniforms
能传递到
Vertex Shader
和Fragment Shader
。-
用于传递比较固定的参数,处理批次任务的参数,如:
- 做图形旋转时用到的旋转矩阵
- 视频颜色空间
YUV
转显示器颜色空间RGB
的变换矩阵 - 时间戳
Texture Data
能传递到
Vertex Shader
和Fragment Shader
。-
传递:
- 图片
- 地形信息等大型数据
其他
经过
Vertex Shader
处理后,就已经得到各个顶点的NDC Space
(规范化设备坐标),这部分数据将会连同 其他的参数/数据 传入下一步,进行Primitive Assembly
(图元装配)。很明显,用户只能设置
Primitive Assembly
(图元装配) 的参数,而无法对其过程进行操作。
GPU-CPU 数据传输
简单过程
详细过程
MMIO (Memory-mapping I/O)
以前的做法:访问 I/O设备 需要做额外的程序/接口处理。
MMIO 的做法:将 I/O设备 映射到内存空间,如此一来,访问 PCI-E显卡上的帧缓存等,就像读取内存一样简单。
CPU-GPU 基于 MMIO 进行交流。
Unified Virtual Address Space
- 内存和显存使用统一的虚拟地址,这更加提升了 MMIO 的便捷。
DMA (Direct Memory Access)
使硬件之间可以传输数据,而不需要依赖 CPU,避免无意义的 CPU 资源占用。
由 MMIO 进行命令控制
Context
代表 GPU 计算的状态
在 GPU 拥有自己的虚拟地址
一个 GPU 可同时存在多个 context
Channel
是 GPU 的一个硬件单元
接收来自 context 的命令流 (Command Stream),传入运算核心。
一个 context 可拥有多个 Channel,一个 Channel 只对应一个 context。
CPU 能通过 MMIO 访问显存中的一个特殊区域,这个区域专门存放 Channel
命令。所以说 Channel 的任何命令都是由 CPU 发出。
参考
计算机那些事(8)——图形图像渲染原理 http://chuquan.me/2018/08/26/graphics-rending-principle-gpu/
NVIDIA GPU 硬件介绍 https://www.dazhuanlan.com/2019/08/15/5d55114f9187c/