いろんな人が既に書いてるんですけど。。
カラコレの前・後にとりあえず入れとけ、みたいな感じの説明をよく聞くんですが、つまりこれ、どういうことで、何の為に使うノードなのかを解説できれば、と思います。
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
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値にする、というのがポイントです。