经纬志
首页 / three.js / 使用示例

对数深度缓冲

五个标尺站按数量级排开,最近的五百米,最远的二百万米。 相机近平面 0.5、远平面五百万,跨度如此之大,普通深度缓冲会在远处产生闪烁。

three.js 0.160.0 · 更新 2026-10-28
源码与运行效果
运行效果

普通深度为什么不够

深度缓冲的精度在近平面附近最高,随距离急剧衰减。 近平面 0.5、远平面五百万时,深度比值是一千万量级, 远处的薄板之间只剩几个深度单位的差距,遮挡关系开始随机翻转, 表现就是大面积闪烁的斑块。

logarithmicDepthBuffer: true 把深度按对数分布, 近处仍然细致,远处也保留可用的分辨率。 这是三维地球、大范围地形这类场景的标准配置。

项取值说明
近平面0.5可随滑杆放大到 50
远平面5,000,000约等于五千公里
深度模式对数构造渲染器时确定
标尺站5 个间距按十倍递增

代价与替代方案

对数深度需要片元着色器参与计算,部分移动 GPU 上会带来可感知的开销; 另外它会影响 gl_FragDepth 的写入,某些后期处理与阴影组合需要额外验证。

若场景跨度只有几公里,优先的做法是缩小远平面、或者把场景切成分块分别渲染。 对数深度是「跨度确实巨大」时的兜底手段,不是默认选项。

构造时就要决定。logarithmicDepthBuffer 是渲染器构造参数, 运行期改不了。切换需要销毁渲染器重建,绘制上下文里的贴图、缓冲都会失效, 因此这个开关应该在项目初始化时就定下来。