2016/07/29

exrに余白を付けてレンダリングする

先日いろいろ調べてたら、exrに余白付きでレンダリング出来ることに気がついたのでメモ。


mayaだったらここにメタデータ書き込めばexrのデータが上書きされる。
レンダー設定のイメージフォーマットオプション。

 カメラの情報だとかいろいろ書き込めるみたいで応用すればいろんなことが出来そう。

ここにこんな感じで書き込む。

displayWindow=(20,20,2067,1171);

そうすると表示範囲を指定できる。

nukeでその画面を表示すると下のような画面になる。


 レンダリング自体は余白部分まで出てるけど、nukeの扱い自体はdisplayWindowの数値を見てくれる。

 レンズの歪みとかボケ系のエフェクトを入れるときにそのまま与えてやれば領域外の部分を使ってくれるのであまり考える必要が無い。
 一部ノードによってはダメな場合もあるけど:(


毎回書き加えるのは面倒なのでPreRenderMelとPostRenderMelにスクリプトを書き加えてあげれば簡単にオーバースキャンの画像を作ることが出来る。
例えばこんな感じとか。(レンダラーVRayの場合)

PreRenderMEL
int $overscan = 100;
int $width = getAttr ("vraySettings.width");
int $height = getAttr ("vraySettings.height");

string $cameraNode[] = `lsType("camera")`;
string $nodes;
for($nodes in $cameraNode){
    if ($nodes != "<done>"){
        if(`getAttr ($nodes + ".renderable")` == 1){
            $getPostScale = `getAttr ($nodes+".postScale")`;
            setAttr ($nodes+".postScale",($getPostScale * $width / ($width + $overscan)));
        }}}
       
setAttr ("vraySettings.width" ,($width + $overscan));
setAttr ("vraySettings.height" ,($height + $overscan));
setAttr -type "string" vraySettings.imgOpt_exr_attributes ("displayWindow=(50,50,1009,589);");

PostRenderMEL
int $overscan = 100;
int $width = getAttr ("vraySettings.width");
int $height = getAttr ("vraySettings.height");

string $cameraNode[] = `lsType("camera")`;
string $nodes;
for($nodes in $cameraNode){
    if ($nodes != "<done>"){
        if(`getAttr ($nodes + ".renderable")` == 1){
            $getPostScale = `getAttr ($nodes+".postScale")`;
            setAttr ($nodes+".postScale",($getPostScale * $width / ($width - $overscan)));
        }}}
       
setAttr ("vraySettings.width" ,($width - $overscan));
setAttr ("vraySettings.height" ,($height - $overscan));
setAttr -type "string" vraySettings.imgOpt_exr_attributes "";
 スクリプト作って自動で書き込んであげるようにすればいちいち面倒な計算しなくてすむ。やったね!


追記
公式でoverscanの項目が追加されたみたい。
 めんどくさいことはしなくて済みそうだ。