中EN
概念页

硬件深度剔除与纹理单元

Hardware Depth Culling & Texture Units

GPU 的深度管线先在瓦片级用 HiZ 单元做 zmax/zmin 粗剔除,再逐采样做 early-z 深度测试以免执行被遮挡片元的像素着色器,必要时退回到着色后的 late depth test;深度缓冲同样有瓦片压缩与快速清除。纹理单元以固定功能硬件完成寻址、过滤、钳位与解压(比软件快可达 40 倍),按 quad 有限差分求导数以选择 LOD,并依靠瓦片化/Morton 交织存储和纹理缓存提高局部性。

深度精度(23.7 节)

深度相近的面(如略高于桌面的纸)因精度限制互相穿插,称为 z-fighting;完全共面则是建模问题,提高精度也无法解决。深度缓冲每像素(或采样)24 或 32 位,定点或浮点。正交投影下深度分布均匀,透视下不均匀:pz=qz/qwp_z=q_z/q_w,定点表示时把有效范围(DirectX 为 [0,1])映射到 [0,2b−1][0,2^b-1]。

HiZ 粗深度测试

流程:粗光栅化(瓦片级)→ HiZ 单元粗测 → 采样覆盖与深度插值 → 深度单元 early depth test → 像素着色器 → late depth test,配合深度缓存、瓦片表和压缩。

  • zmax 剔除(Greene 分层 z 缓冲的简化):每个瓦片(常 8×8)存最大深度 zmaxz_{max}(片上存储或经 HiZ 缓存)。若三角形在瓦片内的最小深度 zmintri>zmaxz^{tri}_{min}>z_{max},它在该瓦片中必被遮挡,可终止处理,省下逐像素深度测试(不省像素着色,因为逐采样测试本来也会剔掉)。zmintriz^{tri}_{min} 用保守估计:取三顶点最小 z(开销小但不总是准)、或用三角形平面方程在瓦片四角求值取最小;两者结合取较大者剔除效果最好。
  • zmin 剔除:存瓦片最小深度。三角形肯定在所有已绘几何之前时可跳过逐像素测试、甚至避免读 z 缓冲;同时有 zmin 与 zmax 就能支持所有深度比较函数,而非仅"小于"。
  • 更新:三角形覆盖整个瓦片时可直接在 HiZ 单元更新,否则需从深度缓存读回整瓦片归约出最值,会引入延迟(Andersson 等提出无需该反馈仍保留大部分剔除效率的方法)。

early-z 与限制

early-z 就是把逐采样深度测试移到像素着色器之前,丢弃被遮挡片元;它常与 z-culling 混淆,但由完全独立的硬件实现,二者可单独使用。zmax、zmin 剔除和 early-z 在多数情况下自动启用,但像素着色器写自定义深度、使用 discard、或写 UAV 时必须禁用,退回 late depth test。新硬件上着色器可做原子读改写等,若确定安全可显式开启 early-z;保守深度:程序员保证自定义深度大于三角形深度时,可启用 early-z(此例中 zmax 剔除也可,但 zmin 剔除不行)。前到后渲染有利于遮挡剔除;z-prepass 先只写深度,再用"相等"测试着色,只着色最前面的表面。

深度压缩与第 23.5 节的通用系统类似:几种固定压缩大小加未压缩退回,快速清除省带宽;因深度屏幕空间线性,常用高精度平面方程、差分的差分加增量编码或锚点法。瓦片表与 HiZ 缓存可全放片上(昂贵,需容纳最大支持分辨率)或经内存层次。

纹理单元(23.8 节)

导数:计算纹理 LOD λ\lambda 需要 ∂u/∂x\partial u/\partial x、∂v/∂x\partial v/\partial x、∂u/∂y\partial u/\partial y、∂v/∂y\partial v/\partial y。纹理坐标若经任意函数变换(如凹凸法线反射向量去查环境贴图),解析求导不可行,所以硬件在 quad(2×2 像素)上用 x、y 方向有限差分计算——这正是 GPU 围绕 quad 调度的原因。实现常用 quad 内跨 lane 的 shuffle/swizzle 指令(编译器插入)或固定功能硬件;没有精确规范。OpenGL 4.5 与 DirectX 11 提供粗导数(整个 quad 共用一个水平和一个垂直差分)和细导数(用离像素最近的差分)。

