3:OpenGL 渲染架构 & GPU-CPU 数据传输

OpenGL 渲染架构

3 OpenGL渲染架构.jpg

3个数据传递通道

Attribute

  • 用于传递数据到Vertex Shader,无法直接传递到Fragment Shader

  • 可以将数据先传入Vertex Shader (图中的&some Ins),不作处理/作处理 的数据被间接传递到Fragment Shader (这部分数据被包含在图中的Ins)。

  • 传递对每个顶点都要做改变的数据元素 (经常发生改变的参数),如:

    • 顶点数据,x, y, z, w
    • 颜色数据
    • 纹理坐标 (图片映射坐标),实际是通过Vertex Shader传递给Fragment Shader
    • 光照法线
    • (需要经常变的) 投影矩阵,模型矩阵

Uniforms

  • 能传递到Vertex ShaderFragment Shader

  • 用于传递比较固定的参数,处理批次任务的参数,如:

    • 做图形旋转时用到的旋转矩阵
    • 视频颜色空间YUV转显示器颜色空间RGB的变换矩阵
    • 时间戳

Texture Data

  • 能传递到Vertex ShaderFragment Shader

  • 传递:

    • 图片
    • 地形信息等大型数据

其他

  • 经过Vertex Shader处理后,就已经得到各个顶点的NDC Space (规范化设备坐标),这部分数据将会连同 其他的参数/数据 传入下一步,进行Primitive Assembly (图元装配)。

  • 很明显,用户只能设置Primitive Assembly (图元装配) 的参数,而无法对其过程进行操作。

GPU-CPU 数据传输

简单过程

2-1 CPU-GPU数据传输简图.jpg

详细过程

2-2 CPU-GPU数据传输详图.jpg

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/

你可能感兴趣的:(3:OpenGL 渲染架构 & GPU-CPU 数据传输)