2011-04-03

(un)premult チェック

以前CGWorld.jpで紹介した山口さんが勉強会でおっしゃっていた unpremultノード ですが・・・


 こんな感じで、premultiplyされたモノを色をいじるとエッジ部分に不具合が出てしまうケースがあります。この場合、下画(この場合グレー)とあわせる前にblackpointを下げてます。でover で重ねてますが、overの計算式

output = A + B*(1-Aa)

でAa、つまりAのアルファが1の部分ではAが完全な不透明でBは関係がなくなります。Aaが0の部分、つまりAのアルファが0で完全に透明の部分ではA+Bとなり、基本的にその部分では(r,g,b)=(0,0,0)のはずなので実質Bが前面に出てきます。
問題は半透明部分である0の部分です。要するにアンチ部分だったりするのですが・・・
premultiplyは自ずと下画が黒としてアルファをあらかじめ乗算するので、本来の色よりも暗くなっています。でこの部分に色調整が入ると通常はrgbのみが処理されるので、既にアルファ値にしたがって乗算された色が調整をさらに調整することになり、その乗算分強めに処理されてしまいます。なので、黒ずんだり、エッジ部分でルミナンスが落ちずに明るくなりすぎでエッジがガビガビになったりします。

これを避けるために、premultiplyされたを一旦 unpremult ノードでアルファ分を戻してやり(実際にはアルファ値で割り算)premultiplyが無い状態にします。ただアルファ値としては半透明のきれいなエッジのアルファをもっているので unpremultノードで処理したものに、色調整し、もう一度Premultノードを用いてアルファをpremultiplyしてやります。premultiplyされてアルファを考慮した画像ではなく、rgbとaを切り離しって考え方ですね。


ただ、いつのバージョンからか (un)premult by のチェックボックスが付属していて、この二つのノードを用いなくても、ほぼ同様の結果を得ることが出来るようになりました。


ただ、コンプは通常NodeGraphをみたら大体把握できるのが理想なので、チェックボックスよりもこの2つのノードを挟んだ方が分かりやすいですよね・・・ このあたりはそのスタジオごとのルールでしょうか・・・

注意:premultiply画像はアルファを乗算してるので、その係数に変化をもたらしてしまうようなblackpoint、whitepoint、lift、gain、multiply、gammaはそれでいけるのですが、offsetは単純にプラスマイナスし係数に変化がないので、ちょっと違います・・・ このあたり面倒です・・・

No comments:

Post a Comment