« JJJ検索。 | トップページ | 巨頭。 »

2009年11月 4日 (水)

組ミ。

いや、Color_Share も使えたのかあ、というだけのメモですよ。


カメラから見て、オブジェクトAの手前側(カメラに近い側)に存在するオブジェクトBがあるとして、AがBによって隠された部分はレンダリングしたくない、アルファチャネルも黒(つまり絵がない状態)になって欲しい、という場合があるじゃないですか。

素直にAとBを別レンダリングして合成すればいいだけなのですが、諸般の都合でそれができないこともあるわけでね。 BがやがてAの後ろに回りこむので別レンダリングすると合成時にレイヤの上下を入れ替えねばならず面倒だ、とかね。 あるいはパーティクルがオブジェクトの周りを縦横無尽に飛び回るなどという場合は、オブジェクトに対する上下関係が頻繁に入れ替わるので、上レイヤと下レイヤでレンダリングを分けるのは事実上不可能、とかね。 あるいは、1オブジェクトのある部分は上レイヤ、ある部分は下レイヤになるべき時は、1オブジェクトなので部分で分けてレンダリングできねえよゴルァとかね。

普通はマスクを別レンダリングするんでしょうが、わざわざレンダリングする Pass を増やし、合成時にマスク指定するなんて面倒くさいことをするほどのショットでもない、という場合も多いわけですよ。

結局、単純にBが居る部分に絵が全く生成されなければ、それでよい。


という時に、Bに対しては Constant シェーダを与えて、RGBA を全部 0 にすれば良いんですよね。 昔からやってます。 便利です。


余談ですが俺はこの状態のシェーダを「組ミ(くみ)シェーダ」などと呼んだりしています。主にアニメ作品の手描き作画素材などで、いわゆる組ミを切った作画のような状態だから。 ある素材が、手前にある物体に一部隠れるとき、隠れている部分は絵を作らずヌケにしておく状態ですね。

例えば背景に建物があり、その建物の柱のカゲに体が半分隠れているキャラクタがいるとします。 このとき、キャラクタの柱に隠れている部分は、最初から絵を作らないわけです。合成時、本来であればキャラクタは柱レイヤの下に来るはずですが、組ミで作っているので柱よりも上のレイヤにすることができます。 つまり柱を含む建物レイヤが、背景と柱の2レイヤに分けずに済むわけです。建物が複雑でパーツごとにレイヤ分けが難しい場合などに威力を発揮します。  ・・・って、まあこれは組ミの話ですが、3Dで作ったこの状態を組ミシェーダとか組ミマテリアルなどと呼ぶのはきっと俺くらいだろうな。 組ミというものをたまたま知ってたのでそんな風に呼び始めちまったというだけであり、決して一般的な用語ではありません。


で、XSI Base 読んでたら、誰かが Color_Share でもいいって言っていて。


なので、試しに Constant の代わりに Color_Share を出して、同じく RGBA を 0 にしたら、完全に同じことができました。 わあ、Constant じゃなくても良かったのか。知らなかったよ。

Color_Share はパラメータが RGBA の Color タイプ1つしかないから、シンプルでいいですわね。おそらくレンダリングも最も軽いんじゃないでしょうかね。 Constant は Transparency だのなんだの、組ミの目的には必要のないパラメータもいっぱい搭載してますからね。まあこれらの不要なパラメータも使わなきゃレンダリングを重くすることもさほどないでしょうが、不要なら最初から無いほうがスッキリしていいですよね。


というだけのメモでした。
いちおう画像載せておきます。


こういう状態。
Kumi1
XSI 男と、それ以外のもの(手前の赤い壁、奥の緑の壁)は別レンダリングしたいとします。 

壁2枚は一緒にレンダリングしたい。でも2つの壁の間には XSI 男がいる、という問題。
そして、XSI 男の体全体は赤い壁の奥、手だけは赤い壁よりも手前、という問題。


こういう場合に、XSI 男をレンダリングする Pass では、2枚の壁に Constant の RGBA 0,0,0,0 をくれてやります。
Kumi_constantrt

Kumi_constantppg

Kumi2
ま、この例の場合は、奥の壁はハイドしてしまってもいいんですけどね。大事なのは手前の赤い壁と XSI 男の間で組ミにすることです。


