カテゴリー: Mental ray

Mental ray

mental ray 終了

mental ray が遂に開発終了となったというニュースが流れてきました。Wikipedia によると 1989 年から開発されていたとのことなので、実に 28 年に渡って開発が続けられてきたソフトウェアということになります。

ここ数年はさすがにかつての勢いは見えず、nVidia に買収されてからは新しい GPU レンダラにバトンタッチするんだろうなという雰囲気がビシビシと伝わってきていたんですが遂にその時が来たようです。この blog でも Metntal ray カテゴリがあるくらいいろいろとお世話になったので感慨もひとしおです。

確かに無くなってしまうのは惜しいものの、進化の早いレンダラという分野の中で 28 年も開発が続けられたと考えれば驚異的で、天寿を全うしたと言ってもいいでしょう。開発者の皆さん、おつかれさまでした。

CG, Maya, Mental ray

Volume rendering with Mental ray on Maya(2)

完全にプライベートタイムを使って調べているのでなかなか捗らない(という言い訳をして数週間放置w)ですが、Twitter やコメント欄でいろいろな方に助けて頂きながら少しづつわかったことがあるのでまとめてみます。

・シェーダの割り当て
ボリュームシェーダを使用する際にも、サーフェースシェーダは指定する必要があります。ここでは、”何もしない” シェーダ、transmat を割り当てます。

・parti シェーダについて
Maya には parti シェーダのソースが付属しています(devkit/mentalray/shaders/physics/partishade.cpp)。
このソースの Description を読むとわかるのですが、parti シェーダは GI の使用が前提になっています。この時点で用がないなと見切りますwww

・raymarcherシェーダについて
parti シェーダ同様、ray marcher のソースも付属しています(devkit/mentalray/shaders/base/baseraymarch.cpp)。
コードを眺めてみると、拍子拔けするぐらい単純な構造になっていることがわかります。

ザックリと説明すると

  1. mib_ray_marcher() から raymarch() 関数を呼ぶ。これが ray marcher の本体
  2. 二点の mi_call_shader_x() で得られた値を比較する
  3. 最大分割数未満かつ、値の差が閾値以上なら recurse() 関数を呼ぶ
  4. 2と3を繰り返す
  5. 得られた結果を加算する(ここまでが raymarch())
  6. 最後に値を正規化してやる

これだけです。教科書に出てくる ray marcher そのものです。そして、このコードを読むと幾つか発見もあります。

  1. 最後に正規化してしまっているので、計算結果がそのまま得られない
  2. 結局単なる ray marcher なので、mi_call_shader_x() で呼ぶシェーダ次第
  3. シェーダの計算結果をそのまま足してしまっているので、多分綺麗な結果が得られない

1,2 に関してはコードを読んだそのままです。1 は正規化しないようにすれば解決できます(多分。mental ray のシェーダが、正規化した値しか返せない仕様だったりすると困ります)。2 は、コードを読めば一発でわかりますが、日本語読解力の弱いわたしにはドキュメントを読んだだけじゃわかりません(ぇ。
3 は、ライトを考慮したシェーダネットワークを組もうとすると問題になるのかなと思います。ライトの場合、ray marching した結果の color と alpha を使って光源の値を”削る”(マスクする)必要があると思うので、これ用の仕組みを別途作ってやる必要があります。まあ、サンプリングポイント毎に馬鹿正直に計算していたら重いと思うので Deep Shadow Map のようなものを使って計算するのが無難なのでしょう。

・結論
いろいろ書きましたが、結局 raymarcher はレイ・マーチングを正直に実装しただけのシェーダだったということです。
これだけで何かできるというわけではなく、シェーダネットワークを組むための部品の一つとして使うために存在するものなので、これを元に Phenomena を作るか自分でシェーダを書くのが正しいアプローチなんだろうなーと、至って普通な結論に逹しています。

CG, Maya, Mental ray

Volume rendering with Mental ray on Maya

Maya の Menta ray 上でボリュームレンダリングをするテストをしているのですが、これがなかなか一筋縄にいかなくて苦労しています。

・できたこと

  • parti_volume シェーダを使ってボリュームライト的な表現をする→できたけど、目的とは違う
  • mib_rey_marcher を使ってボリューム的な表現をする→こちらが目的に近い

・できてないこと

  • ray_marcher を使ったとき、ボリュームの向こうにあるジオメトリがレンダリングされない(シェーダが起動しない?)
  • セルフシャドウ

ray_marcher の資料が意外となくて、ほとんど手探り状態で進めています。英語でも全然使用例が見つからないんですよね。。。

とにかく、今できていない二点は何とか解決したいものです。はてさて、どうやってやればいいのやら。。。

3ds max, CG, Mental ray

どうにもわからない

3ds max + Mental ray でボリュームレンダリングをする方法がわからなくて散々試行錯誤したのだけれども、やっぱりわからない(涙。

マテリアルを mental ray にして、Surface シェーダに Transparency をアサインして完全に透明にして、Volume に Mist とかを割り当てればボリュームレンダリングっぽい絵ができると思ったのに、なぜかできない。なぜだ。。。

YouTube でみつけた、こんな感じのことがしたいだけなんだけど…