[CG一般]黒体放射シェーダ

今回はFluidに関連してちょっこら。
本当はこれ自体はFluid関係ないんですが、まぁ大体一緒に使うものなんで一応。

Mayaの方もFumeの方も、みなさま通常爆発とか炎とか作るとき、どうやってレンダリングの色を決められているでしょうか。
そんなもんインプリメントのrampいじるしかねーだろ、って、はいその通り。

じゃあどうやってそのrampの色を決めていますか。
そんなもん見た目でかっこ良くなるようにやるしかねーだろ。はい。

現状どちらもそれしかコントロールを提供していないわけなので、見た目カッコよくなるようにrampで調整という手段しかありません。

しかしちょっとまった。

Fluidってそもそも物理的な動きをするものなわけです。
じゃあ色だって物理的に決まってくれてもいいんじゃない??と思うのが人情というもの。
だってイチイチ色決めるのめんどくせーし。

そこで出てくる黒体放射。
英語ではBlackbody Radiationとか言うそうです。

皆様、色温度に関しては詳しくご存知のことと思います。
太陽は5500Kだか5000Kだかでタングステンはなんたらで〜、、とかいろいろあるアレですね。

じゃあ色温度って何でしょうか?何をどうやって算出した数字なのでしょうか?

はい詳しくはこちら。
色温度 – Wikipedia

ちょろっと眺めるとこんなことが書いてあります。

色温度は、表現しようとする光の色をある温度(高熱)の黒体から放射される光の色と対応させ、その時の黒体の温度をもって色温度とするものである。

はい、つまり色温度とは黒体がある温度に達したときに放つ光の色と温度を対応づけたものです。
つまり黒体を1000Kに熱したらこの色、5000Kならこの色、10000Kならこの色、というのが色温度。

と、いうことは。

ということは!!

ざっくり言うと、温度がわかれば色がわかる、です。

温度と言えばTemperature。
Fluid野郎御用達(?)のTemperature。

おや?温度があるということは、これはもしや物理的に色決まっちゃうんじゃ・・・?

そーーーなんです!!(川平なんとか風

実はこの件に関して、既に論文が存在しています。
5のRendering of Fire以降がそれにあたります。
Physically Based Modeling and Animation of Fire(PDF)

でも僕には小難しいどころか、もう何もかもがちんぷんかんぷんでした^q^

なので僕が丸写し参考にしたのはこちら。
Production Volume Rendering (SIGGRAPH 2011) (HP)
Production Volume Rendering 2 – Systems (PDF)

こちらは2010年、2011年とSiggraphにて開催された同名のコースの際に使用されたコースノートで、
各プロダクションのVolumetricRenderingに関してのあれこれがまとめられています。
それはそれはもう大変詳しく!!
詳しすぎて、難しすぎて、英語だし、僕には一割も読めてませんが^q^

という超大作PDFなので、80MB超となっております。
貧弱な回線の方は気をつけてください:P

で、ちらっと眺めた感じ、WetaとSPIはBlackbody Radiationに関して言及していて、
Wetaのシェーダは最初に紹介した論文が元になっているそうです。

ですが僕が注目したのはSPIのチャプター4.5のBlackbody radiationの部分になります。
ここにはBlackbodyシェーダの実装に関して、非常に懇切丁寧な解説があります。
一部ソースコード付きで!!
これだけでももう垂涎もののありがたPDFです。
ありがとうMugnus先生!!!!!!!!!!!!!!!!!!!!!!!

実際最初の論文とSPIのとで出ている計算式は違うんですが、まぁこまけぇこたぁいいんですよ。

で、早速これを丸写し参考にしながらオレオレBlackbodyシェーダを!!
と思ったのですが、そこはMaya。
Fluidのシェーディングに関しては基本FluidShapeのShadingタブの中で調整するのみで
シェーダをユーザが開発するというようなことは想定されていません。

どうしても自前でやりたかったら、mental rayでキャッシュ読んでボリュームデータを構築するジオメトリシェーダ作るところからやらなきゃだめ?
面倒すぎ&難易度も高い&時間かかるので却下です。
僕ごときの開発力じゃ時間かかりすぎて元々の目的すら忘れちゃいそうです。

というわけでMayaFluidのIncandescenceを直接いじることにしました。
難しく言うと、自前の1D LUTを作っているのと同じことです。
上記PDFでも一回LUTにしてしまえばあとはLookUpするだけなので計算軽いよ、と書いてあります。

具体的には、Incandescenceのrampに20個とか30個のcontrolPointを作って、
そこに予めスクリプトで計算した色を放り込んでやります。

具体的にはこんな感じ。

Blackbody LUT Ramp

で、それから数日家で四苦八苦して、ツールを作りました。

それを利用して作ったのが、しばらく前にひっそりUPしたこちらの動画。
同じシミュレーションですが、サムネイルの左がデフォルトのシェーディング、右がBlackbody Radiationベースのシェーディングです。
あとちょっとだけノイズが入ってるのでアレですが、とりあえずそこはスルーでお願いします。

割とそれっぽい感じに見えるんですが、どうでしょうか。

開発の際、最初Pythonであれこれ計算して画像に出力して上手く出てるかとか試して、
一応それっぽい結果が出たなーと思ったところでMayaに移植した形になります。
スクリプトでは最低温度、最高温度、サンプル数(=rampのポイント数)を指定してやると、
選択したFluidのincandescenceが設定されます。
実際にはそれぞれのポイントの色を指定するExpressionが作られています。
あとちょっと色の強さとかをコントロールするためのアトリビュートがいくつか追加されていて、
それもExpressionを通してrampに反映されます。

 
このツールを作るとき、XYZ色空間のこととかも初めて触れるような状態でしたし、
そもそもこういう分野に関してはただの素人^q^だったので(今もですが)、とにかく調べまくりました。

で、結果がそれっぽく出てからも訳がわからず、masuosuzuki先生に相談させてもらったりしました。
その節はありがとうございました。

最終的には「正しいんだかなんだかよくわからないけどもひとまずそれっぽい結果が出てるからいいことにするか」作戦で
ツールとしては一応の完成を見た、ということにしましたw

とにかくシェーディングをする際の1つの基準になってくれればいいかな、と思っていたので
個人的なゴールは一応果たされた気はしています。

 
で!
僕としてはこれを実戦で使いたいと思っていたのですが、
まぁ爆発だ炎だ言う仕事がなかなか来ない\(^o^)/
ってやってる間に時は流れ、そして僕は大人になった・・・(?)
どうも、おっさんです。

ほんとは何回か挑戦したんですが、Fumeに勝てねえのです、どうやっても・・・

なんとか今の仕事で一回ぐらいは使いたいんですが、Fumeに勝たないことには、、、。

なのでFume版も作ってしまえ!!と思ったんですが、僕にmaxscriptを書く能力、というよりも
その環境と時間がないのでなかなかやれてません :S

僕のソースコードはなんなら公開しちゃっても良いんですが、
自分がまだ結果出せてないものを世に出すのもなんかアレなので出し惜しませてください。すみません。
今の仕事終わったら結果出る出ないに関わらずリリース考えます。
ただそんなに難しいもんではないと思います。僕に書けたんだから・・・!!
(とか言ってる間にMaya側で対応しちゃったりして・・・)

SPIのは本当に参考になります。
言及がないのはPlanck()とstdObserver()なわけなんですが、これはもうほんとに調べるのみです。
答えはWEBにある!! ありがとう先人たち!!!

あとつい先日PhysBAMの中にもBlackbodyのコードがあるのを発見したのですが、難しすぎて逆に訳がわからなくなりました^q^

 
とにかく!
気になった方は是非チャレンジしてみてください:)

 
まぁしかしアレです。
ただ単に良い感じのRamp作るほうがいいわ、って人はそっちでやったほうが100倍早いですし、
結果も望んだ通りになるのでむしろ良いと思います。
この方法が全てではないですし、正しい結果というわけでもないです。
ただ一つの基準として使えるならば御の字、って感じですかね。

 
で、なんで今更こんな話をしたかというと、
H12で実装されちゃったからです\(^o^)/\(^o^)/\(^o^)/
はい証拠↓
Pyro Blackbody VOP

