Skip to content

在浏览器里造开放世界,第 6 部分:Clipmap 改变了剧情

作者:Oleg Sidorkin,Cinevva CTO 和联合创始人

刚看到?看系列导览。那里解释了 spike 是什么,并链接了所有部分。

Spike 10 之前,我们的脑内模型还是"世界更大意味着更多几何体"。Spike 10 之后,模型变成了"几何预算恒定,以相机为中心的环更新"。这次转变改变了项目走向。

Geometry clipmap 背后的想法很直接。把地形渲染成一组以相机为中心的同心环。最内的环顶点密度最高。每往外一环,顶点间距翻倍,覆盖的地面也翻倍。不管你能看多远,总三角形数大致是个常数,因为你永远在用同样的 mesh 分辨率渲染同样数量的环。

在新标签页里打开 Spike 10 ↗ · 看源码

实操上的技巧是环边界上的 geomorphing。当一个顶点从一个 LOD 环过渡到下一个时,它的高度必须在高分辨率采样和低分辨率采样之间平滑混合。没有这个,相机一动、环一移,你就会看到肉眼可见的 pop。我们用一个基于顶点到环边距离的混合因子来处理,在顶点着色器里插值高度。

一个微妙的教训来自相机移动测试。光看静态截图判断 clipmap 很容易,但你会错过过渡瑕疵。我们花了时间用恒速穿越环边界,盯着时间维度上的噪声。截图会撒谎。运动说真话。

这个 spike 也给了我们一条干净的架构边界。近场地形可以随时间变得动态而昂贵——体素编辑、更高材质复杂度、物理交互。远场地形可以保持稳定、可预测、便宜。这种分离成了从此往后每一个架构决策的脊梁骨。

如果你在为自己的项目评估 clipmap,测压力循环,别测美图。长穿越路径、变化的相机高度、反复跨越边界——这些才暴露真正的问题。

第 7 部分我们加上体素 meshing,从"地形是表面"变成"地形是可编辑的体积"。这就是这个项目不再只是渲染器、开始变成一个世界编辑器的那一刻。

本章涉及的技术

Geometry clipmap。 Losasso 和 Hoppe 在 SIGGRAPH 2004 提出(论文),geometry clipmap 把地形渲染成以相机为中心的同心方环。每个环面积是前一个的两倍,顶点分辨率是一半。总顶点数恒定:大约 N^2 * 级数。N=256、8 级的话,不管世界多大都是约 50 万顶点。CPU 在相机移动时更新每环的 heightmap 数据。顶点着色器从纹理里读高度,把平面网格顶起来。看我们的关于 geometry clipmap 的地形指南GPU Gems 2 第 2 章

Geomorphing。 地形 LOD 最大的视觉瑕疵是 popping:一块 patch 切换 LOD 级别时顶点突然跳。Geomorphing 通过在一段过渡区里在 LOD 级别之间混合顶点位置来消除这个。每个顶点同时存当前 LOD 高度和粗一级 LOD 高度。一个基于相机距离的 morph 因子在它们之间平滑插值:morphedHeight = mix(fineLodHeight, coarseLodHeight, smoothstep(lodNear, lodFar, distance))。过渡区通常是每环外 20%。正常相机速度下,过渡看不见。看 geomorphing 细节

CDLOD(四叉树自适应 clipmap)。 Strugar 2014 年提出的对固定环 clipmap 的改进(论文)。不用统一分辨率的同心环,CDLOD 用一棵能适应地形复杂度的四叉树。平地用粗节点,细节多的地方(悬崖、山脊)做更细的细分。这对创作者世界很关键,那里不同 chunk 的复杂度差别巨大。看我们的地形指南里的 CDLOD


12 篇中的第 6 篇。 上一篇:第 5 部分 - 给漂亮东西做预算 下一篇:第 7 部分 - Marching cubes 和第一批真正的洞穴 系列导览:/zh-CN/blog/2026-02-25-open-world-browser-series-guide