Flame 2027.1から、新しく「Pixel Expression」ノードが追加されました。

Pixel Expressionは、RGBやMatteなどの値を使い、数式でピクセル単位の処理を作成できるノードです。

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

Matte付きの素材にカラー調整を行ったとき、「半透明部分の濃度や合成結果が、なんとなく変わった?」と感じたことはないでしょうか。

実際の数式と合成結果から確認してみます。

Premultipliedとは

Premultipliedとは、RGBにあらかじめMatte(Alpha)の値が掛けられている状態です。

例えば、

の場合、PremultipliedされたRGBは、

となります。

つまり、半透明部分ではMatteの値に応じてRGBも小さくなっているということです。

今回のGain処理を理解するポイントになります。

Pixel ExpressionからGainを確認

Premultiplied素材に対して、Pixel ExpressionでGainを適用します。

RGBにそのままGainを掛けます。Matteは変更せず、そのまま出力します。

通常のPremultiplied素材をCompノード(Input ControlsはPremultiplied)でブレンド。

Pixel ExpressionのVariablesにGainを追加し、値を調整できるようにしています。

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

Difference Matteから確認。

Pixel Expression Gainを1.5に変更

VariablesからGainを1.5に変更します。

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

RGBは明るくなりますが、半透明部分のブレンド状態に大きな変化はありません。

UnpremultipliedしてからGainを適用

次に、UnpremultipliedしてからGainを適用してみます。

Unpremultipliedは、PremultipliedされたRGBをMatteで割り、元のRGBに戻す処理です。

Pixel Expressionでは、Matteが0の場合の0除算を避けるため、

とします。

max(m1, 0.0001)

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

「RGBチャンネルを、それぞれmax(m1, 0.0001)で割ります。Gainは1.0。

Unpremultipliedでは、RGBをMatteで割るため、Matte値が小さいエッジ部分では
微小なRGB値も大きく増幅されます。そのため、エッジにドット状のノイズが見えることがあります。

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

Pixel Expressionを追加していないCompノード(Premultiplied)と同じ結果になります。

Pixel ExpressionでUnpremultipliedしたRGBを、CompノードのUnpremultipliedとして合成すると、
Comp側でMatteを使って合成されるため、通常のPremultiplied素材を合成した場合と同じ結果になります。

Unpremultiplied RGBにGainを掛ける

Unpremultiplied RGBにGainを掛けます。

Variables Gain : 1.5

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

Pixel Expressionを追加していないCompノードの前にMaster Gradeノードを追加し、Gain : 1.5に設定。

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

Difference Matteから確認。

Premultipliedに戻す

Gain処理後のUnpremultiplied RGBにMatteを掛けることで、元のPremultipliedの状態に戻すことができます。

この一連の処理では、Gainは単純な乗算のため、PremultipliedのままGainを掛けた場合と結果は同じになります。

Gainを掛けたあと、Matteを掛けます。

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

Difference Matteから確認。

まとめ

Gainでは、Premultipliedのまま処理した場合と、Unpremultipliedしてから処理した場合で最終結果は一致しました。

次回は、同じ処理をGammaで確認します。