それをレンダリングすると、
Kumi3
当然こうなります。


アルファチャネルを見ると、
Kumi4
こうなります。
壁がある部分には、XSI 男の絵がまったく生成されていないのがわかります。
これでこの XSI男レイヤは、合成時に全ての壁よりも上レイヤにすることができますね。壁で隠れている部分には絵がないので、上から重ねても前後関係がおかしい絵にはなりません。 そして壁2枚は1レイヤとしてまとめてレンダリングすることが可能です。

もちろんショットの都合によってはこの逆の場合、つまり XSI 男の方に組ミシェーダを与えてレンダリングする場合も多いですね。




で、今日書いてるのは、この Constant を、Color_Share に代えても良かった、という話でした。知らなかったよ。
Kumi_colorsharert

Kumi_colorshareppg

レンダリング結果は上と全く同じです。パラメータ少ない分、Constant よりもこっちの方がいいんじゃねえの、ってだけの話です。はい。

ちなみに Ray_Type でもできると言っていたので試してみたら、できました。Eye レイに 0,0,0,0 をくれてやれば同じこと。 でもまあ、Color_Share の方がシンプルでいいですよね。はい。

------
追記:コメント欄における msk さんからの情報によると Scalar to Color でも同じことができるという話だったのでやってみたら、できました。

・Constant 0,0,0,0
・Color_Share 0,0,0,0
・Ray_type - Eye 0,0,0,0
・Scalar to Color 0,0

現在わかっている限りでは、上記のどれも同じ結果が得られるように見えます。
------


さらに追記:
コメント欄で Yot さんより更なるタレコミがあり、StoreInChannel でも同じ結果が得られました。独立させたいオブジェクトのマテリアルに Color_StoreInChannel を挿入し、どっかの Pass のチャネルに追加するだけです。
------





組ミ状態のレンダリングは合成時に便利なんだけど、まさに「その部分に絵がない」という組ミの性質そのものから来る欠点もありますわね。 例えばレンダリングした絵にポスト処理でブラーかけたりすることはよくあるわけですが、組ミだとその部分にピクセルがないので、背景の黒などがボケによって見えてくる(バレ)が出ちゃいますよね。 こればっかりは仕組み上どうしようもないですよねえ。そこに絵がないんだからねえ。 2Dで DOF 系のことをやるときも問題が出そうですね。手前のものがボケたためにその奥の部分がより見えてきたけど、組ミのためそこに絵がない、という状態ね。
だからやっぱり、素直に別レンダリングできるものはしちゃった方がいいですよね。ヌケがなく全体で絵が生成されている方が問題が少ないに決まってます。 ま、それができない素材にこそこの組ミをかますわけですが。


あるいは Zpic みたいな奥行きの情報が書き出せれば、そして合成ソフトウェア側でそれを正しく扱ってくれれば、それでもいいのかもしれませんね。 でもこの Zpic、少なくとも AfterEffects との組み合わせにおいて、マトモに使えないですよねえ。
他のファイルフォーマットで、前後の位置関係を指定できるものってありますか? いまどきならありそうだけどな。どうなんでしょう。


.

|

« JJJ検索。 | トップページ | 巨頭。 »

コメント

私は会社の先輩にオブジェクトBのところを
Scalar to Colorを使うと良いと教わりました。

逆にConstantでもできるんですね。
初めて知りました。

投稿: msk | 2009年11月 5日 (木) 11時13分

わっ ほんとだっ Scalar to Color でもできたっ
これもシンプルで良いですね。知らなかったよ。
情報ありがとうございます。追記しておきますわ。

なんか、いつもそれぞれが持っている知識が微妙にズレてますよね。俺は Constant しか知らなかったし、msk さんは Scalar to Color しか知らなかったし、Color_Share を使う奴もいれば Ray-type な人もいる。これを「XSI は作り方の多様性を許容している」などと言えば聞こえは良いですがそれは美辞麗句に過ぎず、実際はそういう機能・性能を装備していないだけ、開発者が思い至っていないだけ、あるいはマニュアルに明記してないだけであり、ユーザが仕方なく勝手に工夫して、本来想定されていない使い方をすることによって自力でしのいでいるというのが実情なわけです。今回の組ミのマテリアルなどはその典型例で、まったくもって XSI + Mental Ray らしい、クセのある、素直には想像できないワークフローです。 本当に困ったソフトウェアです。

