Posted at 2006年11月12日 / SOLA Blog

オブジェクトソート - リアルタイム系の3Dデザイナーのためのロジック

オブジェクトソート

3D空間を描画する仕組みについてのお話。一般的な リアルタイム3D描画プログラム(3Dエンジン)は、Zバッファ法という手法で、レンダリングを行う。その対に Zソート法があったり、Zバッファを使った描画方法の仕組みそのものは、本題ではないので省略するが。(機会があれば、そのうち。)カメラから見た深度情報に従って該当するピクセルを塗りつぶしていく Zバッファ法が苦手とするのが、半透明(やアルファ抜き)なオブジェクトの描画だ。とにかく一番手前にあるポリゴンのピクセルを塗りつぶすのだから、2番目に手前にあるポリゴンは考慮しない。つまりは、手前にあるのが半透明ならば、奥にあるのはどう描画するの?ということになる。

と、前置きはこの程度にして。半透明やアルファ抜きされたポリゴンを描画するためには、Zバッファとは違ったプログラムが必要となる。ソレが、アルファテストであったり、今回の本題オブジェクトソート。ともかく、本当に正確に半透明やアルファ抜きをリアルタイム描画するには、PCに負荷が掛かり描画速度が遅くなる。ピクセル単位、ポリゴン単位で、どの面が手前でどの面が奥でという風に前後関係を計算(ソート)する必要があるから。で、プログラマとしては半透明は使って欲しくないのだけれど、見栄え上どうしても必要だということで、まぁ正確ではないけど動作速度上影響も少ないオブジェクト単位でソートするのが落ち着きどころ。Shockwave3Dでもそう。

で、オブジェクトソートって何?という本題。何も知らずに半透明をガンガン使うと思いもせぬ悲惨なものになる恐れがある。だからこそ、デザイナーは半透明を積極的に使えるように描画のロジックを知っておく必要がある。


オブジェクトソートは、オブジェクト単位で前後関係を判断する。このサンプルを見て欲しい。旋回してみてやると、前後関係がおかしく描画される箇所がある。これがオブジェクトソートの問題点。とにかく、オブジェクトの中心点だけで描画の前後判定を行っている。

 

でも、オブジェクトソートだからどうしようもない。こうなりたくなかったら半透明を使わないことなのだが、それでも半透明を使いたい場合。デザイナーがちょっと頭をひねれば解決策はある。例えば、横に長い壁を分割して、オブジェクトを 2つに分ければよい。

 

オブジェクトソートだと、オブジェクト内部の描画にも問題が出てくる。これもオブジェクトを分割することで解決する。このように、デザイナーがオブジェクトソートのロジックを理解しておけば、大体の問題は解決する。(と思う。。。)

Posted by アイザワ @イークラフト at 2006年11月12日 13:29 │Comments(8)TrackBack(0)Director Lingo
この記事へのトラックバックURL
http://app.blog.livedoor.jp/cpiblog00287/tb.cgi/50639232
この記事へのコメント
なんとなく分かっていたけど勉強になりました。
けど今こっちで試しに造ったファイルでは中心点でないみたいな表示になった…
なんだろ?
Posted by hirama at 2006年11月12日 20:26
オブジェクト基点ではなく、球体で囲んだときの中心点になります。
3dsmaxのオブジェクト基点を操作しても中心点は変わらないけど、
そういうことでしょうか?
Posted by アイザワ at 2006年11月13日 08:56
それぞれのオブジェクトにマップを張ってると問題が発生するみたいですね。
アルファを持つマップを張らないで不透明度を変更だけを変更しても自然に見える。

ところでMAXなどのビューポートではきちんと描画されるのにVRになるとおかしくなるのは何故なんでしょう?
Posted by hirama at 2006年11月13日 12:39
> それぞれのオブジェクトにマップを張ってると問題が発生するみたいですね。
マテリアルに透明度を設定しているか、アルファ付きのテクスチャを貼ってある場合、オブジェクトソートされます。透明度だけ設定してても、透明度が高いと余りよく分からないかも。

> ところでMAXなどのビューポートではきちんと
僕のMAX8では正しく描画されないですよ。。。透明度のあるモデルはやっぱりビューポートでもオブジェクトソートされてます。もしかすると、DirectXで表示させてるからかもしれないけど。
Posted by アイザワ at 2006年11月13日 12:47
フェンスとかのアルファ付きオブジェクトを何も知らんと分解してたけど、こういうことだったのか。この作業、地味でめんどくさい。でもやらないと絶対指摘されるし。。
他のVRソフトも同じことしてるのかな。
Posted by nakamura at 2006年11月14日 02:17
> 地味でめんどくさい。
そう仰らずに。。。

> 他のVRソフトも同じことしてるのかな。
そう選択肢はないと思いますが、どうなんでしょうか。今度機会があれば聞いてみましょう。ユーザがこのコメント見て発言してくれるとありがたいのですが。。

こういった描画のロジックや、ポリゴンの割き方、テクスチャの描き方とUVの付け方、テクスチャメモリとポリゴン数のバランスなど。パース用途では必須でないテクニックを身につけていくことが、きっと VR専門デザイナーに必要かと。
Posted by アイザワ at 2006年11月14日 07:32
しつこくなりますがGoogle Earthでもちゃんと表示してくれてるような気が。
もちろんスケッチアップでも、、
Posted by hirama at 2006年11月14日 21:22
max8はオブジェクトソートでなく、作った順ソートでした。新しく作ったモデルが手前に表示されるようです。
どんな3Dエンジンでも透明度モデルはオブジェクトソートされるという話ではないですよ。ただ、どんな3Dエンジンであれ、透明度モデルを正しく表示させるために、多少のフレームレートを犠牲にしなければなりませんが。
Posted by アイザワ at 2006年11月14日 22:30