图形硬件 (Graphics Hardware)
23.1 光栅化 (Rasterization)
光栅化的核心任务是确定哪些像素(或者说样本点)被一个图元(通常是三角形)所覆盖,并将几何图元转化为屏幕上的像素片段(fragments)。这是连接几何处理阶段和像素处理阶段的关键桥梁。
核心观点
- 现代 GPU 的光栅化过程是高度并行且基于瓦片 (Tile-based) 的,旨在最大化缓存局部性 (cache locality) 和计算效率。
- 整个过程围绕着边缘函数 (Edge Function) 的高效计算和分层遍历 (Hierarchical Traversal) 展开。
关键流程与术语
- 
三角形设置 (Triangle Setup) - 描述: 在正式开始遍历像素之前,GPU 会对每个三角形进行一次预计算。
- 任务: 计算出在整个三角形光栅化过程中保持不变的常量,主要是边缘方程的系数 () 和属性插值所需的常量。
 
- 
边缘函数 (Edge Function) - 描述: 判断一个点是否在三角形内部的核心数学工具。对于三角形的每条边,都可以定义一个线性函数:
- 判断规则:
- :点在边的“内侧”。
- :点在边的“外侧”。
- :点恰好在边上。
 
- 内部测试 (Inside Test): 一个点 在三角形内部,当且仅当它满足所有三条边的 。
- 增量计算 (Incremental Calculation): 边缘函数是线性的,这使得计算相邻像素的值非常高效。例如,从 移动到 : 硬件利用这个特性可以极快地计算一整块像素的覆盖情况。
 
- 
Quad 处理与 Quad Overshading - Quad: 2x2 的像素块,是 GPU 并行处理像素的最小单元。这么做的主要原因是方便计算梯度/导数 (Gradients/Derivatives),这对于纹理的 Mipmap 选择至关重要。
- Quad Overshading (四边形过度着色): GPU 的一个重要工作方式是,只要一个 Quad 中有任何一个像素被三角形覆盖,整个 Quad 中的 4 个像素(包括未被覆盖的辅助像素 (auxiliary pixels))都会被激活并执行像素着色器。
- 性能影响: 对于非常小的三角形,这种方式会导致大量无效计算(着色了三角形外的像素),造成性能浪费。
 
- 
决胜局规则 (Tie-Breaker Rule) - 目的: 解决当像素中心点恰好落在两个共享三角形的边上时,应该归属于哪个三角形的问题,以避免像素被重复绘制或遗漏。
- 常用规则: 左上规则 (Top-Left Rule)。如果一条边是“上边”或“左边”,那么落在该边上的像素中心点被认为在三角形内部。
 
- 
分层/瓦片化遍历 (Hierarchical/Tiled Traversal) - 动机: 传统的逐行扫描(scanline)方式对缓存非常不友好。当处理一个大三角形时,处理下一行像素时,上一行访问过的纹理、深度等数据可能已经被踢出缓存。
- 核心思想: 将屏幕划分为固定大小的瓦片 (Tile)(如 8x8或16x16像素),以 Tile 为单位进行遍历。
- 流程:
- 粗略测试:判断三角形的包围盒与哪些 Tile 相交。
- 精细测试:对于相交的 Tile,再用边缘函数进行逐像素或更小块的测试。
 
- 优势: 极大地提升了数据访问的局部性,显著提高了纹理、颜色和深度缓冲的缓存命中率。
 
- 
保护带裁剪 (Guard-Band Clipping) - 目的: 完整的三维裁剪(尤其是在屏幕边缘)是一个复杂且可能增加图元数量的操作。
- 方法: GPU 在视口周围定义一个更大的虚拟区域,即保护带 (Guard-Band)。如果三角形的顶点完全落在这个保护带内,即使部分在屏幕外,硬件也不会对其执行完整的裁剪算法,而是依赖光栅化阶段自然地只生成屏幕内的像素。这是一种高效的裁剪优化。
 
23.1.1 属性插值 (Interpolation)
核心任务: 根据三角形顶点上的属性(如颜色、法线、纹理坐标),计算出三角形内部每个像素的对应属性值。
- 
重心坐标 (Barycentric Coordinates) - 描述: 在三角形所在平面内定义任何一点位置的坐标系,用三个标量 或 表示,满足 。它是属性插值的数学基础。
- 插值公式:
- 与边缘函数的关系: 重心坐标可以通过边缘函数的值高效计算得出,因为边缘函数的值与子三角形的面积成正比。 分母对于同一个三角形是常数,可以在三角形设置阶段预先计算。
 
