前端 3D 渲染在历经数年对物理真实感(PBR)的狂热追逐后,正显露出严重的审美同质化疲态。法国技术专家 Maxime Heckel 于 2024 年 8 月 6 日发布技术拆解长文,系统阐述了如何在 React Three Fiber 与 Three.js 生态中,通过扩展 postprocessing 库的 Effect 基类构建全屏后处理管线,将诞生于半个世纪前的图像抖动(Dithering)、色彩量化(Color Quantization)与 CRT 扫描线重构成现代 WebGL 风格化视觉工具。
这一实践背后的技术反差极具启发性:抖动算法最初是硬件匮乏时代的下策,用于在 1-bit 黑白或 CGA 4 色显示器上欺骗人眼合成平滑色阶;而在现代 GPU 动辄每秒吞吐数十亿多边形的算力环境下,前端工程师们却在主动为画面施加离散噪点与色彩压缩。这并非单纯的情怀复古,而是图形学在 Web 场景中将算法限制转化为非真实感渲染(NPR)的工程范式迁移。
片元着色器的并行铁律:经典误差扩散为何折戟
许多涉足复古渲染的前端开发者最常犯的直觉错误,是试图将教科书中最经典的 Floyd–Steinberg 抖动算法直接搬进 WebGL 片元着色器。Floyd–Steinberg 算法通过精细的误差扩散机制——将当前像素的量化误差按右侧 7/16、左下 3/16、正下 5/16、右下 1/16 的权重分发给相邻像素——能在极低色阶下生成极具质感的有机过渡。但这一算法在现代 GPU 架构面前撞上了死胡同。
GPU 片元着色器的核心性能优势建立在数千个核心的无锁并发之上。这意味着每个像素的计算过程必须严格自洽,无法等待左侧或上方相邻像素的计算结果。在缺乏光栅化顺序同步(raster-order sync)的普通 WebGL 片元着色器中,严格依赖扫描线串行拓扑的 Floyd–Steinberg 算法根本无法在单一 Pass 中稳定并行。强行在 CPU 端计算或拆解为多 Pass 帧缓冲(FBO)循环,其帧率开销足以摧毁任何交互式 Web 应用。
因此,Bayer 矩阵主导的有序抖动(Ordered Dithering)成为了 Web 端着色器的事实标准。Bayer 算法利用预计算的 2×2、4×4 或 8×8 离散阈值矩阵,在 GLSL 着色器中直接通过屏幕像素坐标 gl_FragCoord.xy 的取模运算完成查表映射。由于每个片元的阈值计算完全自洽且互相独立,算力开销被压缩至几乎可以忽略的常数级别,从而规避了并行架构下的同步枷锁。
数学映射与工业选型:从 Bayer 网格到蓝噪声
在着色器层面上,抖动流程往往与色彩量化紧密交织。Maxime Heckel 在其方案中给出了通用的多通道颜色量化核心公式:
floor(color * (colorNum - 1.0) + 0.5) / (colorNum - 1.0)
该公式通过对 RGB 通道进行非连续截断,将连续色阶强制归约到有限的台阶中。若每个通道被限制在 n 个离散色阶,整个画面输出的理论色彩上限即为 n³ 种颜色。
然而,不同抖动阈值源的数学机制,决定了最终输出的质感截然不同:
- 白噪声哈希.通过伪随机三角函数在片元中动态生成随机数。尽管计算极简,但其高低频杂糅的高斯分布会导致画面布满粗糙无序的噪点,在动态三维场景旋转时会引发剧烈的视觉闪烁。
- Bayer 有序矩阵.通过空间周期性分布的固定阈值阵列构建规则交错图案。这种方案在静态下呈现浓郁的复古十字网格印记,但规则排列容易导致摩尔纹与明显的带状晶格感。
- 蓝噪声掩膜.其能量集中于高频区域,低频能量极低,能够在杜绝肉眼易察觉的低频聚簇的同时保持结构无序性。工业界(如 NVIDIA 研究团队)在实时图形防色阶断裂(debanding)管线中普遍推荐使用无插值的最近邻采样(nearest-neighbor)平铺采样的蓝噪声贴图。
抖动不再是修补低端显示介质的障眼法,而是现代着色器重塑光影层次的逆向刻刀。
生产落地的暗礁:全屏片元开销与体验边界
尽管在 React Three Fiber 生态中,通过扩展 Effect 基类并使用 wrapEffect 接入 EffectComposer 的工程链路已非常成熟,但将此类全屏复古滤镜推向生产环境依然面临严苛的现实阻力。
首要瓶颈来自移动端的视网膜屏幕(Retina Display)。在移动端 3x 像素比(DPR)的高清屏幕上,全屏后处理意味着片元着色器要在数百万个像素上进行逐片元的高频数学计算。虽然 Heckel 提倡将抖动、色彩量化和 CRT 扫描线等多重后处理逻辑合并至单一 Shader Pass 中,以此消除频繁切换帧缓冲(Framebuffer Object, FBO)带来的显存带宽开销,但高 DPI 设备的全屏填充率(Fillrate)瓶颈依然会导致 GPU 发热激增与电池续航骤降。
更值得关注的是设计美学与网页可用性(Accessibility)之间的张力。Basement Studio 等先锋数字机构利用此类管线创造了视觉极度惊艳的实验性案例,但在开发者社区的实际测试中,已有部分用户遇到了交互式 WebGL 实例崩溃报错。更为严重的是,密集的黑白交错点阵与高对比度像素网格极易引发视疲劳,甚至对光敏性眩晕患者构成视觉障碍。
- 建议.在生产环境中引入此类风格化后处理时,必须提供独立的降级开关,或主动监听系统的无障碍偏好设置,避免风格化表达凌驾于基础浏览体验之上。
- 风险.若未对移动端视网膜屏幕强制钳制渲染像素比(如限制最大 DPR 为 1.5),高频全屏片元计算将迅速击穿低端设备的功耗墙。
