浮点的小数部分如何修好了一个着色器
来源: crocidb.com — 2026-09-13
概述
作者写了一个 Voronoi 噪声背景着色器,在一台电脑上出现了莫名的动画卡顿。逐层剥离 UV 扭曲、调色板循环等效果之后,问题被锁定在生成 Voronoi 中心的那段代码。最终把 fract(x) 换成数学等价的 x - floor(x) 就解决了:原因指向 NVIDIA 595.79 驱动(RTX 4070)在特定上下文中对 GLSL fract() 的误编译——在量级约 100 到 1000 的运算数上,返回的小数部分在时间上不连续,会平滑移动然后突然跳变。
核心要点
- 问题只在特定机器上出现,Firefox、Chrome、Edge 三个浏览器表现一致,说明与浏览器无关。
- 作者先让 LLM 分析,模型起初怀疑噪声哈希函数,被纠正后才指向 fract,并给出了可用的修法。
- 根因是驱动误编译:fract() 在大数量级运算数上返回的小数部分在时间轴上不连续,导致 Voronoi 顶点抽动。
- 替换成 x - floor(x) 后顶点抖动消失,这是数学等价但能绕过驱动缺陷的修法。
- 整个排查过程包括反汇编着色器与一周的调试,说明「看起来是渲染问题」也可能出在驱动编译器。
金句
根因:NVIDIA 驱动 595.79 在这个着色器的上下文中误编译了 GLSL 的 fract()。
👍 0
👎 0
返回 Lobsters 首页