投稿: junki | 2009年11月 5日 (木) 11時52分

勉強になります。
colorshareの場所が分からなくてうろうろしてしまいましたw
共有の中ですね。
状況にもよると思いますが、私は合成用には最近はチャンネルに格納を多用しています。


投稿: yot | 2009年11月 5日 (木) 12時31分

yot さんこんにちは。

>状況にもよると思いますが、私は合成用には最近はチャンネルに格納を多用しています。

すいません、この「チャンネルに格納」って何ですか? XSI の機能? ワークフローを教えてもらえると嬉しいです。

投稿: junki | 2009年11月 5日 (木) 12時42分

junki様
いろいろプラグイン重宝させてもらってます。
”名前。”一番気に入っております。

さて、チャンネルに格納
(ご存知だったらすみませんが以下ワークフローっす)
Color_StoreInChannel。

1、レンダーツリーでサーフェースに繋ぐ最後の赤い線を右クリック
挿入で(それ以外の出し方を忘れました。)、レンダチャンネルを追加して、格納レイタイプを選ぶ。
2、レンダ-マネージャーで、レンダチャンネル出力に先ほど追加したチャンネルを追加して出します。

で、一回のレンダリングで画像を二枚作成して使うという方法です。

ただ、今回のような場合
、もしXSI 男に複数のマテリアルがある場合全てのマテリアルを同一のチャンネルに格納しなければいけませんし、XSI 男と、それ以外の物レンダリングをして一緒にそのマスクとその一時レイなりを取り出すと言った事になるのでそれだけを早く描きたいという目的があると趣旨には反するかもしれません。

あと
気になるのが、このチャンネルの情報は一体どこで管理できるのか、チャンネル名を変な名前にしてしまった時、どうやったら修正できるのかわかりません。

投稿: yot | 2009年11月 5日 (木) 15時28分

わっ ほんとだっ Store In Channel でもできたっ

上の XSI 男の例で言えば、壁に対してではなく XSI 男に対して Store するんですね。へえ、全然知らなかった。追記しておきますわ。

確かに手軽かどうかで言うと、これまで出てきた他の手法の方が手軽な気はしますがね。ただ、別レンダリングするものがどのみちあって、ついでにこのチャネルも一緒にレンダリングしてしまえという場合であれば、お得感があるかもしれませんね。 

俺はチャンネルってほとんど使ったことなくて、その意義をまだちゃんと理解してません。1回のレンダリングで複数素材ということは、チャネルが増えた分レンダリング時間も増えて結局 Pass 分けしたのと変わらないとか、そんなことはありませんか? それとも、レンダリングが始まる時のテッセレーションなり準備の計算が1回で済むのでPass分けするより短縮になる、とかそんな感じですか? ベンキョしないとなあ。




>いろいろプラグイン重宝させてもらってます。
>”名前。”一番気に入っております。

なにっ。
ビールウェアですよ。わかってますよね。まだ登録してませんね。
今ならまだシリアルナンバーが1ケタ台ですよ。
さ、今すぐビールを送って下さい。
ビール券でもいいですよ。
毎度ありがとうございます
けけけけけけけ。

投稿: junki | 2009年11月 6日 (金) 18時59分

3dsmaxだと、Graphic Buffer チャンネルを保存できるRPF形式やRLA形式のファイルに出力するときのオプションで、レンダーノードチャンネルとかいうのがあります。

softimageについては知りませんが、もしかすると、そういうのがあるかもしれません。

投稿: | 2009年11月15日 (日) 12時47分

名無しさん、そうそう、Max には色んな情報を記録できるなにやら便利なフォーマットがあると聞いています。 XSI にはないと思います。

でも読み込み側(コンポジットソフトウェア)の方でも対応してないとダメなんですよね? 主要なソフトウェアはどれも対応してるんですかね?

っていうかあなた Max のお方ですか。俺に Max 教えてください。XSI と縁を切るために背中を押してください。

投稿: junki | 2009年11月15日 (日) 22時11分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 組ミ。:

« JJJ検索。 | トップページ | 巨頭。 »