- 前言
目前实现的自动曝光虽然还原了相机的一部分功能,但还存在一个致命的问题,本篇将谈及该问题是什么,为什么会存在,实时下如何解决
自动曝光存在的问题为什么会存在
虽然自动曝光可以根据画面亮度计算合适的曝光值,但这个曝光值是全局的,也就是说无论亮处还是暗处都使用同一个曝光值
这就导致了一个问题——如下图所示,应用后的曝光,若同时存在暗部较暗且亮部较亮的情况,此时若想暗部不要太暗(防止死黑,丢失暗部细节),需要拉大曝光值,但会导致亮部更亮,亮部丢失的细节更多;同样的,若想暗部不要太亮,也会存在相同的问题
如何解决
- Exposure Fusion存在的问题
- 什么是Exposure Fusion
Exposure Fusion这篇论文提出了解决方法,该作者提出可以基于原图各自筛选原图的优点,基于各自优点各自生成新的图,再使用拉普拉斯金字塔混合。该论文提到的优点,分别是饱和度、对比度、曝光度。下图是该方法得到的效果:
可以看到亮部、暗部细节清晰可见
- Exposure Fusion为什么没有在工业界广泛应用
如果去查找分享的Paper,可以发现主流3a游戏基本没提到这个方法,这是为什么?
因为应用该方法,就不能接入Tonemap。由于要对原图混合,肯定需要将原图的值映射到[0,1],后续肯定无法接入Tonemap
-
解法Local Exposure Fusion
- 什么是Local Exposure Fusion
与Exposure Fusion类似,仍计算“曝光合适”的亮度,但不拿去显示。先反变换回线性亮度,再除以这个像素原来的亮度,得到一个倍率,用于后续Tonemap
-
优点:没破坏颜色比例
- 缺点:多一次逆变换
- 什么是Local Exposure Fusion
Local Exposure Fusion算法流程
- 计算Scene Color Luminance
- 基于Luminance,额外计算一个更亮、更暗的Luminance,得到三个Luminance
- 三个Luminance应用Tonemap公式,得到三个Tonemap
- 用离 0.5 的距离算权重(高斯权重)
- 金字塔2x2降采样。两张图各自缩小N次
- Blend:添加细节
- 对2x2降采样的金字塔,从最低分辨率到最高分辨率,计算当前pixel,每次都用pixel当前的分辨率的亮度,减去分辨率更小一级的(细节 - 整体,相当于是用平均前的四个值减去平均值),本质是为了增添细节
- 将计算得到的差值与权重相乘,得到亮度
- 逆Tonemap
Debug
- Local Exposure
每个像素相对 全局自动曝光 还要再乘的系数
localExposure = 反 tonemap(融合结果) / (HDR亮度 × 全局曝光)
float lum = max(dot(finalColor.rgb, float3(0.2126f, 0.7152f, 0.0722f)), 1e-5f); float fusion = SampleTexture2D(g_FusionTexIndex, screenUV, ClampLinearSampler).r; fusion = min(max(fusion, 0.0f), 0.999f); float fusedLum = (fusion * fusion) / max(1.0f - fusion * fusion, 1e-5f); finalColor.rgb *= fusedLum / lum;- 如何看
- 红:系数 > 1,这块被 提亮(暗部)
- 绿:系数 < 1,这块被 压暗(亮部)
- 黑:系数 ≈ 1,局部曝光几乎没动手
- 越亮:偏离越大,满强度大约 ±2 档
- 如何看
- Thresholds
叠在场景上的 亮度分区图,只看、不参与 fusion
- Highlight Threshold:比中灰 亮超过这么多档 的像素打绿斜纹
- Shadow Threshold:比中灰 暗超过这么多档 的像素打红斜纹
相对 middle grey 的 log2 档数:
- 绿斜纹:比 middle grey 亮超过 Highlight Threshold
- 红斜纹:比 middle grey 暗超过 Shadow Threshold
默认阈值是 0:比中灰亮的全绿纹,暗的全红纹。把阈值拉到 1~2,只剩下真正过曝/死黑的区域。用来判断直方图曝光有没有把中灰放对,以及高光/暗部有多大面积
-
Base / Shadows / Highlights
Fusion 的三张「曝光」——全分辨率亮度图(经过 sqrt(L/(1+L)),中灰大约是 0.5 的灰)
- Base:正常亮度
- Shadows:亮度 × Shadow Contrast
- Highlights: 亮度 × Highlight Contrast
- Weights
每个像素用哪张曝光,画成颜色
- 蓝:Base
- 红:Shadows
- 绿:Highlights
效果对比
After:

Befor:








Comments | NOTHING