2010/12/15

Ambient Occlusionのアルファ抜き

0 comment
リアクション: 
アルファシリーズ第3弾は、テクスチャアルファで切り取ったオブジェクトにAmbient Occlusionを適用させるには。です。

下の図は、左から、BA_raylengthを使用したもの。
真ん中は、Card/Opacityで切り取ったものに対して、AO。
一番右は、オブジェクトの形を切り取って、AO。



当然、一番右のくりぬいた結果が正解です。

左の、BA_raylengthでは、Tracing Depthに限界が見えます。Far planeを調節して、下の方までAOを行き渡らせることが出来るみたいですが、結果があまり良くありません。

真ん中は、一見良さそうに見えるのですが、Ambient Occlusionシェーダーは、テクスチャの透明を判断しません。オブジェクトの形を見て結果を出しています。
ですので、これは正しくありません。

そこで、Final Gatheringを使用したAmbient Occlusionを設定します。
比較的新しく投入された、mib_fg_occlusionシェーダーを使用します。
このシェーダーは、FGを使い正しくray判定を行い、AOを出力するシェーダーです。



わざわざAOを出すためにFGを使用するのはバカバカしいと思いがちですが、物凄い軽いです。
Number of Raysの値は、300くらいでキャラクターアニメーションにも耐えられると思います。
もし、fgmapを出したくないのであれば、ModeをExactにすればfgmapを出力せず、ガチで計算します。
Number of Raysの値は、同じく300くらい。でも、このやり方は、重たいです。オススメしません。

シェーダーのインプット、result_when_fg_is_offは、レンダ設定のFGのチェックがオフになっている場合、このインプットを使うということがマニュアルに書いてあります。
一応、上記の画像では、Ambient Occlusionシェーダーが刺さっていますが、特に必要が無ければ、何も付けなくてもOKです。

以前、調べたときは、Softimageの記事が全く無く、mayaの記事を発見してこうやって使うんだ…。でも、FGかぁ…。
と思ってしまったのですが、骨さんのKさんに存在を教えてもらい見直したら、これでいいじゃんって事になりました。
Kさんどうもありがとう!この場を借りて感謝です。

というわけで、新しいシェーダーもなかなか使えるものがあるなぁ。と思いつつ、少しずつ解析してますが、全く何やってんだかさっぱりわからないものだらけで、マニュアルの書き方をもう少しデザイナよりにしてくれないかなぁ。と儚い願いを毎日していますw

ではでは、アルファシリーズはこの辺で終了です。
また何かあったら、書きますねー。

2010/12/13

アルファでアルファ抜き

0 comment
リアクション: 
前回、Spriteの恐ろしさを書きましたが、今回は、比較的新しく追加されたCard/Opacityシェーダーについて書いてみようと思います。

Card/Opacity(mip)シェーダーの一部マニュアルを見てみましょう。

透明度に関連する他のシェーダを使用するときは、最終レンダリングでは木が正しく見え、枝の間から家が見える状態であったとしても、ほとんどの場合Z深度(および他のフレームバッファ)は平面の深度を含むことになります。たいていの後工程の作業では、これは望ましくありません。

この問題を解決するために、mental ray APIにはmi_trace_continueという機能が備わっています。この機能は最初のオブジェクトにヒットしたときの交差がなかったかのように、レイを継続します。カード/不透明度(mip_card_opacity)シェーダはこの機能を内部的に使用し、「標準」の透明度とmi_trace_continueの使用を切り替えて、与えられたしきい値で透明オブジェクトを作成します。


所見だけだとなんのこっちゃあまりよく分かりません。
でも、真剣に読んでいくと、なんとなくすごいシェーダーなんじゃないかと思えてきます。

要するに、レンダリング時に、透明でないといけないところが、オブジェクトの形でレンダリングされてりまう問題を、mi_trace_continueという機能で透けさせるってことがいいたいみたいです。

なので、もしかしたら。と思い試してみたところ、テクスチャのアルファで、アルファ抜きが出来ました!

2枚の板を出して、上の板に、おなじみのXSIロゴアルファ付きをPickerしてアルファを抜き出し、Card/Opacityのopacityノードに差すと抜けます。



アルファ表示では、結果はこんなありさま!



Card/Opacity(mip)シェーダーすげっす。
以前は、マスク出さないと出来なかったのに・・・。便利になったもんだ、Mental Ray。
バージョンアップしているんだなぁ。とひさびさに実感しましたw

とはいえ、あまり使うタイミングは無いかも知れませんが。

では、次は、Ambient Occlusionのアルファ抜きを書きます。

2010/12/07

最近のSoftimageの影の中の影。

0 comment
リアクション: 
最近のSoftimageで、だいぶ経ってしまったのですが、Spriteによる影の結果が変わっていることに気づきました。
その境は、v6.5→v7に移行したときに変更があったみたいです。
気づいた人はいるかも知れませんが、v7以降、Spriteを使用したときに、影の中に影がある状態を作ろうとするとおかしな挙動をします。

6.5で、Spriteを使用し、中のGridに適用させたものです。



結果はこうなって欲しいですし、正しいと思われるものです。



ところが、v7.01では、このようになってしまいます。
2011SP1でもこのような結果になってしまうようです。



これは、由々しき問題!!
正しかったものが、正しくない状態になっているという盲信はちょー危険です。

ですので、以下のように、今後Spriteを使用するのを禁止し、新しく登場した、Card/Opacityノードと、Simple Shadowノードを使うほうが良いと思います。



これで、正しい結果を取り戻すことが出来ました!
Card/Opacityノードをわざわざ何で使うのかというのは次回投稿しますが、かなり便利で、アルファでオブジェクトを抜くことが出来ます。
さらに、今までBA_laylengthを使わないと出来なかった、アルファで抜いたAmbient Occlusionの表現も可能になります。

というわけですので、ソフトも変わるので、私たちも変わらなければならないという教訓を忘れずに、Softimageと仲良くすごして生きましょう!

では今回はこの辺で。