background

Superflyがいろん・2

2016年09月28日(Wed)

空間内のあらゆる光について、引き起こされるすべての現象をくまなく計算したい。それが可能ならば、得られる結果はまさしく現実世界そのものになるだろう。とはいうものの、実際にはそう上手くいかない。すべての現象が厳密に解明されていたとしても、すべての光をトレースするにはとんでもない量の計算が必要になる。光の大半は衝突した物質に吸収されるとしても、残りはまた反射して空間を進んでいく。増えることはなくても、ゼロになることもない。ただ限りなく小さくなって、一つの極限値に近づいていく。永遠に亀を追い続けるアキレスのように、その計算はいつまでも終わらないだろう。

じゃあ、どこかで端折らないとね。

光源からスタートして、光の経路を追跡しながら明るさを計算しようとする考え方を、ライトトレースという。それに対し、視点(カメラ)から出発して、視点に届く光を逆行するように追跡する考え方をレイトレースという。

160928-01

ライトトレースに比べれば、レイトレースは圧倒的に計算が少ない。上下左右前後、全天方向へ進む光源からの光に比べて、視界にはレンダリングサイズという絶対的な制約があるからだ。レンダリングサイズが100×100ピクセルなら、1万ピクセル分の計算すればそれでレンダリングは終わる。

では、こんなシーンを考えてみよう。

160928-02

ここで、カメラから視線を飛ばす。これをレイと呼ぶ。

スキャンラインでは、視線(レイ)はオブジェクトに衝突した時点で止まる。そこでライトとオブジェクトの面の向きを確認し、ランバートシェーディングで色をつけ、フォンシェーディングでハイライトを上乗せしたら終了だ。レイトレーシングでは、オブジェクトの表面に屈折や反射が設定されていた時だけレイを反射させる。最大で設定された「レイの反射回数(Raytrace Bounds)」の分だけ追跡を行い、その表面の状態を確認して計算に反映させていく。

160928-03

影の描画が有効になっていた場合、レイトレースならオブジェクトの表面に衝突した時点で、そこに光が当たっているかどうか、つまり光源との間に遮蔽物がないかを調べる。スキャンラインの場合はそういった計算ができないので、不正確だが高速なシャドウマップを使う。

オブジェクトに衝突した時点で計算に入るので、スキャンラインやレイトレースは間接光を考慮しない。間接光を描画しようと思ったら、別の方法で計算して組み合わせるしかなかった。

そこで登場したのがパストレーシングだ。パストレーシングでは、レイはオブジェクトに衝突しても、まだ計算を行わない。その地点からさらにランダムな方角に二次レイを反射させるのだ。

160928-04

反射角=入射角ではなくて、なぜランダムな方向なのだろう? それは、拡散反射光がどの方角から来るかわからないからだ。二次レイを飛ばして調べるのは、他所からその地点に向かって届いている拡散反射成分である。常に反射角の方角から来ているとは限らないのだ。

さらに次のオブジェクトに衝突したら、またランダムな方向に反射して……それを繰り返して、レイが光源にたどり着いたらゴール。ここでようやく、レイは光源から今までに通った経路を辿り、衝突したオブジェクトの明るさを計算する。明るさとはつまり「入射光に対してどれだけ反射するか」だ。だから光源の情報が手に入って、初めて計算できるようになる。

160928-05

このようにして経路を追跡していくので、パストレーシングという。

パストレーシングがやっている計算は、ざっくり言えばこれだけである。影もIDLもSSSも分けて計算することはない。だからパストレーシングには、影やIDLやSSSの設定項目がない。全部一緒に計算しているのだ。

ここで、いくつかの疑問が浮かぶ。

なぜ、ランダムな方向に一本のレイを反射させただけで、正しい色が分かるのか。拡散反射はいろんな方角から届いているはずである。本来ならレイがオブジェクトに衝突した時点で、あらゆる方向にレイを反射させ、そのすべてを合算するべきじゃなのいか。だいたい、レイがいつまでも光源にぶつからなかったらどうするのだろう。

もっともである。しかし、オブシェクトに衝突するたびに無数の二次レイ、三次レイを飛ばしていたら、計算量がとてつもなく膨れ上がるのは目に見えている。とはいえ一本だけしか飛ばさなければ、それが本当に正しい「その地点に届く光」なのかはわからない。

