鍋が食べたいな・・・・
こんちわ! たくあんです。
今日は対二年用に3D技術?をやって行きます。
私の気まぐれでやるので、解りにくい事が多いかもしれませんが、
そこはみなさんで調べるなりして補間して下さい。
てかそんなに解説しないと思います。図とかないとわかりにくい事がかなりありそうだしね。
へぇー位で見てやって下さい。
[1回]
オクルージョンカリング!!
なんかカッコイイ響きです。
そもそもカリングをしっているでしょうか?
今の二年の段階で気にしたことない人はヤバい。
無駄なモノを描画していると言うのは自分でゲーム作りの自由度を下げているようなもんっす。
こういう表に見えないところを意識する事である程度、高負荷な処理がFPSを落とさずに、
出来るはず・・・たぶん。
視錐台カリングは聞いたことがあるかな?
実装までしてる人は今日の事は簡単かなぁ。
視錐台カリングはカメラのニアプレーン、フォアプレーン、カメラ位置等から視錐台を計算、
その中にオブジェクトが入ってるか(バウンティングスフィアとか)で描画するかしないか決める。
これを入れるだけでもかなり違う!
重くて困ってる人は調べて導入だ!!
さて、本題、オクルージョンカリングは例えばカメラの前にオブジェクトAがあり
その後ろにオブジェクトBがあるとする。
その時何もしなければAもBも当然描画されている。
そこで無駄だから、カメラから見てAの後ろのBを描画しないようにするのがオクルージョンカリングなのだ。
名前は立派だけど説明したらこんなモンです。
DirectXでならクエリ(命令みたいなもん)を使うことで実現できるようです。
http://msdn.microsoft.com/ja-jp/library/bb147308(VS.85).aspx
一応上がクエリについてのマニュアルです。
ぶっちゃけ「はぁ?」てなると思うが読み込めばなんとかなると思います。
自前でやるなら、遮蔽物を(上の例ならオブジェクトA)を平面として考えてその平面ポリゴンの各頂点を
使って視錐台カリングのような6面の平面を計算すれば可能でしょう。
あとはバウンティングスフィアとかで判定してやればいい。
これはこれで計算重くなりそうだけどw
要は自分でしっかり境界を計算できれば難しく考えなくても描画範囲を制限する事が出来ます。
このオクルージョンカリングはオクルーダー(障害物)を置く位置が重要になってくるので、
その変にも注意してください、あえて大きな木とか家を置いて無駄に描画しないとか色々使いどころも多いかもね。
他にも出入口から領域を再計算するポータルカリングとかもあるようです。
これは空間分割とかが必要なようで大変そう・・・・
あとなんでもカリングすればいいと言うわけではないですよ。
ドアとか両面が必要なものとか、常に描画する必要がある場合にはきちんと設定を切り替えるなり、
例外処理するなりしてください。
実は私は制作で視錐台カリングしか適用しませんでした。
オクルージョンカリングは名前はしっていましたが、作成の手間とかから、視錐台を選んだわけです。
皆さんも妥協点は必要ですよ、無理に入れても意味ない事もおおいですから、
ゲーム部分を優先で開発して下さい。
そこで、処理が重いななんて思ったらこの記事を思い出してくれたらと思います。
以上!!
ちなみにゲームエンジンUnityもオクルージョンカリングがガッツリ実装されています。
べ、べつにUnityを勧めてるわけじゃないんだからねっ!
PR
COMMENT
無題
マメな更新お疲れ様です。
ただ、こういうの載せるなら最後にちゃんと「パフォーマンスは計れよ」
って一言を忘れずつけといた方がいいと思う。
導入前より遅くなってたら本末転倒だし。
マルチスレッド化するにしても他の処理にしても、
計算量とかに見合うパフォーマンスが出て初めて報われるわけだから…
まぁ、技術自体を知っておくのは必要だと思うけどね。
以上、そんだけでした。