• 前言

    目前实现的自动曝光虽然还原了相机的一部分功能,但还存在一个致命的问题,本篇将谈及该问题是什么,为什么会存在,实时下如何解决

自动曝光存在的问题为什么会存在

虽然自动曝光可以根据画面亮度计算合适的曝光值,但这个曝光值是全局的,也就是说无论亮处还是暗处都使用同一个曝光值

这就导致了一个问题——如下图所示,应用后的曝光,若同时存在暗部较暗且亮部较亮的情况,此时若想暗部不要太暗(防止死黑,丢失暗部细节),需要拉大曝光值,但会导致亮部更亮,亮部丢失的细节更多;同样的,若想暗部不要太亮,也会存在相同的问题

如何解决

  • 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算法流程

  • 计算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:
Snipaste_2026-11-01_21-26-21
Befor:
Snipaste_2026-11-01_21-26-31


他们曾如此骄傲的活过,贯彻始终