だからこそ、ランダムな方向に二次レイを飛ばすのだ。

160928-06

これは品質を一番落とした状態のレンダリング結果。ピクセルサンプリングを1にした状態だ。これはこれで何か利用できそうな気もしなくはないが、およそリアルとは言い難い。真っ暗な点もあれば、明るすぎる点もある。だけど、目を離してぼんやり眺めてみれば、二次反射光も表現できてるし、明暗もなんとなく掴めてる気がする。「理論は合ってるけど精度が悪いよね」という状態だ。

160928-07

そこでパストレーシングではピクセルサンプルを増やす。ピクセルサンプルはFireflyにも存在するパラメータで、1ピクセルを計算するのに何回サンプリングを行うかを決定する。ピクセルサンプルが3なら、1ピクセルを決定するために3×3=9回計算を行う。なのでピクセルサンプルの設定を上げると、レンダリング時間は指数関数的に増大する。

160928-08

オブジェクトに衝突したとき、飛ばされる二次レイの方角はランダムである。なのでこの結果が合っているかどうかは確率次第だ。だからこそ、結果は試行回数を増やすほど正解に収束していく。この考え方を確率の分野ではモンテカルロ法と呼んだりする。

では、レイがいつまでも光源にぶつからなかったらどうするのだろう。オブジェクトの存在しない背景へ飛んでいくこともあるだろう。光源がとても小さかったり、部屋の中のように狭く入り組んだ形状だったら、レイはいつまでも反射を繰り返してしまう。

160928-09

背景に飛んでしまったらレイはもう帰ってこない。そんな時はそのレイを計算から除外する。さらに各レイに寿命を設ける。オブジェクトに衝突するたびに一定確率で死ぬようにして、毎回生死判定を行うのだ。これをロシアンルーレットと呼ぶ。いやホントに。他にもレンダラによっては最大反射回数を設定できるものもある。

このように増大する計算回数を制限する一方で、ライトからもレイを飛ばしライトトレースとレイトレースを合流させる双方向パストレーシングや、衝突時に一定確率で光源に直接ショートカットさせる手法、反射の方向をある程度限定する手法などもある。色々駆使してばらつきを抑え、計算結果を収束しやすくするのだ。

160928-10

現実世界で起こっている無限の衝突現象を計算する代わりに、確率を定め、有限回の計算を行う。試行回数を上げればいつかは現実に近づいていく。時間はかかるが、無限ではない。そういう考え方がパストレーシングの根本だ。

だから宿命的に、パストレーシングには粒子状のノイズがつきまとう。つぶつぶノイズは不正な計算結果ではない。収束しなかった確率の一部であり、まっとうな計算結果だ。なのでノイズを軽減するには、根本的には計算回数を増やすしか方法はない。まあ、パストレーシングが苦手なシーンを避けるとか、そういうテクニックはあるんだけど。

長くなってしまったので、今回はここまで。次回はマテリアルの概念に触れて、Superflyの設定項目はその次かな。



Superflyがいろん・1

2016年09月25日(Sun)

SuperflyはPoser 11から新しく実装されたレンダラである。

レンダラとはデータを所定の手続きで「描画(レンダリング)」するプログラムのことである。フィギュアやカメラをぐりぐり動かして、その様子をプレビューウインドウで確認できるのは、プレビューレンダラがリアルタイムで頑張った結果だ。また、Webブラウザが実際にはテキストファイルであるHTML文書を、こうやって色々装飾しながら表示するのもレンダリングという。コンピュータはいろんなものをレンダリングしている。

160925-01

実際に計算を行う根幹のプログラムのことを、レンダリングエンジンと呼んだりする。3DCGソフトなら、それに加えてシーン内のライトやマテリアルの解釈を行う部分や、レンダリング設定などの要素もまとめたものがレンダラというとになる。

Poserにレンダラが追加されたのはFirefly以来だから、ずいぶん久しぶりのことだ。久しぶりすぎて、なかなか体当たりできない人も多いんじゃないだろうか。今までのFireflyだってそれなりのことができてたわけだし、イマイチSuperflyのすごさがわからないし、と。