- 
透视校正插值 (Perspective-Correct Interpolation) - 问题: 在透视投影下,直接在 2D 屏幕空间对属性进行线性插值是错误的,会导致纹理扭曲等视觉瑕疵(如图 23.6所示)。
- 解决方案:
- 核心思想: 属性 本身在屏幕空间不是线性的,但 和 是线性的(其中 是顶点的齐次坐标分量)。
- 硬件实现:
- 在三角形设置阶段,计算每个顶点的 和 。
- 在光栅化过程中,使用屏幕空间的重心坐标 对 和 进行线性插值。
- 在像素着色器中,通过逐像素进行一次除法来恢复正确的属性值 :
 
 
- 透视正确的重心坐标: 也可以先计算出透视正确的重心坐标 ,然后用它来插值所有属性。这需要对边缘函数进行 分量的加权。
 
- 问题: 在透视投影下,直接在 2D 屏幕空间对属性进行线性插值是错误的,会导致纹理扭曲等视觉瑕疵(如图 
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 调度来高效执行着色器程序并隐藏内存延迟。
关键架构组件与术语
- 
统一着色器架构 (Unified Shader Architecture) - 描述: GPU 内部不再有专门用于顶点、像素或几何着色的独立硬件单元。取而代之的是一个庞大的、统一的计算单元池,可以执行任何类型的着色器程序。
- 核心单元: ALU (算术逻辑单元)。这是一个相对简单的处理器,优化了浮点运算(特别是 FMA - 融合乘加指令),但缺少 CPU 的复杂功能。
 
- 
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)。
 
 
- 
Warp 调度器 与 延迟隐藏 - 任务: 管理分配到 MP 上的所有 Warps。
- 延迟隐藏 (Latency Hiding): 这是 GPU 高效运行的关键机制。当一个 Warp 因为等待数据(例如,从内存中读取纹理)而停顿时,调度器会立即、且几乎无开销地切换到另一个已就绪的 Warp,从而让计算单元 (ALU) 始终保持繁忙,避免了性能浪费。
 
- 
利用的并行性类型 - 线程级并行 (Thread-Level Parallelism): 每个顶点或像素都可以看作一个独立的线程,它们之间没有依赖关系。
- 数据级并行 (Data-Level Parallelism): 在一个 Warp 内部,一条指令作用于所有线程的数据。
- 指令级并行 (Instruction-Level Parallelism): 在某些情况下,处理器可以同时执行多条相互独立的指令。
 
23.3 延迟和占用率 (Latency and Occupancy)
核心观点
- 延迟 (Latency) 是 GPU 性能的主要杀手,尤其是访问内存的延迟。
- 占用率 (Occupancy) 是衡量 MP 上有多少 Warp 处于活跃状态的指标,高占用率是实现延迟隐藏的关键,因为它为调度器提供了更多可切换的 Warp 选项。
关键术语与公式
- 
延迟 (Latency) - 定义: 从发起一个请求(如读取内存)到收到结果之间的时间差。纹理读取的延迟可能长达数百甚至上千个时钟周期。
 
- 
占用率 (Occupancy) - 定义: MP 上实际活跃的 Warp 数量与硬件支持的最大 Warp 数量的比率。
- 影响因素: 占用率主要受着色器资源使用量的限制,最常见的是寄存器 (Register) 使用量。
- 权衡:
- 高占用率: 通常是好事。有更多的活跃 Warp 意味着调度器在当前 Warp 停顿时,有很大概率找到另一个就绪的 Warp 来继续执行,从而有效隐藏延迟。
- 低占用率: 当着色器过于复杂,使用大量寄存器时,会导致能同时驻留在 MP 上的 Warp 数量减少,占用率降低。这使得延迟隐藏变得困难,ALU 可能会频繁空闲。
- 注意: 极高的占用率有时也可能因过度竞争缓存资源而导致性能下降。
 
 
- 
CPU-GPU 延迟 - 描述: 从 GPU 回读数据到 CPU 是一个高成本操作,通常会导致 CPU 流水线停滞。应尽量避免同步回读。
- 异步查询: 遮挡查询 (Occlusion Query) 是一个很好的异步机制,CPU 发起查询后可以继续做其他工作,稍后再检查结果。
 
