2011-04-12

Gradeノードのtips

Gradeノードは説明したけど、去年の夏にやったnuke勉強会で、ボクの尊敬する 腕利きコンパーの人 に教えてもらった超便利技。

ホワイトバランスなどがちゃんととれてない画があるとして


こんな感じでアンバーによった素材。
これにGradeノードを使って・・・


こんな感じで画像の白だと思われるところと黒だと思われるところをそれぞれ、whitepointのカラー、blackpointのカラーへドラッグアンドドロップ。
すると


こんな感じで色合いが補正される。

これを応用して、こいつに例の如くアイツを合成するとして


同じくGradeノードを使って、下画から whitepoint と blackpoint をピックしてやり、


reverseのチェックを入れてやると、アイツの色が下画になじむ。

2011-04-04

アニメーションのtips

アニメーションのちょこっとしたtipsを。

Propertyペーンでアニメーションをコピーする際は、値の部分で右クリックしてメニューたどってコピーして、ペーストしたいところで同じようにして・・・ って出来るけど、割とめんどくさい。
そんなときは、値の横にあるグラフっぽいアイコンの上でshift+ドラッグアンドドロップで、ペーストしたい同じところへもってけばOK。



もう一つ。DopeSheetでキーフレームを数値入力でシフトさせたい場合は、そのキーを選んで、下に数値を入力するボックスがあるのでそこにシフトさせたい数値いれて、横の"Move"を押せばOK。









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は単純にプラスマイナスし係数に変化がないので、ちょっと違います・・・ このあたり面倒です・・・

gamma,gain,lift など・・・

コンプをしてるとお客さんや監督などから「もっと明るく」とか「もう少し暗く」とか要望を受けることがあります。
で、nukeで「明るく」したり「暗く」するためのnodeやパラメーターは色々とあります。nodeでは、Grade、ColorLookUp、Histogram、ColorCorrection、Gammaなど。ただ、どれも機能的には被るので、ココではGradeを中心に見ていき、ColorLookUpと照らし合わせてみます。
まず、確認用にConstantとRampを使って、シモテからカミテへ黒から白のリニアのグラデーションを作りました。このとき、エクスプレッションを仕込んで、画の両端(全黒と全白)と真ん中(rgb=0.5,0.5,0.5)でその時のr値(明度)がテキストとして表示されるようにしています。


 Gradeノードには「blackpoint」、 「whitepoint」、 「lift」、「gain」、「nultiply」、「offset」、「gamma」とそれぞれパラメーターがあります。
で計算式は・・・

A = multiply * (gain - lift)/(whitepoint - blackpoint)
B = offset + lift - (A * blackpoint)
output = pow((A * input) + B), 1/gamma)

となります。
powってのは乗数でpow(a, b)で、aのb乗倍 という具合です。
これではわかり辛いので、一個ずつの要素でColorLookUpと共に確認していきます。

まず、whitepointとblackpointですが、たとえば、デフォルト値0のblackpoint=0.2とすると・・・ 
となります。Gradeノードはデフォルトでblackclampにチェックが入ってるんですが、ここではそれをオフにしてます。黒の領域が広がって中央に向かってそれに伴い中間値も落ちたって感じです。ただ、白は変わらない。



でこれをColorLookUpで再現してみると・・・



となります。blackpoint=0.2というのは、LUTで元々(x,y)=(0,0)のポイントが(x,y)=(0.2,0)になった時と同様の結果ということが分かります。要するに暗部が攻めてきてグラデの幅が縮まりそれに伴い中間値も0.5よりも小さい値になります。硬いというか、コントラストはあるけど幅が狭い感じです。
whitepointはこの逆です。LUTで言うところの元々x=1のポイントを操作したのと等しくなります。ココでは例としてwhitepoint=0.8でみてみます。


同様にColorLookUp


今度はハイが攻めてきたって感じですね。(x,y)=(1,1)のポイントが(x,y)=(0.8,1)となりハイ部分が強くなりコントラストがあるけど、幅は狭まります。

で次に、liftとgainをみてみます。lift=0.2はこうです。



暗部が持ち上げられてそれに伴い中間値もあがってます。でも、blackpointを変更したのと同様に白の値は変わりません。ただ、コントラストが弱まり、明暗の差は薄くなる傾向ですね。眠い(柔らかい)かんじでしょうか。
これをColorLookUpで再現すると、


  こんな感じ。要するに(x,y)=(0,0)のポイントが (x,y)=(0,0.2)となり、要するに暗部が持ち上げられ、それに伴い中間値があがっているのがLUTで確認できます。アウトプットの明暗差の幅が狭くなっていますね。アウトプットのコントラストは弱まっています。また、liftのみ変化だとすると考えると

