中EN
概念页

莫顿码与空间填充曲线

Morton Codes & Space-Filling Curves

更新于 2026-10-13 约 3 分钟莫顿码Z 序空间填充曲线位交错LBVHPBRT

莫顿码 (Morton code) 把多维整数坐标的二进制位交错排成一个整数,得到沿"Z 形"路径(Z 序,z-order)访问空间的一维顺序:二维/三维中相近的点在这条曲线上通常也相近。图形学用它做线性 BVH 构建(按莫顿码排序代替空间划分)、纹理内存的 swizzle 布局(提高缓存命中),以及各种空间哈希。

定义

二维坐标 (x,y)(x,y) 的位记为 xix_i、yiy_i,莫顿码为 ⋯y3x3y2x2y1x1y0x0\cdots y_3x_3y_2x_2y_1x_1y_0x_0;三维时三个坐标的位轮流交错。PBRT 4e 用每轴 10 位、共 30 位的三维莫顿码,正好放进 32 位整数(7.3.3 节)。

位与空间区域的对应

以 4 位坐标(x,y∈[0,15]x,y\in[0,15])、8 位码为例(PBRT 图 7.9):

  • 最高位 y3=1y_3=1 等价于 y≥8y\ge8:点在 yy 轴中线以上;
  • 次高位 x3x_3 把 xx 轴对半分;y3=1,x3=0y_3=1,x_3=0 时点落在左上四分之一;
  • y2y_2 再把 yy 轴分成四段。

一般地,高位相同的一组码对应一个边长为 2 的幂、轴对齐的空间区域。于是在排好序的码数组里,同一区域的点是连续的一段,用二分查找就能找到区间端点。自行穷举验证:8 位码中 y≥8y\ge8 的码落在 [128,255][128,255],y≥8y\ge8 且 x<8x<8 的码落在 [128,191][128,191];高 4 位分别是 [8,15][8,15] 和 [8,11][8,11](PBRT 书中给的就是高 4 位的区间)。

应用

  • 线性 BVH(LBVH/HLBVH):把图元质心量化后算莫顿码、基数排序,按位从高到低二分就得到中点划分的树,构建时间近似线性、易并行,适合 GPU。PBRT 取高 12 位聚类成 163=409616^3=4096 个网格单元,各簇并行建小树,顶层再用 SAH(见 空间数据结构)。
  • 纹理存储:交错 uu、vv 的位得到 Morton 序的纹素布局,使二维邻域在内存里更集中(见 硬件深度剔除与纹理单元)。

取舍与坑

  • 精度有限:每轴 10 位只有 210=10242^{10}=1024 级。场景尺度跨度很大时,很多图元会量化到同一格;PBRT 习题 7.5 建议改成 64 位整数、63 位莫顿码。另外归一化坐标为 1.0 时乘 2102^{10} 得 1024,需要 11 位,实现中要钳制到 1023。
  • 只看点:用质心排序时不考虑图元尺寸,大小悬殊的场景建出的树比 SAH 差。Vinkler 等(2017)的扩展莫顿码通过改进坐标到莫顿码的映射来缓解。
  • Z 曲线有跳跃:相邻码偶尔对应相距很远的点(Z 形拐角处),局部性不如希尔伯特曲线 (Hilbert curve),但编码只需位运算,快得多。
  • 来源:Morton(1966)IBM 技术报告首次描述;LBVH 由 Lauterbach 等(2009)提出,HLBVH 由 Pantaleoni 与 Luebke(2010)提出(PBRT 4e 第 7 章延伸阅读)。

PBRT 的视角:位交错实现(PBRT 4e B.2.7)

EncodeMorton3() 接受各分量在 [0,210][0,2^{10}] 的浮点坐标(转为 10 位整数),LeftShift3() 用一串"移位 + 掩码"把 10 位分散到每 3 位一位:先把第 8、9 位左移 16 位(第 8 位落到最终的第 24 位),再依次处理更低的位,最后三个分量分别左移 2、1、0 位后按位或。EncodeMorton2() 对两个 32 位整数做类似处理。Morton 码在 pbrt 中用于 LBVH 构建。

  1. PBRT 4e source excerpt: chapter 07 (Primitives and Intersection Acceleration)
  2. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 7 章 7.3.3 节、习题 7.5,pbr-book.org/4ed/Primitives_and_Intersection_Acceleration
  3. PBRT 4e source excerpt: chapter B (Utilities)
  4. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)附录 B B.2–B.7 节与延伸阅读,pbr-book.org/4ed/Utilities

相关页面

图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。图形学硬件深度剔除与纹理单元Hardware Depth Culling & Texture UnitsGPU 的深度管线先在瓦片级用 HiZ 单元做 zmax/zmin 粗剔除,再逐采样做 early-z 深度测试以免执行被遮挡片元的像素着色器,必要时退回到着色后的 late depth test;深度缓冲同样有瓦片压缩与快速清除。纹理单元以固定功能硬件完成寻址、过滤、钳位与解压(比软件快可达 40 倍),按 quad 有限差分求导数以选择 LOD,并依靠瓦片化/Morton 交织存储和纹理缓存提高局部性。游戏数学低差异序列Low-Discrepancy Sequences低差异序列 (low-discrepancy sequences) 是一类确定性的点序列,在 [0,1)^d 中分布得比随机点更均匀(星差异度 O((\log n)^d/n)),用于拟蒙特卡洛 (QMC) 积分和渲染中的采样。常见构造是基于根反演 (radical inverse) 的 van der Corput、Halton、Hammersley,以及基于二进制生成矩阵的 Sobol'。实际渲染中会对它们做随机加扰 (scrambling)(随机数字置换、Owen 加扰),既能估计方差、去掉高维投影中的规则图案,又能提高收敛率。本页以 PBRT 4e 8.5–8.7 节为主。游戏数学随机变量变换与逆变换采样Random Variable Transforms & Inversion Sampling蒙特卡洛估计器要求能从指定的概率密度里抽样。最基本的工具是逆变换法 (Inversion Method):对 CDF 求逆,把 [0,1) 上的均匀随机数映射成目标分布;更一般地,随机变量经过一一映射后的密度由导数(多维时是雅可比行列式)决定;多维非独立分布则先采边缘密度、再采条件密度。本页按 PBRT 第 4 版 2.1.1、2.3、2.4 节整理,是 蒙特卡洛积分与重要性采样 的数学部分。

输入关键词开始搜索

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