すごいかどうか結論は据え置くとして、SuperflyはFireflyと何がどう違うのか、そもそもSuperflyレンダラはどういうものなのか、そのへんをちょっと考えてみようと思う。

実際のところ、自分もまだ全容を把握できているわけではないので、不正確な部分や間違いもあると思う。そのへんはやんわり教えてもらえるとありがたい。


公式サイトやマニュアルを読むと、SuperflyはBlenderで使われているCyclesというレンダリングエンジンを元にしたレイトレースレンダラであると書かれている。物理ベースのレンダラであり、分散パストレーシングによって、リアルな画像を得られるとのことだ。

この分散パストレーシングというのはちょっと誤訳風味で、Branched=分岐するパストレーシング、と解釈した方がいいかもしれない。パストレーシングの原理自体と、どのへんが分岐なのかは後で説明するとして、大事なポイントはSuperflyが「物理ベース」のレンダラということだ。

では、物理ベースとはどういう意味だろうか。

「物理ベース」は何年か前にCG界隈で流行し始めた言葉だ。「リニアワークフロー」の次ぐらいなんじゃないかな。コンピュータの性能が向上するに従って、できることは増えていく。提唱されていた理論がようやく実用に足るレベルで実装できるようになると、一気に流行りだすのだ。

もちろん、目新しさだけで新しい技術が流行るわけではない。「リアルな結果になる」というのは、普遍的なニーズの一つだ。だけど物理ベースにはもう一つの切実なメリットがある。言葉遊びのようだけども、それは「物理ベースである」という点だ。物理ベースのレンダラとは、より物理法則に忠実なデータを、なるべく物理法則に従ってレンダリングするレンダラなのだ。つまり、より現実的で、嘘がない。

じゃあ今までのレンダラは嘘だったのだろうか。もちろんそうだ。嘘というと聞こえが悪いけど、近似や代替、簡略化といったものは、コンピュータの処理能力が限られている以上どうしても必要になる。あらゆる物理法則が完璧に計算で再現できるようになるまで、何かしらの誤魔化しは続く。物理ベースのレンダラだって、まだまだいろんなところを端折ったり誤魔化したりしている。

それでも従来のレンダラに比べれば、いくつかの代替概念とサヨナラして、より現実的なレンダリングを行えるようになったのだ。そう、リアルなレンダリングとは、もう誤魔化さなくてもいいレンダリングのことなのである。

例えば、Poser 4レンダラからFireflyになった時のことを思い出してみよう。Fireflyではレイトレース反射を描画できるようになった。それまで金属やエナメルなど、反射マップを使っていた表現を、そのまま反射で表現できるようになったんである。

160925-02

計算時間が増える代わりに、より現実的な描画ができるようになった。さらに、反射マップを作る必要がなくなった。それっぽい反射マップを作るのは製作スキルの一つだったろう。だけどレイトレース反射を適切に設定すれば、誰でも同じようにリアルな結果を得ることができる。新しい技術が、個人のスキルに依存する部分を減らし、より上質な結果をもたらした。そういう感じのパラダイムシフトが、物理ベースでもやってきたんである。

ではここでちょっと、Fireflyの描画を確認してみよう。

160925-03

FireflyはRendermanというレンダラのエンジンを元にしており、基本的にはスキャンラインレンダラである。スキャンラインというのは、ざっくり言えばレイトレースより早くて単純な計算方法だ。そこに足りない様々な計算結果を追加していく。まずはシャドウマップやレイトレースで影を乗算する。

160925-04

レイトレースで反射や屈折の計算結果を加算したり、AOを乗算したり。

160925-05

IDLを使うと、レンダリング前に間接光の計算をする。

160925-06

SSSを適用したマテリアルがあったら、その分だけ別に前計算をしたり。

160925-07

そういう結果を色々加味して、最終的にレンダリング結果が得られる。

160925-08

だけど、よくよく考えてみよう。現実の世界では、影はライトからの距離や遮蔽物に応じて黒く塗りつぶされているわけではない。ただ光が当たっていないから暗いんである。日陰が真っ暗でないのは、脳内で二次反射光を加算しているからではない。光がエネルギーを失うまで何度も反射を繰り返した結果、日陰からもわずかに目に届く光があるから、明るくなっているんである。

