2008/08/05

mental ray の基本中~の基本。

アンチエイリアシングの設定をどうすればいいのか分からない?
そんなの簡単だよ。こうやってこうやってこうすりゃいいじゃん。
なるほどね。こういうふうに設定すればいいのか。

でも、設定した値の意味は、分からないまま。

現状では、分かっている人が、分かっていない人に仕様書を渡せば良かったのです。
それでほとんどエラーなく、すんなりレンダリングが出来たはずでした。

だけど、近年、データの巨大化が進む中、同じ設定では、レンダリングが出来る出来ないが顕著になってきました。

Hair、FG、SSSなどなどなど・・・。管理職泣かせの技術たち。

そこで、エラーで止まってしまうフレームが出てきた場合どのようにしてレンダリングをかけられるようになるのかを結構はしょりで説明したいと思います。

今回は、エイリアシングの設定から。

Aliasing ( Raytracing & Scanline Only )とSampling Contrastには、常に密接な関係があります。

まず、Sampling Contrastから説明することにしましょう。
この設定の値はカラーです。RGBAの4つの値から成っています。
この値は、レンダリングされる絵のピクセルとピクセルの差を見ています。

■□
↑ピクセルのつもり

例えば、上記のようにピクセルが、RGBAが0(つまり真っ黒)と1(真っ白)の様な絵があったとしましょう。2ピクセルの絵と考えてください。
その場合、ピクセルとピクセルの色の差は、1-0の1になるわけです。
現在のSampling Contrastの設定は、全て0.2ですので、Aliasing ( Raytracing & Scanline Only )のMax Levelでアンチエイリアシングがかかります。
この場合、Max Levelの1が適用されます。

■■

次の例は、真っ黒なピクセルが隣り合った場合です。
この場合は、ピクセルとピクセルの色の差は、0-0の0です。
Sampling Contrastと比較して差が許容範囲なので、Aliasing ( Raytracing & Scanline Only )のMin Levelでアンチエイリアシングがかかります。
この場合は、Min Levelの-1が適用される訳です。(ほんとは、もうちょっと複雑な判定をします)

画像でコントラストの差を視覚的に見てみましょう。



ま、だいたい、0.05だと人間視覚的に限界なんじゃね?ということが分かります。
ということは、最終レンダレベルだと、Sampling Contrastは0.05くらいで良さそうですね。
プレビューなら、0.2とかにして、Min Levelの面積を大きくしてあげれば、プレビュー時間を短くすることが出来ます。

これで、色の差のコントラストが少ないときにはレベルを下げて、色の差が大きい場合はレベルを上げてレンダリング時間を効率よく使う事が出来ます。

例えば、真っ黒な部分の計算をしようとしたとき、全てのLevelが2の高い状態で計算するのは時間の無駄だという事です。
なぜ、時間の無駄かといのは、次の説明を読めば分かることでしょう。

Aliasing ( Raytracing & Scanline Only )のレベルとは、どういう意味なのか。
0の場合は、そのピクセル単体をそのまま計算します。



アンチエイリアシング無しの状態です。ギザギザ。

1の場合は、ピクセルを4分割して、サブピクセルとして計算します。



ちょっとまだ、アンチエイリアシングが甘いかな?という状態です。
でも、ブラーがかかるのなら、このくらいで十分いけるし、0でもいいんじゃね?って感じです。

2の場合は、ピクセルを16分割して、サブピクセルとして計算します。



これくらいなら、ほぼジャギる事は無いでしょう。
これ以上上げると時間が重くなり過ぎて、自分の首を絞めることウケアイ。

つまり、Levelが1の場合は、単純に解像度を2倍で計算している事とだいたい同じになります。
Levelが2の場合は解像度4倍です。

逆に、-1の場合はどうなるかというと、4ピクセルに対して、1回しか計算しようとしません。
つまり、Levelが-1の場合は、なんと解像度1/2で計算している事と同じになるのです。
こんな設定仕事では、使ってはいけません(結構居るんだな。コレが。※ちなみに、Vrayでも大体同じ)

