路径追踪器环境贴图采样萤火虫问题:如何保留阴影并消除噪点
解决路径追踪中环境贴图采样的萤火虫噪点问题
1. 针对环境贴图的重要性采样(核心方案)
萤火虫的根源是低概率采样到高亮度小区域,单次采样的贡献被放大导致噪点。重要性采样能让射线更倾向于命中环境贴图中亮的区域,减少极端值的出现:
- 先对环境贴图做预处理,生成累积亮度分布纹理(比如2D的CDF纹理),采样时根据这个分布生成采样方向,让亮区被采样的概率和其亮度成正比。
- 这样既不会错过太阳这类高亮度区域(保证阴影细节),又能避免单次采样偶然命中亮区产生的极端值,因为采样次数会更均匀地分配到亮区,平均后的结果更稳定。
2. 自适应采样 + 局部降噪
- 对画面中亮度波动大的区域(比如萤火虫容易出现的区域)增加采样次数,对平滑区域减少采样,平衡效率和质量。
- 采样后用双边滤波或非局部均值滤波做局部降噪:这类滤波能保留边缘(比如太阳阴影的边界),同时消除孤立的亮噪点。注意要在线性色彩空间中处理,避免色彩偏差。
3. 替代硬钳制的概率性亮度截断
硬钳制会直接压低所有高亮度值,导致画面暗淡。换成概率性处理:
const float maxLuminance = 10.0f; float lum = dot(hitValue, vec3(0.212671f, 0.715160f, 0.072169f)); if(lum > maxLuminance) { // 按比例降低采样贡献的权重,而非直接缩放颜色 float weight = maxLuminance / lum; hitValue *= weight; // 同时记录这个采样的权重,在最终累加时用加权平均代替简单平均 // (需在路径追踪的采样循环中维护权重累加变量) }
这种方式不会一刀切压低所有高亮度,而是让极端采样的贡献被合理降低,同时保留正常高亮度区域的细节。
4. 结合色调映射的后期处理
把去噪和色调映射结合起来:
- 先完成路径追踪的线性空间渲染,保留所有高动态范围信息(包括太阳的亮度)。
- 用Reinhard色调映射或ACES色调映射压缩动态范围,这类映射会对高亮度区域做非线性压缩,既保留暗部和阴影细节,又不会让亮区溢出产生萤火虫。
- 色调映射后再做一次轻微的去噪处理,消除剩余的小噪点。
5. 预处理环境贴图
如果环境贴图的太阳区域是硬边缘的高亮块,可以先对环境贴图做轻微的高斯模糊,但只模糊高亮区域(用蒙版控制):
- 这样能降低高亮区域的峰值亮度,同时不影响阴影的清晰度——因为阴影是由太阳的方向决定的,轻微模糊不会改变光照方向。
内容的提问来源于stack exchange,提问作者Zydak
相关产品推荐
相关产品推荐

