NEE's Blog

《奥伯拉丁的回归》抖动渲染稳定化技术深度解析

March 20, 2026

本文翻译自 Fullscreen, Round 3,原载于 TIGSource Forums 开发者日志。


背景介绍

《奥伯拉丁的回归》(Return of the Obra Dinn)是一款以独特 1-bit 黑白视觉风格著称的解谜游戏。游戏开发者 Lucas Pope 最近分享了他在解决游戏全屏模式下抖动(dithering)视觉不适问题上的深度探索。

这篇文章记录了他尝试多种技术方案的过程,对于游戏开发者和图形程序员来说,是一份非常珍贵的技术实践案例。

抖动渲染基础

首先简单解释一下抖动渲染的工作原理。游戏在内部以 8-bit 灰度渲染所有内容,然后通过后处理将最终输出转换为 1-bit。转换过程是通过比较源图像的每个像素与抖动图案中对应点的值来完成的——如果图像像素值大于抖动图案点值,输出位就设为 1,否则为 0。

抖动原理示意图

这个过程涉及两个关键组件:源图像和抖动图案。游戏使用了两种不同的图案:

  • Bayer 矩阵(8x8):用于产生更平滑的色调过渡
  • 蓝噪声场(Blue noise field,128x128):用于产生更少有序感的输出

Bayer vs Blue Noise

核心问题:动态场景的抖动”游动”

基本的抖动处理对静态图像效果很好,但对于动态或动画图像就不那么理想了。当源图像逐帧变化时,静态的抖动图案和低分辨率输出就成了大问题——本应是实心形状和色调的东西,现在看起来像是一团蠕动的像素。

移动的球体

现代游戏中,抖动主要用于源图像是静态的或输出分辨率较高的情况。当玩家看到这种低分辨率”游动抖动”效果时,第一反应不是”哦,抖动就是这样工作的”,而是”这个扭曲抖动的效果是什么,怎么关掉它?”

问题示例

这就是《奥伯拉丁的回归》全屏问题的症结所在。

技术方案探索

方案一:纹理空间映射(Texel Space)

第一个尝试是将抖动图案映射到纹理空间。这相当于在场景渲染期间对对象纹理进行抖动,而不是在 8-bit 输出的后处理阶段。

纹理空间映射

结果:产生了严重的混叠(aliasing)问题。由于纹素(texel)大小随相机距离变化,总会有抖动图案像素在重采样到屏幕时产生严重混叠。

纹理空间应用效果

方案二:运动变形(Motion Warping)

既然希望抖动图案跟踪其下方的移动几何体,为什么不根据场景中每个渲染像素的位置变化来变形图案呢?这有点像运动模糊,每个像素跟踪它从上一帧的移动。

运动变形效果

问题:抖动图案需要一个邻域——不能是单个像素独立处理。如果单独考虑每个像素,会在图案中产生明显的断裂和不连续性。

变形映射

方案三:带偏移的屏幕映射

在推导变形抖动的方程时,作者发现了一个非常简单的变换:

DitherOffset = ScreenSize * CameraRotation / CameraFov

偏移原理

基本思路:让屏幕映射的抖动图案在相机旋转一个视野角度时恰好移动一个屏幕。这在保持与屏幕 1:1 映射的同时,也考虑了视野中场景几何体的简化变换。

偏移效果

虽然在屏幕边缘效果不太理想(地板仍然一团糟),但这个简单的方法已经足够好了——抖动像素看起来基本随着几何体移动。

方案四:世界空间 - 立方体映射

将抖动图案映射到以相机为中心的立方体各面上。立方体随相机平移但保持世界方向。

立方体映射

立方体贴图视角

立方体映射效果

效果:当直接看向立方体各面时很好,但看向角落时就不太理想了。不过抖动图案在相机旋转时能完美固定在 3D 空间中。

方案五:世界空间 - 球形映射(最终方案)

作者发现球形映射可以更接近理想的 1:1 像素对应。

球形映射

由于无法完美地将方形纹理平铺到球面上,作者通过反复调整,创造了一个”环形”映射方案。

球形映射效果

关键优化:超采样(Supersampling)——以 2x 分辨率应用抖动阈值处理,然后下采样到 1x。这有效解决了混叠问题。

超采样效果

最终效果对比

最终方案与妥协

球形映射 + 超采样方案需要接受一些妥协:

缺点:

  1. 抖动图案点在屏幕边缘变大且效果降低
  2. 对于大多数相机旋转角度,图案没有保持上-下-左-右对齐
  3. 由于最终的盒式下采样,输出不再是严格的 1-bit

优点:

  1. 抖动对于所有相机旋转都完美固定(在游戏中感觉甚至有点超现实)
  2. 游动抖动的不适感完全消失,即使在全屏模式下
  3. 游戏的像素化风格得以保留

效果对比

三方对比

游戏默认调色板

最终游戏显示模式

游戏现在提供两种显示模式:

模式 特点
DIGITAL(数字) 边框盒式显示,屏幕空间偏移抖动,1-bit 输出
ANALOG(模拟) 全屏显示,球形映射抖动,柔和输出

作者的思考

作者坦言,投入 100 小时去解决一个”不存在就不会被注意到”的问题确实有点奇怪。正如他所说:

“确切地说,没有人会想’天哪,这抖动真是太稳定了,简直是魔法。’”

但他认为,既然能给玩家带来更好的体验,这种付出是值得的。


技术要点总结

  1. 抖动稳定性问题本质:1-bit 输出的低分辨率抖动在动态场景下会产生视觉不适的”游动”效果

  2. 多种映射方案对比:从纹理空间到屏幕空间偏移再到立方体/球形映射,每种方案都有其优缺点

  3. 超采样的作用:以更高分辨率进行阈值处理再下采样,是解决抖动混叠的有效方法

  4. 妥协的艺术:没有完美方案,关键是在视觉风格、性能和舒适度之间找到平衡

  5. 细节决定体验:即使玩家不会明确意识到某个技术改进,它仍然能提升整体游戏体验


本文翻译过程中保留了原文的技术术语和核心概念,对部分表达进行了本地化调整以便中文开发者理解。

comments powered by Disqus