ようするに、最終レンダリングをする場合、-1という値を入れて計算をするというのは、得策ではありません。
当然、ジャギーが発生する事になります。
ただし、Sampling Contrastの設定次第では、うまくいくかもしれません。
0.005の様な、肉眼で分からないくらいの色の差であれば、-1で計算しても良いかもしれません。
けれど、4ピクセルに対して1回しか計算できないので、細い剣の様な物をレンダリングする場合や、テクスチャがとても細かい場合、レイがヒットすることなく真っ黒なピクセルとして計算されることが多々あります。

逆に、Levelが2であって、16ピクセル分の計算をしたとしても、それ以上のテクスチャの解像度がある場合、ちらつきが発生してしまいます。
意味無さ杉くん。
テクスチャの解像度がデカければデカいほど良い訳では無いことを十分理解しておいてください。
キャラクターがどのくらいのサイズでレンダリングされるのかを判断して、テクスチャのサイズを小さくする事が必要になります。
テクスチャのサイズを小さくすることで、メモリの確保も出来るほか、ちらつきを抑える事が出来るでしょう。

ちなみに、メモリに関して、マニュアルにはこんな事が書いてありました。

メモリ要件の計算で使用される標準規則では、サーフェイス上の三角形1000個につき1MBのメモリが割り当てられます。
512× 512のテクスチャごとに、1MBの追加メモリが必要になります

だそうです。
つ・ま・り、1Triangleで、1B消費するってことだから、100万Triangleで、1GBのメモリを消費するってことです。

分かりやすっ。

(でも、結構長い間、知らずに過ごして来ました・・・。)

でもこれ、ギガポリゴンコアって、どうなるんだろう・・・。
ギガポリゴンコアだから、大丈夫なのか?!
IIになるし、大丈夫なのか?!

最後に、アンチを決定する際、熟練の技として

まず、これで、いいだろうと思われる値をセットします。
次に、3枚だけレンダリングします。
3枚をループ再生します。

コレだけで、ちらついているかが分かるようになります。

だいたい。

だいたいね。

だいたいだかんね。

だから、全フレ計算するなんて、アホなことすんなよっ。

6 件のコメント:

匿名 さんのコメント...

garu さん、すごくためになります。有難うございます。


すいません、ちょっと気になったことを質問させて下さい。

-----

まず、Aliasing ( Raytracing & Scanline Only ) の Min と Max の話です。 garu さんの説明だと、


隣接するピクセル同士のコントラストが、Sampling Contrast で指定した値以下に

1.おさまっていた場合は、Min の値を使う
2.おさまってない場合は、Max の値を使う

という風に、Min と Max の2つの値のうちどちらかを使う、という説明にに見えるのですが、こういうものでしたっけ?

僕はこれまで、

1.おさまっていた場合は、Min の値を使う
2.おさまってない場合は、1回サブピクセルに分割し(4分割)、色の平均化をし、コントラスト評価し直し
3.おさまれば終了、おさまらなければ、さらにもう1回分割(16分割)して同じことを繰り返す
4.2~3を繰り返すが、Max の回数に達したら、コントラストがおさまっていなくてもやめる

という風に理解していました(大雑把に書いてますが)。

なので、例えば Min = 0, Max = 3 という設定なら、僕の解釈だと1つのピクセルごとに、0回分割、1回分割、2回分割、3回分割の4種類の分割があり得ることになります。 garu さんの説明だと、Min である0回分割か Max である3回分割の、2つの場合しかあり得ないように読めるのですが、どうでしょうか? 僕が読み違えていますでしょうか? あるいは、読み違えてはいなくて、そもそも僕がしくみを勘違いしていたのでしょうか?

-----

それともう1つ、Level -1 という設定だと、garu さんの仰るとおり4ピクセル(タテヨコ2ピクセル)を1つとして計算するわけで、当然エイリアシングが発生する確率は高くなるわけですが、「仕事で使ってはいけない」というほどではないと、個人的には感じています。 もちろんこれは画像によるので1つの正解はありませんが、僕はいつも仕事で、 Level -1,2 / SC 0.05 くらいの設定にすることが多いです。 Min は -1 でも、0.05 におさまらない部分はどのみち分割が進むので。

ということで大抵のショットはこれで済んでいますが、ううむ、僕の見る目が甘いだけでしょうか?  garu さんのところでは Min に -1 のような数値を設定することは、まずないのでしょうか?

おっしゃる通り、細い線があるショット(特に動いているショット)などではレイがサンプルのすき間に入ってポッピングするという現象が多発します。そういう場合は Min に 0 や 1 を入れることはあります。