纹理缓存:所有 GPU 都用(SRAM),有的专用一到两级,有的与其他访问共享。纹素按小瓦片(如 4×4)存储,瓦片字节数常等于缓存行(如 64 B)。另一种是交织 (swizzle) 布局:定点纹理坐标各 nn 位,

A(u,v)=B+(vn−1un−1vn−2un−2…v1u1v0u0)⋅TA(u,v)=B+(v_{n-1}u_{n-1}v_{n-2}u_{n-2}\ldots v_1u_1v_0u_0)\cdot T

BB 为基址,TT 为每纹素字节数;交错 u、v 的位得到二维 Morton 序空间填充曲线,提高一致性。

解压与 mipmap:纹理单元内有专用硬件解压多种压缩格式,远比软件高效。渲染目标随后作为纹理使用时,可先整体解压再存储,或让纹理单元直接支持颜色缓冲压缩格式(后者更高效,渲染目标作为纹理时仍保持压缩)。mipmap 限制了纹素/像素比(遍历中每像素约走一个纹素),保证缓存局部性——是少数同时改善画质和性能的技术之一。

机制节省的东西禁用条件
zmax 剔除被遮挡瓦片的逐像素深度测试写自定义深度等(保守深度时可保留)
zmin 剔除深度缓冲读取,支持任意比较函数同上
early-z被遮挡片元的像素着色写深度、discard、写 UAV
z-prepass重复着色(只着色最前表面)需额外一遍几何
  1. realtime_rendering_4ed.pdf 第 23 章 Graphics Hardware

相关页面