インハウス以外ではまだ実装されてなかったのにぃいいいいぃぃいぃぃいぃいいいいいい
SideFXめ!!!!!!!!!!

しかもデフォルトのPyro2シェーダにインプリメント済み!
いやー、SideFXさんほんとに手が早いというか、すばらしい。
まぁでも彼らにかかってしまえば開発難しいものでもないですし、その割に効果は大きいですし、
ナイス見極め。

というかSideFXさんのデザインすばらしい。
昨日サラッと確認したら、ただ単にPhysicalベースのシェーディングに対応したというだけでなく、
Rampに値を反映させて後から編集するようなことも出来るようになってました。
ほんと素晴らしいデザイン。センスあるというか現場わかってる。
感動しました。

HoudiniのVolume Shaderの勉強として移植しようとか思ってもいたのですが、
ここまでやられてたらもう無駄ですねww
開発は別のアイディア探して何か作ることにします:P
勉強しなければならんことはまだまだありますしねー。

 
(・・)ノシ

「[CG一般]黒体放射シェーダ」への7件のフィードバック

  1. この記事を読み始めたとき、
    「Houdini12に実装されてますよ!」
    とコメントしようと思ってましたが、
    それがこの記事のトリガーだったんですね。

  2. はい、そうなんです。
    ぎゃーーーーーーやられたーーーーーーーーーーー\(^o^)/
    と思って、悔しいのであれこれ書いてみましたw

  3. >rvaくん&通りすがりさん
    1兆℃もあれば真っ青にでもなるんじゃないでしょうかw
    ていうかほんとに物理的にありうる温度なんですかそれwwww
    見えた瞬間死んじゃいそうですがw

  4. おー!これ前見た時から凄い気になってました。
    続報楽しみにしています。
    そしてますますHoudiniの時代を感じますね。
    Houdiniも扱うのが難しいですが、こういう便利な機能が備わっていくことによって、エフェクトもだんだん敷居が下がってくるのでしょうね。更に激しい競争の時代に・・・!
    うかうかしてられないですね。

  5. >ジャック・バウアーさん
    ありがとうございます。
    続報あるかわかりませんがw
     
    Houdiniはほんと素晴らしいソフトですよ。
    ただしこ難しい箇所が随所に散りばめられているのでめんどくせーーー!!!って思う人も多いとは思うんですが、まぁそこは各々のタイプによって好きなツール使えばいいと思うので、選択肢として現実的になってきたという事だけでも喜ばしいことなんじゃないかなと思っています:)
     
    ほんと日々の勉強が大切ですね:S

コメントを残す

メールアドレスが公開されることはありません。