前回は、Premultiplied素材にGainを適用し、Premultiplied / Unpremultipliedによる処理の違いを確認しました。

Gainでは、どちらの方法でも最終的なブレンド結果は同じになりました。

では、同じ処理をGammaで行うとどうなるでしょうか。

Premultiplied RGBにGammaを掛ける

まず、わかりやすく比較したいので、Premultiplied RGBにGammaを適用する式から確認します。

powは、Gammaの値を使ってRGBの値を計算する関数です。
max(r1, 0)で0未満の値を0にしてから、Gammaを適用しています。

max → 負の値を処理 → pow → Gammaを適用

RGBそれぞれに適用すると、次のようになります。

Pixel Expressionに式を設定し、VariablesにGammaを追加します。
まずはGammaを1.0に設定して確認します。

Gamma1.0ではRGBの値は変化しないため、通常のPremultiplied素材をCompノードで合成した結果と同じになります。

Difference Matteからも差がないことを確認できます。

Gammaを0.5に変更

VariablesからGammaを0.5に変更します。

Compノード(Input ControlsはPremultiplied)でブレンド。

Gainの場合とは異なり、Gammaでは半透明部分の合成結果にも差が現れました

Unpremultiplied RGBにGammaを掛ける

次に、前回のGainと同じように、Premultiplied RGBをMatteで割り、Matteの影響を取り除いたUnpremultiplied RGBに戻してからGammaを適用します。

RGBそれぞれに適用すると、次のようになります。

max(m1, 0.0001)

Matteが0.0001より大きい場合は、そのままMatteの値が使われます。

Pixel Expressionに式を設定。

Compノード(Input ControlsはUnpremultiplied)でブレンド。

Premultiplied : Gamma0.5より、半透明の部分の影響が少なくなります。

Premultipliedに戻す

最後に、Unpremultiplied RGBにMatteを掛けてPremultiplied RGBに戻します。

RGBそれぞれに適用すると、次のようになります。

Pixel Expressionに式を設定。

Compノード(Input ControlsはPremultiplied)でブレンド。

Matteを掛けてPremultiplied RGBに戻すと、元と同じ透明度でCompできます。

Gammaは、Unpremultiplied RGBに対して適用されているため、Premultiplied RGBに直接Gammaを
適用した場合とはRGBの処理結果が異なります

Input ControlsがPremultipliedですが、UnpremultipliedでCompした結果と一致します。

まとめ

半透明を含む素材にGammaなどの処理を行う場合は、

この順番で処理するのが適しています。

Premultiplied RGBは、RGBにMatteが掛かった状態です。

そのままGammaを適用すると、RGBだけでなく、Matteに対してもGammaを掛けることになります。

Gainのような単純な乗算は線形処理なので、

掛ける順番を変えても同じ結果になります。

一方、Gammaはpow()を使った非線形処理です。

結果は同じになりません

そのため、半透明を含む素材にGammaを適用する場合は、PremultipliedからUnpremultipliedに戻して
RGB本来の値にGammaを適用し、最終的にMatteを掛けてPremultipliedに戻すことで、
Matteによる透明度を維持したままRGBを処理することができます。

次回:Tone Adjustment

次回は少し視点を変えて、Gammaに加えてBlack / Whiteの調整や、

レンジ変換を行うために作成したGLSLシェーダー「Tone Adjustment」を紹介します。