前回は、Premultiplied素材にGainを適用し、Premultiplied / Unpremultipliedによる処理の違いを確認しました。
Gainでは、どちらの方法でも最終的なブレンド結果は同じになりました。
では、同じ処理をGammaで行うとどうなるでしょうか。
Premultiplied RGBにGammaを掛ける
まず、わかりやすく比較したいので、Premultiplied RGBにGammaを適用する式から確認します。
pow(max(r1, 0), gamma)
RGBそれぞれに適用すると、次のようになります。
Red : pow(max(r1, 0), gamma) Green : pow(max(g1, 0), gamma) Blue : pow(max(b1, 0), gamma) Matte : m1



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を適用します。
pow(max(r1 / max(m1, 0.0001), 0), gamma)
RGBそれぞれに適用すると、次のようになります。
Red : pow(max(r1 / max(m1, 0.0001), 0), gamma)
Green : pow(max(g1 / max(m1, 0.0001), 0), gamma)
Blue : pow(max(b1 / max(m1, 0.0001), 0), gamma)
Matte : m1
Matteが0.0001より大きい場合は、そのままMatteの値が使われます。



Pixel Expressionに式を設定。



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


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


Premultipliedに戻す
最後に、Unpremultiplied RGBにMatteを掛けてPremultiplied RGBに戻します。
pow(max(r1 / max(m1, 0.0001), 0), gamma) * m1
RGBそれぞれに適用すると、次のようになります。
Red : pow(max(r1 / max(m1, 0.0001), 0), gamma) * m1
Green : pow(max(g1 / max(m1, 0.0001), 0), gamma) * m1
Blue : pow(max(b1 / max(m1, 0.0001), 0), gamma) * m1
Matte : m1



Pixel Expressionに式を設定。



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


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

Input ControlsがPremultipliedですが、UnpremultipliedでCompした結果と一致します。
まとめ
半透明を含む素材にGammaなどの処理を行う場合は、
Premultiplied
↓
Unpremultiplied
↓
Gammaを適用
↓
Premultiplied
この順番で処理するのが適しています。
Premultiplied RGBは、RGBにMatteが掛かった状態です。
そのままGammaを適用すると、RGBだけでなく、Matteに対してもGammaを掛けることになります。
Gainのような単純な乗算は線形処理なので、
(RGB × Matte) × Gain
=
(RGB × Gain) × Matte
掛ける順番を変えても同じ結果になります。
一方、Gammaはpow()を使った非線形処理です。
Gamma(RGB × Matte)
≠
Gamma(RGB) × Matte
結果は同じになりません。
そのため、半透明を含む素材にGammaを適用する場合は、PremultipliedからUnpremultipliedに戻して
RGB本来の値にGammaを適用し、最終的にMatteを掛けてPremultipliedに戻すことで、
Matteによる透明度を維持したままRGBを処理することができます。
次回:Tone Adjustment
次回は少し視点を変えて、Gammaに加えてBlack / Whiteの調整や、
レンジ変換を行うために作成したGLSLシェーダー「Tone Adjustment」を紹介します。