23.4 内存架构和总线 (Memory Architecture and Buses)
核心观点
- 数据在 GPU 内外不同组件之间的传输速度,即带宽 (Bandwidth),是图形渲染的另一个主要瓶颈。
- 不同的硬件平台采用不同的内存架构来平衡成本和性能。
关键架构类型
- 
独立显存 (Dedicated Video Memory) - 平台: PC 上的独立显卡 (dGPU)。
- 描述: GPU 拥有自己专属的高速内存(VRAM/GDDR),通过极宽的总线与 GPU 核心连接,带宽极高(数百 GB/s)。
- 数据流: CPU 数据需要通过相对较慢的 PCIe 总线(几十 GB/s)传输到显存中。因此,静态数据(如模型网格)应尽早上传并保留在显存中。
 
- 
统一内存架构 (Unified Memory Architecture - UMA) - 平台: 游戏主机、移动设备、PC 上的集成显卡 (iGPU)。
- 描述: CPU 和 GPU 共享同一块物理系统内存。
- 优势: CPU 和 GPU 之间的数据共享非常方便,延迟低。
- 劣势: CPU 和 GPU 需要争抢内存带宽,总带宽通常低于独立显存。
 
23.5 缓存和压缩 (Caching and Compression)
核心观点
- 为了缓解带宽压力,GPU 在硬件层面广泛使用缓存 (Caching) 和无损压缩 (Lossless Compression) 技术。
- 这些技术对开发者是透明的,但理解其原理有助于编写出对硬件更友好的渲染代码。
关键技术
- 
缓存 (Caching) - 目的: 利用内存访问的局部性 (locality of reference),减少对主内存的直接访问。
- 实现: GPU 内部有多级缓存(L1, L2, L3)。将数据以瓦片 (Tile) 格式存储可以极大地提升缓存命中率。
 
- 
无损压缩 (Lossless Compression) - 目的: 减少进出主内存的数据量,从而节约宝贵的内存带宽。注意:它不减少显存的占用空间,只在数据传输时起作用。
- 应用: 主要用于渲染目标(颜色缓冲、深度缓冲)。
- 工作原理:
- 当一个 Tile 的数据要从缓存写入内存时,压缩器 (Compressor) 硬件会尝试对其进行压缩。
- 当要从内存读取一个 Tile 时,解压器 (Decompressor) 硬件会将其解压。
- 如果压缩失败(例如,数据内容过于随机),则直接存储未压缩的数据。
 
- 分块表 (Tile Table): 一个核心的辅助数据结构,用于追踪每个 Tile 的状态(例如:已清除、已压缩、未压缩)。
- 快速清除 (Fast Clear): 一个重要的优化。当调用 clear()函数时,GPU 并不是真的去写每一个像素,而仅仅是将 Tile Table 中所有条目的状态标记为“已清除”。当这个 Tile 第一次被访问时,硬件才会真正填入清除颜色。这极大地节约了带宽。
 
23.6 颜色缓冲 (The Color Buffer)
核心观点
- 颜色缓冲是渲染的最终输出目的地,其格式、显示方式和交换策略直接影响最终画质和流畅度。
关键概念
- 
颜色深度 (Color Depth) - 真彩色 (True Color): 最常见的格式,每像素 24 或 32 位(RGBA 各 8 位),能提供约 1670 万种颜色。
- 颜色条带 (Color Banding): 在低颜色深度下(如 16 位),平滑的颜色渐变会呈现出明显的阶梯状条纹。这是由于人眼的马赫带 (Mach banding) 效应而被放大了。
 
- 
视频显示控制器 (Video Display Controller - VDC) - 描述: GPU 中负责读取颜色缓冲内容,并通过 HDMI、DisplayPort 等接口将其输出到显示器的硬件单元。
 
- 
自适应同步 (Adaptive Sync) - 技术: AMD FreeSync / NVIDIA G-Sync。
- 目的: 解决画面撕裂 (Tearing) 问题。它使显示器的刷新率动态匹配 GPU 的帧渲染率,从而在不引入 VSync 延迟的情况下,获得平滑无撕裂的画面。
 
- 
缓冲策略 (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)。
关键技术与流程
- 
深度精度 与 Z-Fighting - 问题: Z-Fighting (深度冲突) 是指当两个多边形在深度上非常接近时,由于深度缓冲区的精度限制,在渲染时会导致它们交错闪烁。
- 深度分布: 对于透视投影,深度值在 Z-Buffer 中是非线性分布的,靠近摄像机的地方精度高,远离摄像机的地方精度低。理解这一点对于设置合适的近/远裁剪平面至关重要。
 