output = input + ((1 - input)*lift) 


が成り立ちます。input=1(要するに(x,y)=(1,1)の部分)だとliftに0を掛けることになるので、lift値は関係なくなります。なので白部分は変化がありません。
同様に、gain=0.8とすると


 ハイが沈んでコントラストが弱まってます。
同様にColorLookUp



(x,y)=(1,1)のポイントが (x,y)=(1,0.8)で同様の結果を得ます。gainのみで考えると

output = input*gain 

が成り立ちます。
whitepoint、blackpointはいわゆる「画をしめる」という感じで、 lift、gainは持ち上げるとか沈ませるという印象でしょうか・・・


次に、multiplyですが、これは少しややこしいのですが、lift、gainの値で決まるLUTにかかる係数のようなものです。lift、gainがデフォルト値のままだと、gainだけを変更した場合と結果は同じです。


次に、offsetだけど、これは単純にその値を足し引きしてるだけでLUTで言えば上下にシフトしているって感じです。










で最後にgammaだけど、gamma単体だと

output = pow(input, 1/gamma)

が成り立ち、要するにインプットをgammaの値の逆数で乗数倍した結果になります。乗数って言われてもナカナカピンとこないですよね。対数カーブになるんですが、
たとえば、gamma=2なら0.5で乗数倍となり、グラフとしては、


こんな感じです。(x,y)=(0,0)、(x,y)=(1,1)の部分では変化が無いんですが、中間値が持ち上がります。
結果は

です。全体的に明るくなるけど、中間値が曲線的に持ち上がっているだけ黒、白に変化はないです。
同じくgamma=0.5なら2乗倍となり、グラフとしては、 


こんな感じです。同じく(x,y)=(0,0)、(x,y)=(1,1)の部分では変化が無いんですが、中間値が沈みます。結果は



です。全体的に暗くなるけど、中間値が曲線的に沈んでいるだけ黒、白に変化はないです。

といった感じですが、適用する画によってそのレンジが違ったりするので、その画がLUTでどのエリアを占めているかを想定しながら使用する方が、闇雲にやるよりは効果的だと思います。
また、clampしないとマイナスの値や1よりも大きい値をもったピクセルが生まれてしまい、merge operation(overだとかplusだとか)によっては、その計算式により、エッジがとても目立ってしまったり、黒ずんだりするので、注意が必要ですね。



補足:
なんだじゃあ全部ColorLookUpでやればいいんでは? って感じですが、ColorLookUpはカーブを扱うのに対して、Gradeの各パラメーターは数値なので、何かと分かりやすいですし、エクスプレッション等も組めるので、ボクは割りとGrade使っています。ただしOpenExrのscanlineでなくtileで収録されたデーターを扱うとGradeはなぜだか鈍くなります・・・

2011-04-02

nukescript

nukescript(.nk)はnukeでのシーンファイルだとかプロジェクトファイルに相当するもの。nukeでセーブするとできるファイルそのものです。内容はアスキー形式で書かれており、テキストエディタ等で開くことができ、編集も可能。たとえば
--------------------------------------------------------------
set cut_paste_input [stack 0]
version 6.2 v3
Constant {
 inputs 0
 channels rgb
 name Constant1
 selected true
 xpos -130
 ypos -185
}
Blur {
 name Blur1
 selected true
 xpos -130
 ypos -96
}
Transform {
 center {1024 778}
 name Transform1
 selected true
 xpos -130
 ypos -58
}
--------------------------------------------------------------
こんな感じ。 


今回のは単純だから、nukescriptでの記述も単純に上から下に書かれているだけ。
たとえば、途中にあるBlurノードの記述に

Blur {
 name Blur1
 selected true
 xpos -130
 ypos -96
}



Blur {
 size 5
 name Blur1
 selected true
 xpos -130
 ypos -96
}

という具合に「size 5」を挿入すると、そのBlurノードでsizeの値(blurの強弱を示す値)が「5」になります。

で上の図のように、あるノードを選んだ状態で、コピーを行い、テキストエディタにペーストすると・・・


こんな感じでさっきと同様のコードが見れます。要するに、nukeはこんなをやり取りしているって感じでしょうか・・・

で、当然ですが、このテキストエディタからnukeへコピペすると・・・


ちゃんと同様のものができます。

webなどで、nukeについて調べてると、


こんな感じでnukescriptをコード丸出しであげてる方がいらっしゃいます。なので、コピーして、そのままnukeのnode graphでペーストすれば再現されます。