概念页
顶点压缩与精度
Vertex Compression & Precision
网格数据像纹理一样可以压缩:传输用的整体压缩(Draco 等)一次性解码,渲染用的定长压缩让顶点着色器在 GPU 上逐顶点解码,从而降低内存、带宽并改善缓存。另一面是精度问题:大世界中单一坐标系会让远离原点的物体抖动,需要相对相机的变换或分段原点。
传输压缩(16.6 节)
压缩以编解码时间换存储,传输节省的时间必须超过解压时间。TFAN(MPEG-4 采用)压缩连接关系;Open3DGC、OpenCTM、Draco 生成的文件可比仅用 gzip 小到四分之一或更少,解压较慢(每秒几百万三角形),是一次性操作,适合网络下载。
为什么在 GPU 端压缩
复用顶点减少缓存未命中,去掉视觉影响小的三角形省顶点处理和内存,更小的数据降低带宽、改善缓存,GPU 内存有限时还能显示更多三角形。定长压缩(压缩后大小已知、每顶点自包含)可在顶点着色器中解码;压缩还能帮助顶点格式对齐缓存行。
常用定长压缩手段
| 数据 | 方法 | 说明 |
|---|---|---|
| 索引 | 顶点数 时用 16 位无符号短整数 | 8 位索引会引起昂贵的对齐问题,一般避免;OpenGL ES 2.0、未扩展的 WebGL 1.0 和部分旧 GPU 不支持 32 位索引 |
| 颜色 | 3 个无符号字节代替 3 个浮点 | iOS 上 Apple 建议把 3 字节字段填充到 4 字节 |
| 标量(如温度) | 只存标量并查一维颜色纹理;不需要数值时只存 1 字节索引 | — |
| 标量量化 | 用最小值作偏移、最大减最小作缩放,映射到 16 位整数 | 例:28.51–197.12 的值,解码 = 整数 ;空间减半 |
| 位置 | 用包围盒的缩放和偏移(或 4×4 矩阵)转成无符号短整数 | 逐物体缩放可提高精度,但相邻网格接触处可能出现裂缝;对所有模型用同一缩放并对齐偏移可多得几位精度 |
| 纹理坐标 | 范围 [0,1] 时用无符号短整数(隐式偏移 0、除以 ) | 一对坐标正好放进两个短整数,精度要求低时甚至 3 字节 |
| 法线 | 球面到平面的映射;Cigolle 等结论:八面体 (octant) 与球面投影最实用,误差小且编解码高效 | 延迟着色 G-buffer 中也讨论法线压缩 |
| 切线空间 | 三向量正交且手性一致时只存两个,第三个用叉积;更紧凑:4 字节四元数 + 手性位( 用 7 位) | 更高精度:省去最大的分量,其余三个各 10 位,2 位记录省略的是哪个,利用平方和为 1 恢复;Doghramachi 等存轴角,也是 4 字节,解码指令约为四元数的一半 |
浮点数总精度 24 位(略多于 7 位十进制),16 位约 5 位十进制;数值范围小时浮点的指数部分没有必要,这就是标量量化有效的原因。
大世界的精度问题
经典例子:在地球上方渲染航天飞机,模型精确到毫米,而地表远在 100,000 米外,尺度相差 8 个数量级;不处理时视点靠近,航天飞机会在屏幕上抖动。大型多人世界若全程用单一坐标系也会出现:边缘物体动画抽动、各顶点在不同时刻跳动、阴影贴图纹素随相机微动跳变。
flowchart LR A["问题: 世界坐标很大, 模型坐标很小"] --> B["方案一: 先把世界平移与相机平移合并, 二者大部分抵消"] A --> C["方案二: 把世界分段, 每段中心重设原点"] C --> D["难点: 跨段移动"]
如上图,两种方案分别从变换管线和世界划分入手(Ohlarik、Cozzi 与 Ring 有深入讨论)。
出处
- realtime_rendering_4ed.pdf 第 16 章 Polygonal Techniques
相关页面
图形学三角形带、扇与索引网格Triangle Strips, Fans & Indexed Meshes让共享顶点的三角形成组送入管线,可以减少顶点着色器调用。三角形扇和带把每三角形发送的顶点数降到接近 1;现代 GPU 的标准做法是带单一索引缓冲的三角形网格,理论上每三角形只需处理约 0.5 个顶点,实际效果取决于变换后顶点缓存,由三角形顺序优化(Forsyth、Tipsify 等)决定。图形学纹理压缩Texture Compression固定码率纹理压缩由 GPU 实时解码:减少显存占用、增大有效缓存、降低访问带宽,也能在同样内存下用更大纹理。BC (DXTC) 系列是桌面标准,ETC/EAC、PVRTC、ASTC 用于移动平台。它们都是有损的,压缩慢、解压快;法线贴图需要专门处理。图形学环境贴图Environment Mapping把球面函数记录在一张或多张图像里、用纹理查找来解码,就是环境贴图。它比其他球面表示占内存多,但解码简单快速,能表达任意高频和任意动态范围。最基本的用法是反射贴图:假设镜面 BRDF,用反射视线向量查表。本页比较经纬度、球面、立方体、双抛物面和八面体等投影。图形学法线贴图与凹凸贴图Normal & Bump Mapping凹凸贴图是一类在像素着色中修改着色法线来表现中尺度细节的技术:几何法线不变,只改变光照计算使用的法线,从而在不增加几何的情况下显得更立体。最常用的形式是切线空间法线贴图,需要每顶点的切线框架;法线贴图的过滤是难点。游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。图形学顶点着色器Vertex Shader顶点着色器是程序员直接控制的第一个管线阶段,逐个处理输入顶点,至少要输出顶点在齐次裁剪空间里的位置。它不能创建或删除顶点,顶点之间也不能传递结果,正因如此可以大规模并行。图形学阴影贴图Shadow Mapping阴影贴图 (Williams, 1978) 先从光源位置渲染深度,再从相机渲染时把每个点到光源的距离与贴图中存的深度比较:更远就在阴影中。它开销可预测(生成约与图元数成线性、查询为常数时间),非常适合 GPU,是任意表面阴影最常用的算法。主要问题是分辨率、深度精度带来的混叠、阴影痤疮和漏光。图形学大场景渲染与虚拟纹理Large Scenes & Virtual Texturing当场景数据远大于内存(如主机只有 8 GB,而游戏世界有数百 GB)时,需要按需把数据流送进内存。本页讲三类技术:虚拟纹理(把巨大的 mipmap 链切成瓦片,只让可见瓦片驻留在显存,通过页表/间接纹理寻址)、纹理转码(磁盘上用高压缩比的可变码率格式,加载时转成 GPU 块压缩格式),以及按平面瓦片组织资产的通用流送。这些方法几乎总是与剔除和 LOD 配合使用;地形部分见 地形渲染。图形学延迟着色Deferred Shading延迟着色先用一遍几何 pass 把所有可见表面的材质参数写入多张渲染目标(G-buffer),再以后处理方式对这些存储值逐光源计算光照,从而把"几何可见性"与"光照"彻底解耦,并把材质与光源分离。它避免了着色的过度绘制、简化了着色器管理、天然适合贴花,但 G-buffer 占用显存和带宽,且难以直接支持透明和 MSAA。本页也覆盖前向渲染下限制光源影响范围的基础手段与"光照预通道 (light prepass)"类混合方案。图形学延迟纹理与可见性缓冲Deferred Texturing & Visibility Buffer延迟着色避免了着色的过度绘制,但生成 G-buffer 时仍有过度绘制:先画的物体读了大量纹理,被后画的物体挡住后这些带宽全部浪费。延迟纹理只用一遍几何 pass、存极少的数据(纹理坐标与切线基,或仅三角形与实例 ID),直到着色时才读纹理。由于 GPU 算力增长快于带宽,让瓶颈落在计算而非缓冲访问被视为面向未来的做法。图形学多边形三角化Polygon Triangulation模型数据很少恰好是渲染需要的格式。图形 API 和硬件都针对三角形优化,所以复杂多边形要先剖分 (tessellation),最常见的是三角化 (triangulation)。本页讲三维数据的来源、三角化算法(耳切法、凸剖分、模板缓冲法)、四边形对角线选择与纹理扭曲,以及边缘裂缝和 T 型顶点。游戏数学数值表示与浮点数Numeric Representation & Floating Point游戏引擎里到处是数值,所以要清楚它们在机器中如何存储:二进制和十六进制、补码整数、定点数、IEEE-754 浮点数(量级与精度此消彼长、次正规数、机器 epsilon、ULP),以及多字节值的大小端问题和安全的类型双关 (type punning) 方法。书中一个直观的例子是:用 32 位浮点数记录以秒为单位的游戏时钟,大约 12.14 天后,加 1/30 秒就不再改变它的值。游戏数学旋转表示的比较Comparison of Rotational Representations旋转可以用欧拉角、3×3 矩阵、轴角、四元数表示,再加上平移与缩放就有 4×4(或 4×3)矩阵与 SRT(SQT)变换;更进一步还有对偶四元数。没有一种在所有场合都最好。GEA 按大小、直观性、能否直接作用于向量、能否插值、有无万向节锁比较它们,并用「参数个数 − 约束个数 = 3 个自由度」统一解释为什么它们用的浮点数不同。游戏开发动画压缩Animation Compression未压缩的动画每关节每样本最多 10 个 32 位浮点通道,数据量巨大。GEA 列出的压缩手段按力度递增:省略无用通道、量化(如 16 位 RL 编码)、降低采样率或省略近似线性的关键帧、用 B 样条拟合曲线、小波压缩,以及最根本的:只把需要的片段放进内存(选择性加载与流式加载)(GEA4 卷 II 13.8)。游戏数学球面几何与方向参数化Spherical Geometry & Direction Parameterizations渲染中大量计算发生在单位球面上:方向就是球面上的点,一组方向就是球面上的一块区域。本页按 PBRT 4e 3.8 节整理立体角、球面多边形面积、三种球面参数化(球坐标、八面体编码、等面积映射)以及用于剔除光源的方向锥,并附原书一处公式问题。