- 
分层深度剔除 (Hierarchical-Z / HiZ) - 别名: Z-Culling。
- 层级: 在瓦片 (Tile) 级别进行,而非逐像素。
- 核心思想: GPU 维护一个低分辨率的深度金字塔(HiZ 缓冲),其中每个单元格存储了对应屏幕区域(一个 Tile)内深度的最远值 ()。
- 剔除: 在光栅化一个新三角形之前,硬件会计算出这个三角形在某个 Tile 内可能达到的最近深度 ()。如果这个最近深度都比 HiZ 中记录的最远深度还要远,即 ,那么这个三角形在该 Tile 内一定被完全遮挡,可以安全地将整个 Tile 剔除,无需进行后续的逐像素处理。
 
- 
早期深度测试 (Early-Z / Early Depth Test) - 层级: 在逐像素/逐样本级别进行。
- 核心思想: 在 HiZ 剔除之后,但在执行像素着色器之前,硬件会执行常规的深度测试。如果一个像素片段(fragment)未能通过测试(即它被某个更近的物体遮挡),它就会被立即丢弃。
- 巨大优势: 避免了对不可见像素执行昂贵的像素着色器,是现代 GPU 最重要的性能优化之一。
- 失效条件: 在某些情况下,Early-Z 必须被禁用,转而使用后期深度测试 (Late Depth Test)(即在像素着色器之后测试)。这些情况包括:
- 像素着色器修改了像素的深度值。
- 像素着色器使用了 discard或clip指令(因为着色器可能会主动丢弃像素)。
- 像素着色器有副作用,例如写入 UAV (无序访问视图)。
 
 
- 
Z-Prepass (深度预处理) - 描述: 这是一种渲染算法,而非纯硬件功能。它通过两次绘制场景来实现近似于“完美”的 Early-Z 效果。
- 流程:
- Pass 1 (Z-Prepass): 遍历所有不透明物体,关闭颜色写入,只将它们的深度值写入深度缓冲区。
- Pass 2 (Shading Pass): 再次遍历所有不透明物体,但这次将深度测试函数设置为“相等 (Equal)”,并开启正常的颜色写入和像素着色。
 
- 效果: 只有在 Z-Prepass 中“胜出”的、离相机最近的像素才会在第二次 Pass 中通过深度测试并被着色,从而确保每个像素只被着色一次。
 
- 
深度压缩 (Depth Compression) - 目的: 与颜色缓冲一样,为了节约内存带宽。
- 原理: 由于深度值在屏幕空间通常是局部线性的(表现为平滑的斜面),硬件可以使用高效的无损压缩算法,如存储平面方程或增量编码 (delta encoding),来大幅减少读写深度缓冲所需的数据量。
 
23.8 纹理化 (Texturing)
核心观点
- 纹理采样是渲染中最频繁的操作之一,GPU 内部集成了高度优化的固定功能硬件 (Fixed-Function Hardware)——纹理单元 (Texture Unit),来加速这一过程。
- 高效的纹理化依赖于梯度计算 (Derivative Calculation)、纹理缓存 (Texture Caching) 和优化的内存布局。
关键技术
- 
导数/梯度计算 (Derivatives for LOD) - 目的: 为了正确选择 Mipmap 层级和应用各项异性过滤,GPU 需要知道纹理坐标 相对于屏幕坐标 的变化率,即导数 (Derivatives)。
- 实现: GPU 并不进行复杂的符号微分。它利用 Quad (2x2 像素块) 的特性,通过计算相邻像素间纹理坐标的有限差分 (finite differences) 来近似求解导数。这就是为什么像素总是在 Quads 中被处理的根本原因。
 
- 
纹理缓存 (Texture Caching) - 目的: 极大地减少对主显存的访问延迟和带宽消耗。
- 原理: 利用纹理访问的空间局部性——相邻的像素很可能访问纹理上相邻的区域。
 
- 
纹理内存布局 (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)
- 核心思想: 并行计算的整体性能提升,受限于程序中无法并行化的串行部分。 其中, 是串行部分的比例, 是并行部分的加速倍数。这提醒我们,管线中最慢的串行环节将成为最终的瓶颈。
并行架构分类
- 
Sort-First - 排序位置: 几何处理之前。
- 工作方式: 将屏幕预先划分为区域,图元根据其覆盖的区域被分发到不同的、完整的渲染管线中。
- 应用: 主要用于多台计算机协作渲染的大规模显示系统(如视频墙)。
 
