图形硬件 (Graphics Hardware)

23.1 光栅化 (Rasterization)

光栅化的核心任务是确定哪些像素(或者说样本点)被一个图元(通常是三角形)所覆盖,并将几何图元转化为屏幕上的像素片段(fragments)。这是连接几何处理阶段和像素处理阶段的关键桥梁。

核心观点

  • 现代 GPU 的光栅化过程是高度并行基于瓦片 (Tile-based) 的,旨在最大化缓存局部性 (cache locality) 和计算效率。
  • 整个过程围绕着边缘函数 (Edge Function) 的高效计算和分层遍历 (Hierarchical Traversal) 展开。

关键流程与术语

  1. 三角形设置 (Triangle Setup)

    • 描述: 在正式开始遍历像素之前,GPU 会对每个三角形进行一次预计算。
    • 任务: 计算出在整个三角形光栅化过程中保持不变的常量,主要是边缘方程的系数 () 和属性插值所需的常量。
  2. 边缘函数 (Edge Function)

    • 描述: 判断一个点是否在三角形内部的核心数学工具。对于三角形的每条边,都可以定义一个线性函数:
    • 判断规则:
      • :点在边的“内侧”。
      • :点在边的“外侧”。
      • :点恰好在边上。
    • 内部测试 (Inside Test): 一个点 在三角形内部,当且仅当它满足所有三条边
    • 增量计算 (Incremental Calculation): 边缘函数是线性的,这使得计算相邻像素的值非常高效。例如,从 移动到 硬件利用这个特性可以极快地计算一整块像素的覆盖情况。
  3. Quad 处理与 Quad Overshading

    • Quad: 2x2 的像素块,是 GPU 并行处理像素的最小单元。这么做的主要原因是方便计算梯度/导数 (Gradients/Derivatives),这对于纹理的 Mipmap 选择至关重要。
    • Quad Overshading (四边形过度着色): GPU 的一个重要工作方式是,只要一个 Quad 中有任何一个像素被三角形覆盖,整个 Quad 中的 4 个像素(包括未被覆盖的辅助像素 (auxiliary pixels))都会被激活并执行像素着色器。
    • 性能影响: 对于非常小的三角形,这种方式会导致大量无效计算(着色了三角形外的像素),造成性能浪费。
  4. 决胜局规则 (Tie-Breaker Rule)

    • 目的: 解决当像素中心点恰好落在两个共享三角形的边上时,应该归属于哪个三角形的问题,以避免像素被重复绘制或遗漏。
    • 常用规则: 左上规则 (Top-Left Rule)。如果一条边是“上边”或“左边”,那么落在该边上的像素中心点被认为在三角形内部。
  5. 分层/瓦片化遍历 (Hierarchical/Tiled Traversal)

    • 动机: 传统的逐行扫描(scanline)方式对缓存非常不友好。当处理一个大三角形时,处理下一行像素时,上一行访问过的纹理、深度等数据可能已经被踢出缓存。
    • 核心思想: 将屏幕划分为固定大小的瓦片 (Tile)(如 8x816x16 像素),以 Tile 为单位进行遍历。
    • 流程:
      1. 粗略测试:判断三角形的包围盒与哪些 Tile 相交。
      2. 精细测试:对于相交的 Tile,再用边缘函数进行逐像素或更小块的测试。
    • 优势: 极大地提升了数据访问的局部性,显著提高了纹理、颜色和深度缓冲的缓存命中率
  6. 保护带裁剪 (Guard-Band Clipping)

    • 目的: 完整的三维裁剪(尤其是在屏幕边缘)是一个复杂且可能增加图元数量的操作。
    • 方法: GPU 在视口周围定义一个更大的虚拟区域,即保护带 (Guard-Band)。如果三角形的顶点完全落在这个保护带内,即使部分在屏幕外,硬件也不会对其执行完整的裁剪算法,而是依赖光栅化阶段自然地只生成屏幕内的像素。这是一种高效的裁剪优化

23.1.1 属性插值 (Interpolation)