より現実的な結果を再現しようとして、複雑な計算をいくつも重ねてきた。だけど別々に計算している限り、どこかに齟齬は出る。実際、Fireflyは屈折の中の被写界深度を表現できなかったり、透過体の中のIDLを計算しようとするととんでもない時間がかかったりする。そろそろ限界じゃないかなあ、というのが旧来のレンダラのネックだったのだ。

また、こうも考えてみよう。

光は物質の表面に当たったとき、いくらか吸収され、いくらか反射して、いくらかは屈折する。表面の微細な凹凸によってあちこちに拡散した反射が拡散反射で、一定の方向に反射したのが鏡面反射だ。反射した光はまた別の物質にぶつかって、吸収されたり、反射したりする。

160925-09

物質の色を決めているのはなんだろう? 物質がある特定の色に見えるのは、その波長の光を反射しているからだ。逆に言えば、他の波長の光は吸収している。どの波長の光を吸収するかはだいたい分子構造で決まる。もんのすごくいい加減に説明すると、分子の周りを回っている電子と同じ波長を持つ光は、ぶつかったときにその分子をぐるぐる回って安定してしまい、出てこれなくなるのだ。吸収されなかった光は屈折して物質の中を進む。屈折率は物質の誘電率や透磁率で決まる。不純物にぶつかったらまた反射して、その中のいくつかは、物質に入った地点からそう遠くない場所に出てくるだろう。皮下散乱である。

光の経路を考えてみると、鏡面反射とレイトレース反射を分けて考える方が、むしろ奇妙に感じてくるだろう。ハイライトとは結局、反射した光源の姿そのものだからだ。また、拡散反射とレイトレース反射と屈折は合計を1以下に設定する、というのも納得がいくだろう。1以上にしたら、入った以上の光が出てくることになってしまうからだ。

そういえば拡散反射を描画するランバートシェーディングは、光が当たった時すべての方向に等しく拡散するという前提で式を簡略化している。しかし実際のところ、それは理想であって現実的ではない。どの色をどの方向にどれだけ反射するのか、そういう指標が本当は必要なはずだ。

色というのも再考の余地がある。ヒトが色を感じるのはある範囲の波長に反応する光の受容体が三種類ほど眼の中にあるからだ。その感度は均等でなく、さらに個人差もある。

160925-10

今は赤青緑の三色で計算しているけど、世界に溢れている電磁波の中にはいろいろな波長が含まれているし、物質が反射する光だって三色だけではない。分光反射率特性で色を設定し、あらゆる波長の光を積分し、ヒトの(あるいは別の生物の)眼の受容体の感度に基づいてレンダリングする。そういう未来も、やがては来るかもしれない。

まあ、そこまで話が飛んでしまうと、もう手がつけられないので(汗)。

せめて光が通るあらゆる経路を考慮して、物質表面の状態で反射率や色々を計算できたら、どんな風になるだろう? その考え方はとてもシンプルだ。そして膨大な時間がかかるだろう。なるべく簡単な計算方法を考えて、コンピュータの性能がどんどん向上して……今、ようやくある程度の精度を、そこそこの時間で叩き出せるようになった。

だったらもう、今までのマテリアルやその他もろもろの概念は、一旦捨ててしまおう。より素直に、ありのままの姿を計算しよう。

そういう考え方が、物理ベースなのだ。(つづく)

160925-11

次はパストレーシングとマテリアルのざっくりとした考え方についての予定。そしてこれは、使わなかったレンダリング比較(笑)。



前回からちょっと間が開いてしまったけど、相変わらず丸やら四角やらをレンダしている。未だにエアコンを切ると汗ばんでくるぐらいなので、早く涼しくならないかなと願うばかりだったり。

リクエストを頂いたのでSuperflyのあれこれを書いていこうと思ったんだけど、だったらやっぱりその前に、マテリアルルーム自体のこともまとめておこうかなと考えた。マテリアルルームはバージョンを重ねる内に、それなりに使い勝手が向上しているからだ。