- 
Sort-Middle (瓦片化渲染 / Tiled Rendering) - 排序位置: 几何处理之后,光栅化之前。
- 工作方式:
- 所有图元首先完成顶点着色等几何处理。
- 然后,将变换后的三角形排序并分配到屏幕空间的瓦片 (Tile) 中。
- 每个 Tile 被一个处理核心独立且完整地渲染,通常使用高速的片上内存 (On-chip Memory) 作为其颜色/深度缓冲。
- 当一个 Tile 渲染完成后,结果才被写回到主内存。
 
- 代表: ARM Mali 架构,广泛用于移动设备。
- 核心优势: 极大地减少了对主内存的带宽需求,非常节能。
 
- 
Sort-Last Fragment - 排序位置: 光栅化之后,像素处理之前。
- 工作方式: 几何处理和光栅化在多个并行单元中完成,生成的像素片段(fragments)再根据其屏幕位置被排序并分发到对应的像素处理单元。
- 代表: AMD GCN 和 NVIDIA 的桌面 GPU 架构通常属于此类。
 
- 
Sort-Last Image - 排序位置: 所有处理完成之后。
- 工作方式: 场景中的不同物体被分配到不同的管线中,每个管线独立渲染出一张完整的带有深度的图像。最后,通过深度信息将这些图像合成 (Composite) 在一起。
- 缺点: 最终合成阶段需要巨大的带宽,并且难以实现现代图形 API 的所有要求,因此在商用硬件中基本不被采用。
 
23.10 案例分析 (Case Studies)
核心观点
- 不存在唯一的“最佳”GPU 架构。硬件设计是围绕目标平台(如移动设备 vs. 高性能桌面)、核心约束(如功耗 vs. 绝对性能)以及目标工作负载进行的一系列复杂权衡。
- 现代桌面 GPU 架构虽然在底层实现上有所不同,但都趋向于采用一种混合渲染模式,结合了传统立即渲染模式和瓦片化渲染的优点,以优化对高速缓存的利用。
23.10.1 案例研究:ARM Mali G71 Bifrost (移动端代表)
目标平台与设计哲学
- 平台: 移动和嵌入式设备(手机、平板、电视)。
- 核心约束: 功耗和能效是首要考虑因素,其次才是性能。
- 设计哲学: 通过最大化利用高速片上内存,不惜一切代价减少对外部 DRAM 的带宽访问,因为这是移动设备上主要的功耗来源。
核心架构:Sort-Middle (瓦片化渲染架构)
这是理解 Mali 的关键。整个渲染流程分为两个截然不同的大阶段:
- 
几何处理阶段 (Tiling/Binning): - GPU 首先处理场景中的所有几何体,仅计算顶点位置。
- 然后,它会“分箱 (Binning)”,为屏幕上的每个瓦片 (Tile)(例如 16x16 像素)创建一个列表,记录下所有与该瓦片相交的三角形。
- 顶点着色器被拆分:
- 位置着色 (Position Shading): 在分箱前执行,只计算顶点位置。
- 可变着色 (Varying Shading): 在分箱后执行,只为那些实际可见的顶点计算颜色、法线等属性,节约了大量计算和带宽。
 
 
- 
像素处理阶段 (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) 完成。
通用硬件设计模式
- 专用硬件单元: 现代支持光追的 GPU (如 NVIDIA RTX, AMD RDNA2+) 都包含了专门的硬件单元,我们通常称之为 RT Core 或 Ray Accelerator。
- 核心加速任务:
- BVH 遍历 (BVH Traversal): 硬件可以极速地根据光线方向,在 BVH 树状结构中进行节点遍历,快速找到可能相交的叶子节点。
- 相交测试 (Intersection Testing): 硬件可以并行地执行大量的光线-AABB (包围盒)和光线-三角形的相交测试。
 
- 一致性引擎 (Coherency Engine):
- 一个关键的优化。它会将方向和来源相似的光线打包在一起进行处理。这些“一致”的光线在遍历 BVH 时会访问相似的节点,从而极大地提升缓存效率和执行效率。这是将随机的光线追踪过程变得对硬件友好的核心技术之一。
 
- 与传统管线的结合: 光追硬件与传统光栅化管线协同工作。典型的混合渲染流程可能是:使用光栅化渲染主场景,然后从 G-Buffer 中射出光线,利用光追硬件来计算精确的阴影、反射或全局光照。