オブジェクトソート - リアルタイム系の3Dデザイナーのためのロジック
3D空間を描画する仕組みについてのお話。一般的な リアルタイム3D描画プログラム(3Dエンジン)は、Zバッファ法という手法で、レンダリングを行う。その対に Zソート法があったり、Zバッファを使った描画方法の仕組みそのものは、本題ではないので省略するが。(機会があれば、そのうち。)カメラから見た深度情報に従って該当するピクセルを塗りつぶしていく Zバッファ法が苦手とするのが、半透明(やアルファ抜き)なオブジェクトの描画だ。とにかく一番手前にあるポリゴンのピクセルを塗りつぶすのだから、2番目に手前にあるポリゴンは考慮しない。つまりは、手前にあるのが半透明ならば、奥にあるのはどう描画するの?ということになる。
と、前置きはこの程度にして。半透明やアルファ抜きされたポリゴンを描画するためには、Zバッファとは違ったプログラムが必要となる。ソレが、アルファテストであったり、今回の本題オブジェクトソート。ともかく、本当に正確に半透明やアルファ抜きをリアルタイム描画するには、PCに負荷が掛かり描画速度が遅くなる。ピクセル単位、ポリゴン単位で、どの面が手前でどの面が奥でという風に前後関係を計算(ソート)する必要があるから。で、プログラマとしては半透明は使って欲しくないのだけれど、見栄え上どうしても必要だということで、まぁ正確ではないけど動作速度上影響も少ないオブジェクト単位でソートするのが落ち着きどころ。Shockwave3Dでもそう。
で、オブジェクトソートって何?という本題。何も知らずに半透明をガンガン使うと思いもせぬ悲惨なものになる恐れがある。だからこそ、デザイナーは半透明を積極的に使えるように描画のロジックを知っておく必要がある。
Posted by アイザワ @
イークラフト at 2006年11月12日 13:29
│
Comments(8)
│
TrackBack(0)
│
Director Lingo
この記事へのトラックバックURL
http://app.blog.livedoor.jp/cpiblog00287/tb.cgi/50639232
なんとなく分かっていたけど勉強になりました。
けど今こっちで試しに造ったファイルでは中心点でないみたいな表示になった…
なんだろ?
オブジェクト基点ではなく、球体で囲んだときの中心点になります。
3dsmaxのオブジェクト基点を操作しても中心点は変わらないけど、
そういうことでしょうか?
それぞれのオブジェクトにマップを張ってると問題が発生するみたいですね。
アルファを持つマップを張らないで不透明度を変更だけを変更しても自然に見える。
ところでMAXなどのビューポートではきちんと描画されるのにVRになるとおかしくなるのは何故なんでしょう?
> それぞれのオブジェクトにマップを張ってると問題が発生するみたいですね。
マテリアルに透明度を設定しているか、アルファ付きのテクスチャを貼ってある場合、オブジェクトソートされます。透明度だけ設定してても、透明度が高いと余りよく分からないかも。
> ところでMAXなどのビューポートではきちんと
僕のMAX8では正しく描画されないですよ。。。透明度のあるモデルはやっぱりビューポートでもオブジェクトソートされてます。もしかすると、DirectXで表示させてるからかもしれないけど。
フェンスとかのアルファ付きオブジェクトを何も知らんと分解してたけど、こういうことだったのか。この作業、地味でめんどくさい。でもやらないと絶対指摘されるし。。
他のVRソフトも同じことしてるのかな。
> 地味でめんどくさい。
そう仰らずに。。。
> 他のVRソフトも同じことしてるのかな。
そう選択肢はないと思いますが、どうなんでしょうか。今度機会があれば聞いてみましょう。ユーザがこのコメント見て発言してくれるとありがたいのですが。。
こういった描画のロジックや、ポリゴンの割き方、テクスチャの描き方とUVの付け方、テクスチャメモリとポリゴン数のバランスなど。パース用途では必須でないテクニックを身につけていくことが、きっと VR専門デザイナーに必要かと。
しつこくなりますがGoogle Earthでもちゃんと表示してくれてるような気が。
もちろんスケッチアップでも、、
max8はオブジェクトソートでなく、作った順ソートでした。新しく作ったモデルが手前に表示されるようです。
どんな3Dエンジンでも透明度モデルはオブジェクトソートされるという話ではないですよ。ただ、どんな3Dエンジンであれ、透明度モデルを正しく表示させるために、多少のフレームレートを犠牲にしなければなりませんが。