しかし、(もちろん画像によりますが)Min を -1 から 0 にしただけでレンダリング時間がガツンと増えることも多いので、納品間際で「絶対このレンダリングは失敗せずに1回で終わらせなければいけない」などという「成功率」が最も重視される場合を除いては、僕は -1 で始めて、ダメなら 0 でレンダリングし直す、ということが多いです。

-----

以上2点、garu さんの見解を聞かせてもらえるとすごくありがたいです。決してタテついているのではありません。正しく理解したいと思っているだけですので、どうか迷える子羊の勘違いを正して下さいませ。



-----

うちのブログでも似たような内容を書いたことがあるのですが、ううむ、わかっているつもりでわかっていないことも多そうで、これはもう一度検証しなおさなければいけないなと反省しております。

garu さんのコメント...

junkiさま、いらっしゃいませ。

1.おさまっていた場合は、Min の値を使う
2.おさまってない場合は、1回サブピクセルに分割し(4分割)、色の平均化をし、コントラスト評価し直し
3.おさまれば終了、おさまらなければ、さらにもう1回分割(16分割)して同じことを繰り返す
4.2~3を繰り返すが、Max の回数に達したら、コントラストがおさまっていなくてもやめる


そうですそうです。↑コレであってます。たぶん・・・。
はしょったので、その辺シカトしてみましたー。すんません。

あと、MinMax-1,2、ウチでも実際使っていましたが、ピクセルの間に落っこちる現象が起きたため、それは封印ということにしました。

ちなみに、前の会社でもvrayでそういう設定をしていて、なんでポッピングが起きているのか分からない人も居ました(それはMaxでですが)

いまどきの若者、分からないんです。ショックです。ジェネレーションギャップです。

なので、はしょってますねー。
やり直すのしんどいので・・・。

いろいろ会社によって設定違いそうですねー。
ワタクシは、-1は毛嫌いしてるので、絶対使いません。
知らないうちに納品している可能性があるからです。
ちょっと心配性なのかも?

やっぱり、レンダリングって、ノウハウが凄くあるし、経験からもこのくらいでいいでしょ?みたいなのもあるし、とても難しいセクションだと思いますね。
フロー上、絶対通らないと出来ない部分ですが、軽視されていることが多くて困ります。

とかいって、まだまだ全然知らない機能とかあったりして、勉強足らないんですけど。
BSPツリーだって、良く分からないで、BSP2になってしまうし・・・。

レンダリング、奥が深すぎです。

匿名 さんのコメント...

ああ、良かった。自分の解釈が大きく間違っていたのではないかと心配で心配で、日本酒が2合しか飲めませんでした。すっきりしました。

BSPも、ほんとよくわからないままです。勉強足りません。

ちなみにですが、Pigeon:Impossible のルーカスさんが 5.11 用のBSP自動調整スクリプトを投下してくれていたので、それを XSI6以降でも動くように書き換えたものを彼にメールしてみました。まだ反応はありませんが、何か展開があるか楽しみにしているところです。

garu さんのコメント...

おろろ。

なんか、65用のやつ、投下してたみたいですよ?
違うのかな・・・?

http://blog.pigeonimpossible.com/?p=110

BSPは、以前、カメラから見えるポリゴン全部ゲットしてめり込んでたら選択ってツールを作ろうとチャレンジしたんだけど、判定が激重になったので、BSPを使おうとしたら、書き方が全く分からないまま放置ってくらいまでしか到達出来ませんでした・・・。
概念は分かるんですけど、どーかいたらええんじゃろ?
数学ムズカシイ・・・。

匿名 さんのコメント...

garuさん、まさにそのリンクからダウンロードしたやつが、6.xx で動かなかったんですよ。彼のブログには動くって書いてるんですけどね。
中身を見てみると、やはり 5.11用という感じでした。6 からレンダーオプションまわりが変わりましたからね。なので修正して、ついでに UI 付けて、どうですかーって彼に送ったの。

でもまだ反応がないです。スパムにされてしまったか、あるいは彼も SIG に行くので準備で忙しいか・・・。

garu さんのコメント...

そーなんすねー。
動かなかったですか・・・。

SIGGRAPH行ったら、直で、アタックしてみてください!

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...