核心任务: 根据三角形顶点上的属性(如颜色、法线、纹理坐标),计算出三角形内部每个像素的对应属性值。

  1. 重心坐标 (Barycentric Coordinates)

    • 描述: 在三角形所在平面内定义任何一点位置的坐标系,用三个标量 表示,满足 。它是属性插值的数学基础
    • 插值公式:
    • 与边缘函数的关系: 重心坐标可以通过边缘函数的值高效计算得出,因为边缘函数的值与子三角形的面积成正比。 分母对于同一个三角形是常数,可以在三角形设置阶段预先计算。
  2. 透视校正插值 (Perspective-Correct Interpolation)

    • 问题: 在透视投影下,直接在 2D 屏幕空间对属性进行线性插值是错误的,会导致纹理扭曲等视觉瑕疵(如图 23.6 所示)。
    • 解决方案:
      • 核心思想: 属性 本身在屏幕空间不是线性的,但 是线性的(其中 是顶点的齐次坐标分量)。
      • 硬件实现:
        1. 三角形设置阶段,计算每个顶点的
        2. 光栅化过程中,使用屏幕空间的重心坐标 进行线性插值。
        3. 像素着色器中,通过逐像素进行一次除法来恢复正确的属性值
    • 透视正确的重心坐标: 也可以先计算出透视正确的重心坐标 ,然后用它来插值所有属性。这需要对边缘函数进行 分量的加权。

23.1.2 保守光栅化 (Conservative Rasterization)