图形学深度缓冲Z-Buffer深度缓冲是几乎所有图形硬件用来解决可见性的算法:为每个像素存一个当前最近图元的深度值,新片元更近才写入颜色和深度。它简单、和图元数量成线性关系、允许大多数图元以任意顺序绘制,但不能直接处理半透明。图形学遮挡剔除Occlusion Culling遮挡剔除尽早剔除被其他物体挡住的物体,避免它们在 z-buffer 中被光栅化、深度比较甚至着色。本页覆盖遮挡剔除的分类与通用框架、GPU 遮挡查询、层次 Z 缓冲 (HZB) 及其在现代引擎中的简化变体(含两遍法、软件光栅化遮挡),以及在 CPU/GPU 上按物体—簇—三角形多粒度组合剔除并用间接绘制提交的剔除系统。图形学像素与帧缓冲优化Pixel & Framebuffer Optimization需要着色的像素通常远多于顶点,所以像素处理优化往往最划算。核心手段:保证占用率以隐藏纹理延迟、按距离切换着色器 LOD、利用 early-z 并通过从前往后排序或 z-prepass 减少过度绘制、缩小帧缓冲每像素存储(色度子采样、YCoCg 棋盘),以及只在需要时开启混合、避免 GPU 回读。几何与光栅化阶段的常用优化也一并列出。图形学纹理过滤与 MipmapTexture Filtering & Mipmap纹理在屏幕上被放大时需要插值,被缩小时一个像素覆盖许多纹素,必须预先滤波才能避免混叠。放大用最近邻、双线性或双三次;缩小的主流方案是 mipmap + 三线性插值,斜视角下用各向异性过滤减少过度模糊。注意:过滤纹理值只在输入与着色结果线性相关时等价于过滤最终颜色。图形学纹理压缩Texture Compression固定码率纹理压缩由 GPU 实时解码:减少显存占用、增大有效缓存、降低访问带宽,也能在同样内存下用更大纹理。BC (DXTC) 系列是桌面标准,ETC/EAC、PVRTC、ASTC 用于移动平台。它们都是有损的,压缩慢、解压快;法线贴图需要专门处理。图形学硬件光栅化与透视校正插值Hardware Rasterization & Perspective-Correct InterpolationGPU 光栅化由三角形设置与三角形遍历组成。硬件用每条边一个边函数判断采样点是否在三角形内,利用其增量性质按瓦片分层遍历,用左上规则决定恰好落在边上的像素归属,用保护带避免大多数裁剪。边函数的值恰好是子三角形面积的两倍,因此遍历顺带得到重心坐标;透视投影下需要线性插值 a/w 与 1/w 再逐像素相除,得到透视校正插值。本页还介绍 2×2 quad 与辅助像素、保守光栅化。图形学GPU 内存、缓冲压缩与多重缓冲GPU Memory, Buffer Compression & Multiple Buffering带宽是稀缺资源。GPU 通过独立显存或统一内存架构 (UMA)、多级缓存与按瓦片存储提高局部性,并用基于瓦片表的无损压缩和快速清除减少渲染目标的带宽(注意:无损压缩只省带宽,不省内存)。颜色缓冲有高彩、真彩、深色三种模式;显示控制器以固定刷新率或 FreeSync/G-sync 自适应同步把颜色缓冲送到显示器;单/双/三缓冲在撕裂、等待与延迟之间取舍。游戏数学投影矩阵Projection Matrix投影矩阵把视景体变换到规范视体(OpenGL 为 [-1,1]^3,DirectX 的 z 为 [0,1]),在那里裁剪更高效。正交投影保持平行线平行、物体大小与距离无关;透视投影让远处变小,产生的深度与观察深度成反比,近平面位置和"反向 z"决定深度精度。游戏开发 · UE5UE5 渲染架构UE5 Rendering ArchitectureUE5 的渲染器是独立的 Renderer 模块,在渲染线程 (Rendering Thread) 上以「场景代理」镜像游戏线程的组件状态,每帧按固定顺序执行深度预通道、G-buffer 基础通道、光照、雾、半透明和后处理。现代渲染代码用渲染依赖图 (Render Dependency Graph, RDG) 声明通道与资源,由 RDG 自动排屏障、复用瞬态内存、并行录制;最终命令经 RHI 线程翻译成 D3D12/Vulkan 等图形 API 调用。默认走延迟着色 (Deferred Shading),也可切换前向着色 (Forward Shading)。图形学GPU 架构案例GPU Architecture Case StudiesRTR4 第 23.10 节剖析三种架构:面向移动设备、以能效为先的 sort-middle 分块架构 ARM Mali G71 Bifrost;NVIDIA Pascal(GTX 1080)的 SM/TPC/GPC 层级与介于 sort-middle 和 sort-last fragment 之间的 tiled caching;AMD GCN Vega 的计算单元、异步计算引擎、DSBR 与 HBCC。硬件厂商通过对尚未制造的 GPU 做大量参数化仿真来决定 MP 数量、缓存、光栅引擎、ROP 数等——各种单元数量的原因归根结底是"这样效果最好"。综合帧时间预算与渲染性能Frame Budget & Rendering Performance本页把 wiki 中分散在 RTR4 第 18~23 章的性能知识串成一条线:一帧的时间预算由最慢的管线阶段决定,先用毫秒帧时间度量并定位瓶颈,再按瓶颈所在位置——CPU/驱动、几何、像素、带宽/内存——选用对应手段;最后从 GPU 硬件机制(占用率、HiZ/early-z、压缩、分块架构)理解这些手段为何有效。各结论的细节与出处见所链接的概念页。游戏数学莫顿码与空间填充曲线Morton Codes & Space-Filling Curves莫顿码 (Morton code) 把多维整数坐标的二进制位交错排成一个整数,得到沿"Z 形"路径(Z 序,z-order)访问空间的一维顺序:二维/三维中相近的点在这条曲线上通常也相近。图形学用它做线性 BVH 构建(按莫顿码排序代替空间划分)、纹理内存的 swizzle 布局(提高缓存命中),以及各种空间哈希。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原