なにせまず、範囲選択が可能になっていた。あと、ノード名を右クリックしてコンテクストメニューを表示するとか。むしろできない方がソフトとしてどうなんだ、とツッコミを入れたいとこだけど、実際2012ぐらいまではShiftキーを押下しながらノード名をクリックし、何もないところを右クリックしてコピーする、みたいなことをやってたんだから、有り難い限りである。

もちろんそれだけではないので、便利になったと思うところを列挙してみる。

1.適切な接続の例示

Poser 11では、ノードの出力部分をぎゅっとドラッグすると、

160919-01

そのノードから接続できる入力だけが残り、接続するべきでないノード値は灰色になる、というガイド機能が実装された。

160919-02

たとえばVolumeノードの出力から枝を伸ばしたら、Poserサーフェイスノードは反射色、屈折色、代替拡散、代替鏡面、そしてボリュームのノード値だけが有効表示になる。バンプや透明度には接続しない方がいい、ということがわかるわけだ。まあVolumeノードは大人しくVolumeに接続すればいいんたげども。

2.ノードに名前をつけられる(Poser 10より)

以前はマテリアルの各ノードに名前をつけようと思ったら、マテリアルファイルを直接編集して適用してやるしかなかった。自分も配布物を作るときは気張って外部名を考えたり、表示位置をピクセル単位で揃えたりしてたものである。

160919-03

しかし今ではノード名をクリックしてやれば、普通に入力が可能になっている。なのでイメージマップノードや数値演算ノードなど、同じ名前でたくさん登場するノードについては「バンプマップ」とか「輪郭線を合成」といったように機能で名前をつけてやれば、後から見てもそのノードが何をしているのかがわかりやすい。

ちなみにPoser 11はどうやらちゃんとマルチバイト対応できてるみたいだから、英語版で日本語を打っても特になんの問題もなかった。とはいえ海外の人も利用する配布物を作るような時は英数字以外は使わない方がいいから、結局日本語は打たないようになるんだけど。

3.ノードを折り畳める(Poser 10より)

たとえばこれは拡散IBLライトの色を指定するシェーダツリー。その昔RuntimeDNAあたりで配布されてたような気がするやつ。要は6枚の画像で6面の色を指定している。

160919-04

一度シェーダを組んでしまえば、イメージマップノードや各ノードを合成する部分というのはほとんど操作しない。なのでなるべく小さく折り畳み、すみっこに重ねたりして省スペース化に努めるわけだけども。

Compound(複合)ノードというやつは、こういうごちゃっとした部分を丸ごと選択して、

160919-05

右クリック>「Collapse to compound node (複合ノードに変換)」で折り畳むことができる。

160919-06

折り畳んだノードは、ノード名の横の「箱に入る感じのアイコン」をクリックしてやると

160919-07

中身が表示される。

160919-08

元の表示に戻る時は、左上の「箱から出る感じのアイコン」をクリックしてやるといい。このCompoundノードの中では新しくノードを追加することもできるし、さらに入れ子にすることも可能だ。つまり、複雑なツリー構造をまるっとブラックボックスにしてしまうことができるわけだ。

ちなみに、折り畳んだノードはExpand compound nodes(複合ノードを展開)を選ぶと元通りに展開できる。

この複合ノードとノード名の命名を組み合わせると、複雑怪奇化していたシェーダツリーをごく見やすく整理することができる。

160919-09

4.マテリアルを階層化できる

これはSuperflyレンダラでしか使えないけど、Poser 11のマテリアルはレイヤー(階層)を重ねることができる。具体的に、肌の上に刺青を重ねたりといったことができる。方法は簡単で、シェーダウィンドウの上部、レイヤー名の右にあるプラスボタンをクリックする。

160919-10

すると新しいレイヤーが作成される。そのままだと上位レイヤーが下位レイヤーを完全に覆ってしまいるので、レンダリングすると上位レイヤーだけが描画される。なので通常は上位レイヤーに透明度を設定して、部分的に下層のレイヤーのマテリアルを見せる。

160919-11

さらにその上に別のレイヤーを重ねることもできる。今まで刺青を二枚重ねようと思ったら、ブレンダーノードや数値演算色ノードを駆使して接続を変えなければならなかったが、そういったものもボタンひとつで解決できるわけだ。まあ、焼き込みや覆い焼きみたいな複雑な合成方法を取るなら、数値演算した方がいい気もするけど。

