2016年9月24日土曜日

Nuke的 その7

今更ながら、ちょっとUnpremult・Premultについて書いてみます。
いろんな人が既に書いてるんですけど。。
カラコレの前・後にとりあえず入れとけ、みたいな感じの説明をよく聞くんですが、つまりこれ、どういうことで、何の為に使うノードなのかを解説できれば、と思います。

Unpremult・Premultについて

その1 multiply

日本語では<Unpremult=Alpha徐算済み>、<Premult=Alpha乗算済み>、といいます。

ここでまず、算数の用語として、

加算(たし算) : plus
減算(ひき算) : minus
乗算(かけ算) : multiply
徐算(わり算) : divide

ですね。(以下、全てplus、minus、multiply、divideで統一します。)

今回、重要になるのはmultiplyです。
PremultはPre-multiply、UnpremultはUn-pre-multiply。


その2 rgba

コンポジットでは、rgbaという4つの値を扱います。
rgbというカラー情報とaというアルファ情報です。


画像はrgbという値の組み合わせでカラーを表示し、0-1のアルファ情報をrgbにmultiplyすることで不透明度を表現します。

左:rgbaの値がそれぞれ、r=0.5、g=0.5、b=0.5、a=1の平面。
右:rgbaの値がそれぞれ、r=1、g=1、b=1、a=0.5の平面をPremult。


見た目は、全く同じに見えます。

左はシンプルなグレー平面です。rgbカラーが0.5、不透明度100%の平面。
右は半透明なホワイト平面です。rgbカラーが1、不透明度50%の平面。


右はPremultノードがなければホワイト平面にみえますが、Premultノードを入れることで、rgbのそれぞれにaがmultiplyされた結果が表示され、不透明なものだと定義されます。これを日本語だとAlpha乗算済みと呼びます。Alphaの乗算が済みました、ということで。

[ r = r*a、g = g*a、b = b*a ]


その3 カラーコレクション

カラーコレクションは映像の色彩を補正する作業です。

重要なのは、「カラーコレクションはrgbに対して行うもので、aを含めて行うものではない」ということ。

上の左右の画像にカラーコレクションを行う場合、

左の画像は、特に問題なくカラーコレクションを行うことができます。
rgbの値にgainしようが、gammaしようが、offsetしようが問題ありません。


右の画像は、見た目はグレーの平面に見えますが、グレー平面だと思ってカラコレしてはダメです、なぜならば本来の色はホワイトです。

カラーコレクションはrgbに対して行うもので、aを含めて行うものではない為、
一旦、アルファ情報をキャンセル、aをdivide(Unpremult)して、
本来のrgb値にしてからカラーコレクションして、
再びアルファ情報を与える、aをmultipy(Premult)する必要があります。

今回の場合は、
rgbそれぞれの値を[ r = r/0.5、g = g/0.5、b = b/0.5 ](Unpremult)して、
1(本来のrgb値)にしてからカラーコレクションして、
再び[ r = r*0.5、g = g*0.5、b = b*0.5 ](Premult)する必要があります。



煙とかイメージするとわかりやすいと思うんですが、
カラーコレクション前に、aを含めない本来のrgb値にする、というのがポイントです。

0 件のコメント:

コメントを投稿