核心观点: 一种扩展的光栅化规则,它会生成所有与三角形有任何部分重叠的像素,而不仅仅是那些像素中心被覆盖的像素。

  • 标准光栅化: 只有像素中心在三角形内,才生成片段。

  • 保守光栅化类型:

    • 高估CR (Overestimated CR / OCR): 覆盖所有与三角形有任何接触的像素。生成的片段集合是标准光栅化的一个超集。
    • 低估CR (Underestimated CR / UCR): 仅覆盖完全被三角形包裹的像素。生成的片段集合是标准光栅化的一个子集。
  • 主要应用:

    • 基于可见性的算法(如遮挡剔除
    • 碰撞检测
    • 高级阴影技术
    • 体素化 (Voxelization)

23.2 大规模计算和调度 (Massively Parallel Computation and Scheduling)

核心观点

  • 现代 GPU 的强大计算能力源于其大规模并行架构,它牺牲了 CPU 的复杂控制逻辑(如分支预测),转而将绝大部分芯片面积用于部署成千上万个简单的计算单元。
  • 其核心是 SIMD (单指令,多数据) 模型,通过 Warp/Wavefront 调度来高效执行着色器程序并隐藏内存延迟

关键架构组件与术语

  1. 统一着色器架构 (Unified Shader Architecture)

    • 描述: GPU 内部不再有专门用于顶点、像素或几何着色的独立硬件单元。取而代之的是一个庞大的、统一的计算单元池,可以执行任何类型的着色器程序。
    • 核心单元: ALU (算术逻辑单元)。这是一个相对简单的处理器,优化了浮点运算(特别是 FMA - 融合乘加指令),但缺少 CPU 的复杂功能。
  2. SIMD 处理模型

    • SIMD (Single Instruction, Multiple Data): 一条指令同时在多个数据上执行。这是 GPU 并行计算的基石。
    • Warp (NVIDIA) / Wavefront (AMD): 线程束。这是 GPU 调度和执行的基本单元,通常由 32 或 64 个线程组成。一个 Warp 中的所有线程以锁步 (lock-step) 方式执行完全相同的指令序列,但处理的是不同的数据(例如,不同的顶点或像素)。
    • 多处理器 (Multiprocessor - MP): 这是 GPU 的一个核心构建块,也被称为 流式多处理器 (SM - NVIDIA)计算单元 (CU - AMD)。一个 MP 包含:
      • 多个 SIMD 引擎(即 ALU 阵列)。
      • 一个 Warp 调度器
      • L1 缓存和本地数据存储 (LDS)。
      • 纹理单元 (Texture Units)。
  3. Warp 调度器 与 延迟隐藏

    • 任务: 管理分配到 MP 上的所有 Warps。
    • 延迟隐藏 (Latency Hiding): 这是 GPU 高效运行的关键机制。当一个 Warp 因为等待数据(例如,从内存中读取纹理)而停顿时,调度器会立即、且几乎无开销地切换到另一个已就绪的 Warp,从而让计算单元 (ALU) 始终保持繁忙,避免了性能浪费。
  4. 利用的并行性类型

    • 线程级并行 (Thread-Level Parallelism): 每个顶点或像素都可以看作一个独立的线程,它们之间没有依赖关系。
    • 数据级并行 (Data-Level Parallelism): 在一个 Warp 内部,一条指令作用于所有线程的数据。
    • 指令级并行 (Instruction-Level Parallelism): 在某些情况下,处理器可以同时执行多条相互独立的指令。

23.3 延迟和占用率 (Latency and Occupancy)

核心观点

  • 延迟 (Latency) 是 GPU 性能的主要杀手,尤其是访问内存的延迟。
  • 占用率 (Occupancy) 是衡量 MP 上有多少 Warp 处于活跃状态的指标,高占用率是实现延迟隐藏的关键,因为它为调度器提供了更多可切换的 Warp 选项。

关键术语与公式

  1. 延迟 (Latency)

    • 定义: 从发起一个请求(如读取内存)到收到结果之间的时间差。纹理读取的延迟可能长达数百甚至上千个时钟周期。
  2. 占用率 (Occupancy)

    • 定义: MP 上实际活跃的 Warp 数量与硬件支持的最大 Warp 数量的比率。
    • 影响因素: 占用率主要受着色器资源使用量的限制,最常见的是寄存器 (Register) 使用量
    • 权衡:
      • 高占用率: 通常是好事。有更多的活跃 Warp 意味着调度器在当前 Warp 停顿时,有很大概率找到另一个就绪的 Warp 来继续执行,从而有效隐藏延迟。
      • 低占用率: 当着色器过于复杂,使用大量寄存器时,会导致能同时驻留在 MP 上的 Warp 数量减少,占用率降低。这使得延迟隐藏变得困难,ALU 可能会频繁空闲。
      • 注意: 极高的占用率有时也可能因过度竞争缓存资源而导致性能下降。
  3. CPU-GPU 延迟

    • 描述: 从 GPU 回读数据到 CPU 是一个高成本操作,通常会导致 CPU 流水线停滞。应尽量避免同步回读。
    • 异步查询: 遮挡查询 (Occlusion Query) 是一个很好的异步机制,CPU 发起查询后可以继续做其他工作,稍后再检查结果。

23.4 内存架构和总线 (Memory Architecture and Buses)

核心观点

  • 数据在 GPU 内外不同组件之间的传输速度,即带宽 (Bandwidth),是图形渲染的另一个主要瓶颈。
  • 不同的硬件平台采用不同的内存架构来平衡成本和性能。

关键架构类型

  1. 独立显存 (Dedicated Video Memory)

    • 平台: PC 上的独立显卡 (dGPU)。
    • 描述: GPU 拥有自己专属的高速内存(VRAM/GDDR),通过极宽的总线与 GPU 核心连接,带宽极高(数百 GB/s)。
    • 数据流: CPU 数据需要通过相对较慢的 PCIe 总线(几十 GB/s)传输到显存中。因此,静态数据(如模型网格)应尽早上传并保留在显存中。
  2. 统一内存架构 (Unified Memory Architecture - UMA)

    • 平台: 游戏主机、移动设备、PC 上的集成显卡 (iGPU)。
    • 描述: CPU 和 GPU 共享同一块物理系统内存
    • 优势: CPU 和 GPU 之间的数据共享非常方便,延迟低。
    • 劣势: CPU 和 GPU 需要争抢内存带宽,总带宽通常低于独立显存。

23.5 缓存和压缩 (Caching and Compression)

核心观点

  • 为了缓解带宽压力,GPU 在硬件层面广泛使用缓存 (Caching)无损压缩 (Lossless Compression) 技术。
  • 这些技术对开发者是透明的,但理解其原理有助于编写出对硬件更友好的渲染代码。

关键技术

  1. 缓存 (Caching)

    • 目的: 利用内存访问的局部性 (locality of reference),减少对主内存的直接访问。
    • 实现: GPU 内部有多级缓存(L1, L2, L3)。将数据以瓦片 (Tile) 格式存储可以极大地提升缓存命中率。
  2. 无损压缩 (Lossless Compression)

    • 目的: 减少进出主内存的数据量,从而节约宝贵的内存带宽。注意:它不减少显存的占用空间,只在数据传输时起作用。
    • 应用: 主要用于渲染目标(颜色缓冲、深度缓冲)。
    • 工作原理:
      • 当一个 Tile 的数据要从缓存写入内存时,压缩器 (Compressor) 硬件会尝试对其进行压缩。
      • 当要从内存读取一个 Tile 时,解压器 (Decompressor) 硬件会将其解压。
      • 如果压缩失败(例如,数据内容过于随机),则直接存储未压缩的数据。
    • 分块表 (Tile Table): 一个核心的辅助数据结构,用于追踪每个 Tile 的状态(例如:已清除、已压缩、未压缩)。
    • 快速清除 (Fast Clear): 一个重要的优化。当调用 clear() 函数时,GPU 并不是真的去写每一个像素,而仅仅是将 Tile Table 中所有条目的状态标记为“已清除”。当这个 Tile 第一次被访问时,硬件才会真正填入清除颜色。这极大地节约了带宽。

23.6 颜色缓冲 (The Color Buffer)

核心观点

  • 颜色缓冲是渲染的最终输出目的地,其格式、显示方式和交换策略直接影响最终画质和流畅度。

关键概念

  1. 颜色深度 (Color Depth)

    • 真彩色 (True Color): 最常见的格式,每像素 24 或 32 位(RGBA 各 8 位),能提供约 1670 万种颜色。
    • 颜色条带 (Color Banding): 在低颜色深度下(如 16 位),平滑的颜色渐变会呈现出明显的阶梯状条纹。这是由于人眼的马赫带 (Mach banding) 效应而被放大了。
  2. 视频显示控制器 (Video Display Controller - VDC)

    • 描述: GPU 中负责读取颜色缓冲内容,并通过 HDMI、DisplayPort 等接口将其输出到显示器的硬件单元。
  3. 自适应同步 (Adaptive Sync)

    • 技术: AMD FreeSync / NVIDIA G-Sync
    • 目的: 解决画面撕裂 (Tearing) 问题。它使显示器的刷新率动态匹配 GPU 的帧渲染率,从而在不引入 VSync 延迟的情况下,获得平滑无撕裂的画面。
  4. 缓冲策略 (Buffering Strategies)

    • 单缓冲 (Single Buffering): 直接在显示的缓冲区上绘制。会产生撕裂,基本已不使用。
    • 双缓冲 (Double Buffering):
      • 使用一个前置缓冲 (Front Buffer) 用于显示,一个后置缓冲 (Back Buffer) 用于渲染。
      • 当一帧渲染完成后,在垂直同步 (vsync) 信号时,交换两个缓冲区的指针。
      • 优点: 彻底解决画面撕裂。
      • 缺点: 如果 GPU 渲染速度跟不上刷新率,帧率会骤降到刷新率的整数分之一(如 60 30 FPS),并且可能因等待 VSync 而造成 GPU 空闲。
    • 三缓冲 (Triple Buffering):
      • 使用一个前置缓冲和两个后置缓冲。
      • GPU 渲染完一帧后,可以不等 VSync,立即开始在第二个后置缓冲中渲染下一帧。
      • 优点: 相比双缓冲,能提供更平滑、更高的平均帧率,避免了 GPU 空闲。
      • 缺点: 增加了一帧的输入延迟

23.7 深度剔除、测试和缓冲 (Depth Culling, Testing, and Buffering)

核心观点

  • GPU 的深度管线是一个为性能优化而生的复杂系统,其首要目标是在昂贵的像素着色 (Pixel Shading) 发生之前,尽可能早地剔除掉被遮挡的像素
  • 这个过程是分层进行的,从粗略的块级剔除 (Tile-level Culling) 到精细的样本级测试 (Sample-level Testing)

关键技术与流程

  1. 深度精度 与 Z-Fighting

    • 问题: Z-Fighting (深度冲突) 是指当两个多边形在深度上非常接近时,由于深度缓冲区的精度限制,在渲染时会导致它们交错闪烁。
    • 深度分布: 对于透视投影,深度值在 Z-Buffer 中是非线性分布的,靠近摄像机的地方精度高,远离摄像机的地方精度低。理解这一点对于设置合适的近/远裁剪平面至关重要。
  2. 分层深度剔除 (Hierarchical-Z / HiZ)

    • 别名: Z-Culling
    • 层级: 在瓦片 (Tile) 级别进行,而非逐像素。
    • 核心思想: GPU 维护一个低分辨率的深度金字塔(HiZ 缓冲),其中每个单元格存储了对应屏幕区域(一个 Tile)内深度的最远值 ()
    • 剔除: 在光栅化一个新三角形之前,硬件会计算出这个三角形在某个 Tile 内可能达到的最近深度 ()。如果这个最近深度都比 HiZ 中记录的最远深度还要远,即 ,那么这个三角形在该 Tile 内一定被完全遮挡,可以安全地将整个 Tile 剔除,无需进行后续的逐像素处理。
  3. 早期深度测试 (Early-Z / Early Depth Test)

    • 层级: 在逐像素/逐样本级别进行。
    • 核心思想: 在 HiZ 剔除之后,但在执行像素着色器之前,硬件会执行常规的深度测试。如果一个像素片段(fragment)未能通过测试(即它被某个更近的物体遮挡),它就会被立即丢弃。
    • 巨大优势: 避免了对不可见像素执行昂贵的像素着色器,是现代 GPU 最重要的性能优化之一。
    • 失效条件: 在某些情况下,Early-Z 必须被禁用,转而使用后期深度测试 (Late Depth Test)(即在像素着色器之后测试)。这些情况包括:
      • 像素着色器修改了像素的深度值
      • 像素着色器使用了 discardclip 指令(因为着色器可能会主动丢弃像素)。
      • 像素着色器有副作用,例如写入 UAV (无序访问视图)
  4. Z-Prepass (深度预处理)

    • 描述: 这是一种渲染算法,而非纯硬件功能。它通过两次绘制场景来实现近似于“完美”的 Early-Z 效果。
    • 流程:
      1. Pass 1 (Z-Prepass): 遍历所有不透明物体,关闭颜色写入,只将它们的深度值写入深度缓冲区。
      2. Pass 2 (Shading Pass): 再次遍历所有不透明物体,但这次将深度测试函数设置为“相等 (Equal)”,并开启正常的颜色写入和像素着色。
    • 效果: 只有在 Z-Prepass 中“胜出”的、离相机最近的像素才会在第二次 Pass 中通过深度测试并被着色,从而确保每个像素只被着色一次
  5. 深度压缩 (Depth Compression)

    • 目的: 与颜色缓冲一样,为了节约内存带宽
    • 原理: 由于深度值在屏幕空间通常是局部线性的(表现为平滑的斜面),硬件可以使用高效的无损压缩算法,如存储平面方程增量编码 (delta encoding),来大幅减少读写深度缓冲所需的数据量。

23.8 纹理化 (Texturing)

核心观点

  • 纹理采样是渲染中最频繁的操作之一,GPU 内部集成了高度优化的固定功能硬件 (Fixed-Function Hardware)——纹理单元 (Texture Unit),来加速这一过程。
  • 高效的纹理化依赖于梯度计算 (Derivative Calculation)纹理缓存 (Texture Caching)优化的内存布局

关键技术

  1. 导数/梯度计算 (Derivatives for LOD)

    • 目的: 为了正确选择 Mipmap 层级和应用各项异性过滤,GPU 需要知道纹理坐标 相对于屏幕坐标 的变化率,即导数 (Derivatives)
    • 实现: GPU 并不进行复杂的符号微分。它利用 Quad (2x2 像素块) 的特性,通过计算相邻像素间纹理坐标的有限差分 (finite differences) 来近似求解导数。这就是为什么像素总是在 Quads 中被处理的根本原因。
  2. 纹理缓存 (Texture Caching)

    • 目的: 极大地减少对主显存的访问延迟和带宽消耗。
    • 原理: 利用纹理访问的空间局部性——相邻的像素很可能访问纹理上相邻的区域。
  3. 纹理内存布局 (Texture Storage Layout)

    • 问题: 简单的线性(逐行)存储方式对 2D 局部性不友好,不利于缓存效率。
    • 解决方案: 纹理在内存中并非线性存储,而是采用平铺 (Tiled)混合 (Swizzled) 模式。
    • Morton 序列 (Morton Order / Z-order curve): 一种常见的混合模式,它是一种空间填充曲线,能将 2D 空间上的邻近性更好地映射到 1D 的线性内存地址上,从而显著提高缓存命中率。

23.9 渲染架构 (Architectures)

核心观点

  • GPU 的并行渲染架构可以根据其**“排序 (Sort)”** 操作发生在哪一阶段进行分类。这个“排序”本质上是将几何图元分配到对应屏幕像素的过程。
  • 不同的架构在负载均衡 (Load Balancing)内存带宽 (Memory Bandwidth) 需求方面有各自的优缺点。

阿姆达尔定律 (Amdahl's Law)

  • 核心思想: 并行计算的整体性能提升,受限于程序中无法并行化的串行部分 其中, 是串行部分的比例, 是并行部分的加速倍数。这提醒我们,管线中最慢的串行环节将成为最终的瓶颈。

并行架构分类

  1. Sort-First

    • 排序位置: 几何处理之前
    • 工作方式: 将屏幕预先划分为区域,图元根据其覆盖的区域被分发到不同的、完整的渲染管线中。
    • 应用: 主要用于多台计算机协作渲染的大规模显示系统(如视频墙)。
  2. Sort-Middle (瓦片化渲染 / Tiled Rendering)

    • 排序位置: 几何处理之后,光栅化之前
    • 工作方式:
      1. 所有图元首先完成顶点着色等几何处理。
      2. 然后,将变换后的三角形排序并分配到屏幕空间的瓦片 (Tile) 中。
      3. 每个 Tile 被一个处理核心独立且完整地渲染,通常使用高速的片上内存 (On-chip Memory) 作为其颜色/深度缓冲。
      4. 当一个 Tile 渲染完成后,结果才被写回到主内存。
    • 代表: ARM Mali 架构,广泛用于移动设备。
    • 核心优势: 极大地减少了对主内存的带宽需求,非常节能。
  3. Sort-Last Fragment

    • 排序位置: 光栅化之后,像素处理之前
    • 工作方式: 几何处理和光栅化在多个并行单元中完成,生成的像素片段(fragments)再根据其屏幕位置被排序并分发到对应的像素处理单元。
    • 代表: AMD GCNNVIDIA 的桌面 GPU 架构通常属于此类。
  4. Sort-Last Image

    • 排序位置: 所有处理完成之后
    • 工作方式: 场景中的不同物体被分配到不同的管线中,每个管线独立渲染出一张完整的带有深度的图像。最后,通过深度信息将这些图像合成 (Composite) 在一起。
    • 缺点: 最终合成阶段需要巨大的带宽,并且难以实现现代图形 API 的所有要求,因此在商用硬件中基本不被采用

23.10 案例分析 (Case Studies)

核心观点

  • 不存在唯一的“最佳”GPU 架构。硬件设计是围绕目标平台(如移动设备 vs. 高性能桌面)、核心约束(如功耗 vs. 绝对性能)以及目标工作负载进行的一系列复杂权衡。
  • 现代桌面 GPU 架构虽然在底层实现上有所不同,但都趋向于采用一种混合渲染模式,结合了传统立即渲染模式和瓦片化渲染的优点,以优化对高速缓存的利用。

23.10.1 案例研究:ARM Mali G71 Bifrost (移动端代表)

目标平台与设计哲学

  • 平台: 移动和嵌入式设备(手机、平板、电视)。
  • 核心约束: 功耗能效是首要考虑因素,其次才是性能。
  • 设计哲学: 通过最大化利用高速片上内存,不惜一切代价减少对外部 DRAM 的带宽访问,因为这是移动设备上主要的功耗来源。

核心架构:Sort-Middle (瓦片化渲染架构)

这是理解 Mali 的关键。整个渲染流程分为两个截然不同的大阶段:

  1. 几何处理阶段 (Tiling/Binning):

    • GPU 首先处理场景中的所有几何体,仅计算顶点位置。
    • 然后,它会“分箱 (Binning)”,为屏幕上的每个瓦片 (Tile)(例如 16x16 像素)创建一个列表,记录下所有与该瓦片相交的三角形。
    • 顶点着色器被拆分:
      • 位置着色 (Position Shading): 在分箱前执行,只计算顶点位置。
      • 可变着色 (Varying Shading): 在分箱后执行,只为那些实际可见的顶点计算颜色、法线等属性,节约了大量计算和带宽。
  2. 像素处理阶段 (Per-Tile Rendering):

    • GPU 以 Tile 为单位进行渲染。对于每个 Tile,它将该 Tile 所需的帧缓冲(颜色、深度)完全创建在极高速的片上内存 (Tile Memory) 中。
    • 所有光栅化、像素着色、混合等操作都在这个片上 Tile Memory 中完成。这意味着渲染过程中的高频读写操作完全不访问外部内存
    • 当一个 Tile 的所有三角形都渲染完毕后,最终的颜色结果才被一次性地写回到外部主内存中。

关键技术与优势

  • 像素本地存储 (Pixel Local Storage - PLS): 这是一个由瓦片化架构自然促成的强大功能。它允许像素着色器直接读写片上的 Tile Memory,使得延迟渲染 (Deferred Rendering) 等技术变得极为高效,因为 G-Buffer 的读写完全在片上完成,带宽高,延迟低。
  • 高效的 MSAA: 多重采样的 Resolve(解析)过程在 Tile 渲染完成、写回主内存之前就在片上完成了。这意味着主内存中的帧缓冲不需要为 MSAA 额外增大 4 倍或 8 倍,极大地节约了带宽。
  • 事务消除 (Transaction Elimination): 一个聪明的节能技术。硬件会计算每个渲染完成的 Tile 的校验和 (Checksum)。在下一帧,如果一个 Tile 的内容没有发生任何变化(校验和相同),GPU 就会跳过将这个 Tile 写回主内存的操作,对于 UI 或画面变动不大的游戏(如休闲游戏)效果显著。
  • 缺点: 这种架构不适合需要大量几何体生成的场景(如几何着色器、曲面细分),因为增加的几何体需要被写回内存再进行分箱,增加了带宽开销。

23.10.2 案例研究:NVIDIA Pascal (高性能桌面代表)

目标平台与设计哲学

  • 平台: 高性能桌面显卡、工作站。
  • 核心约束: 追求极致的图形和计算性能,拥有更高的功耗预算。
  • 设计哲学: 采用高度模块化的可扩展设计,并通过一个巨大的 L2 缓存来模拟瓦片化渲染的优势,以平衡性能和带宽。

核心架构:Sort-Last Fragment (带有瓦片化缓存优化)

  • 自下而上的模块化设计:
    • CUDA 核心: 基础 ALU。
    • 流式多处理器 (SM): 核心计算单元,包含大量 CUDA 核心、Warp 调度器、L1 缓存、寄存器堆等。
    • 纹理处理集群 (TPC): 由一个 SM 和一个处理几何的多边形变形引擎 (Polymorph Engine) 组成。
    • 图形处理集群 (GPC): 由多个 TPC 和一个光栅化引擎组成,可以看作一个微型 GPU。
    • 完整 GPU: 由多个 GPC 组成。这种设计让 NVIDIA 可以通过增删 GPC/TPC 的方式,轻松地创造出从高端到低端的不同型号显卡。

关键技术

  • 瓦片化缓存 (Tiled Caching): 这是 Pascal 架构的关键优化。它不是像 Mali 那样的“纯”瓦片化渲染,而是一种利用 L2 缓存的混合方法
    • 工作原理: 几何体被分组处理,其大小被控制在足以让其输出(变换后的顶点)和渲染目标(Tile 的颜色/深度)都能驻留在巨大的 L2 缓存中
    • 效果: 在处理单个 Tile 时,大部分像素操作的读写都能在 L2 缓存中命中,避免了访问慢速的显存,从而模拟了 Sort-Middle 架构的带宽优势
  • 高效的无损压缩: ROP 单元支持多层级的颜色/深度压缩(例如 2:1, 4:1, 8:1),在数据写入显存时尽可能地减少带宽占用。
  • 峰值性能计算: (公式中的 2 代表 FMA 指令包含一次乘法和一次加法,算作两次浮点运算)。

23.10.3 案例研究:AMD GCN Vega (高性能桌面/主机代表)

目标平台与设计哲学

  • 平台: 高性能桌面显卡、游戏主机 (Xbox, PlayStation)。
  • 核心约束: 兼顾图形和通用计算性能,强调 GPU 的多任务处理和利用率。
  • 设计哲学: 采用与 NVIDIA 类似的混合渲染模式,并引入独特的硬件调度和内存管理技术来提升效率和灵活性。

核心架构:Sort-Last Fragment (带有 DSBR 优化)

  • 自下而上的模块化设计:
    • 计算单元 (CU): 核心计算单元,由 4 个 SIMD 单元(共 64 个 ALU)、Warp 调度器(Wavefront)、L1 缓存和局部数据共享 (LDS) 内存组成。
    • 异步计算引擎 (ACE): GCN 架构的标志性特性。这是独立的硬件调度器,能够与图形命令并行地分发计算任务(如物理、后处理、音频),极大地提高了 GPU 的整体利用率。

关键技术

  • 绘制流分箱光栅化器 (Draw-Stream Binning Rasterizer - DSBR): 这是 AMD 版本的瓦片化缓存技术,其目标和原理与 NVIDIA 的 Tiled Caching 高度相似——利用 L2 缓存来减少对主内存的访问。DSBR 还可以自动在硬件层面执行 Z-Prepass,实现对可见像素的延迟着色,确保每个像素只着色一次。
  • 高带宽缓存控制器 (High-Bandwidth Cache Controller - HBCC): 一项创新的内存管理技术。它允许 GPU 将其板载显存 (VRAM) 作为整个系统内存的一个巨型缓存。当 GPU 需要的数据不在显存中时,HBCC 会自动从系统内存中将其分页调入,这使得 GPU 在逻辑上可以访问远超其物理显存容量的数据。
  • Infinity Fabric (IF): AMD 设计的高速互联总线,用于连接 GPU 内部的各个模块,以及连接 CPU 和 GPU,实现高效、一致性的通信。

23.11 光线追踪架构 (Ray Tracing Architectures)

核心观点

  • 实时光线追踪硬件的核心任务是将光追算法中最耗时、且最适合并行化的部分固化到专用硬件中,即 BVH 遍历光线-三角形/AABB 相交测试
  • 着色计算(如材质评估、光照计算)仍然由通用的可编程着色器核心 (SM/CU) 完成。

通用硬件设计模式

  1. 专用硬件单元: 现代支持光追的 GPU (如 NVIDIA RTX, AMD RDNA2+) 都包含了专门的硬件单元,我们通常称之为 RT CoreRay Accelerator
  2. 核心加速任务:
    • BVH 遍历 (BVH Traversal): 硬件可以极速地根据光线方向,在 BVH 树状结构中进行节点遍历,快速找到可能相交的叶子节点。
    • 相交测试 (Intersection Testing): 硬件可以并行地执行大量的光线-AABB (包围盒)光线-三角形的相交测试。
  3. 一致性引擎 (Coherency Engine):
    • 一个关键的优化。它会将方向和来源相似的光线打包在一起进行处理。这些“一致”的光线在遍历 BVH 时会访问相似的节点,从而极大地提升缓存效率和执行效率。这是将随机的光线追踪过程变得对硬件友好的核心技术之一。
  4. 与传统管线的结合: 光追硬件与传统光栅化管线协同工作。典型的混合渲染流程可能是:使用光栅化渲染主场景,然后从 G-Buffer 中射出光线,利用光追硬件来计算精确的阴影、反射或全局光照。