刺青や傷などの他にも、今まで困難だった「下層と上層で異なるバンプを持つマテリアル」、例えば凹凸のある物質の上にニスをコーティングしたような素材も手軽に実現できる。

また、お肌の一部を濡らしてさらにその一部に泡をくっつけたりみたいな、少数の(もしくは大多数の)ユーザーの探求心を刺激するマテリアルなんかも色々できるわけで。

160919-12

色々試してみるといいんじゃないかな。

5.複数のルートノードを持てる

新機能の中で、自分が一番メリットが大きいと思っているのがこれである。

従来、ライトや背景といった特殊なオブジェクトを除いたほとんどのマテリアルは、Poserサーフェイスノードというひとつの根っこ(ルート)のノードを持っていた。

それがPoser11ではPoserサーフェイスノードだけではなく、PhisicalサーフェイスノードとCyclesサーフェイスノードという二つのルートノードが追加された。

使い分けとしては、

  • Superflyでも今までのことがだいたいできるPoserサーフェイス
  • 物理的な特性をそのまま設定すればより素直に反映されるPhisicalサーフェイス
  • BlenderのCyclesレンダラで組んでたノードを再現できるようにしたCyclesサーフェイス

という感じ。

で、シェーダウィンドウの空いたところで右クリックすれば、新しいルートノードを追加できる。

160919-13

各ルート1つずつしか持てないということはなく、どのルートノードでも好きなだけ追加することが(たぶん)可能だ。

しかし、根っこになるノードがいくつもあるとレンダリングするときにどれを基準にすればいいのかわからない。なので、実際に使用するルートノードをチェックボックスで指定する。チェックの入っていないルートノードは無視されることになる。

160919-14

このチェックボックスはSuperflyとFireflyで別々に設定できるので、例えばFireflyでは今まで通りのPoserサーフェイスノードで、Superflyを使うときは新しいPhisicalサーフェイスノードで、といった使い分けができる。なお、スケッチレンダラとプレビューレンダラは、プレビュー画面の表示をそのまま使用するので設定はない。プレビュー画面自体は、直前に使用されたレンダラの設定を使って描画される。

この「レンダラやルートの種類に限定されずに複数のルートを持てる」というのは、色んなところで利用できる。例えばFireflyしか使わないというようなケースでも、トゥーンレンダするときはこちらのルートノード、SSSを使うときはこちらのルートノード、というように一つのマテリアルの中でまったく異なる設定を使い分けることができる。また、元々あるマテリアル設定を改造してみたいけど、元に戻せなくなったら困る……というような時は、とりあえずルートを新しく追加してみればいい。ルートから末端まで丸ごとコピー&ペーストしてしまうことも可能だ。

160919-15

いくらでも改造したい放題である。

もちろん、ひとつのマテリアル内に使用しないルートを保持する、という状態は恒常的には効率的でないかもしれない。マクロでうっかり孤立したノードを削除すると、Superfly・Fireflyどちらにもチェックの入っていないルートはがっつり削除されてしまう。なのでトゥーンのマテリアルはこれ、というように一通りの設定が決まったら、その部分だけを選択して登録した方がいいだろう。

160919-16

マテリアルを適用する時も、単体のマテリアル(mt5)は適用方法を「置き換え」か「追加」か選択することができる(ダブルクリックで適用すると置き換えになる)。自分なりのベースを作ってしまえば、他のキャラやアイテムに適用するのも手間が少なくてすむ。

改造や微調整、あるいは何パターンかのバリエーションの検討を、チェックボックスだけで切り替えられるというのは非常に手軽だ。今までマテリアル調整に費やしていた時間のいくらかは、このへんの機能を活用すればかなり短縮できるんじゃないだろうかと思っている。





Menu

Profile

Kyotaro

確定名:Kyotaro
ネタを探しているらしい。

Categories

Calendar

08 | 2016/09 | 10
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

Comments

Archives

Track back

RSS feed

Links

Search

※2011年4月6日のサーバ障害の為、エントリのアドレスが以前のものからズレています。当Blogのエントリにリンクを張っておられた方は、お手数ですがアドレスのご確認をお願い致します。

※Internet Explorer非推奨。