カリング手法とZTestについて
背面カリング・PreZ・PostZ・ZprepassRendering・HiZ・オクルージョンカリング・ポータルカリング
などなどの情報を自分用のメモとしても技術をまとめておきます。
PreZとPostZ
PreZ(EarlyZ)
PixcelShaderが実行されるより前にZTestをする。Testした結果既に描かれているDepthより奥側だった場合はそれ以降の描画は行わない。
PreZを有効にするにはいくつか注意するポイントがあります
・PicxelShaderの出力にSV_Depthを含めてはいけない。
・PixcelShader内でdiscardやclipのような棄却処理を行ってはいけない 。
PostZ
PreZが効かなかった場合にPixcelShader実行後にZTestされる。なるべくPreZが使えるほうが良い。
ZprepassRendering
モデルを描画するまえに先にDepthMapを作っておく手法
こうすることにより、
既にDepthが描かれているのでモデルの描画順を順不同で描画しても問題ない。
ZprepassRenderingではない場合は、手前から描画したほうがDepthTestに成功する確率が高いのでカメラに近い順でモデルをソートして描画する手法がいい。
HiZ(階層型Zバッファ)
DepthMapにミップマップがあります。CPUから境界球(x,y,z,radius)をGPUに転送し、GPUはMipが高い順に可視判定を行う。その後CPUで読み取る。
Hierarchical Z-Buffer Occlusion Culling
ZCompression
読んでも全てを理解できなかった。こちら参照
http://fileadmin.cs.lth.se/graphics/research/papers/depth2006/dbc.pdf
Fast Z Clear
バッファ全体をクリアするのではなく、クリアしたことにするタグを付ける。
HyperZ
PreZ+ZCompression + FastZClear + HiZ これらが実現されているとHyperZと言う。
カリング手法
背面カリング
頂点の並びが時計回りのときは前面で反時計回りのときは背面になります。
時計回りを英語でClockWiseと言い、反時計回りはCounterclockwiseと言います。
DirectX11で背面カリングする場合はD3D11_RASTERIZER_DESC構造体のCullModeにD3D11_CULL_BACKを入れます。
視錐台カリング
カメラの領域外のモデルを描画しない技術です。
near-farの判定と上下左右のプレーンより内側にある判定をする技術です。
ポータルカリング
インドアな環境でよく用いられる手法です。
A,B,C,Dという部屋がドアによってつながっている時に、ドアを視錐台カリングしてその部屋の可視判定をします。
オクルージョンカリング
オクルージョンカリングとはあるモデルが他のモデルによって隠されていて、カメラに映らない時に描画を実行しないようにする技術です。オクルージョンカリングにも様々な手法があるので知っている限りで列挙しておきます。
オクルージョンカリングで以下2つはよく使われる用語です。
オクルーダー:他モデルを隠すモデル。大きいほうがいい。
オクルーディー:他モデルによって隠されるモデル。
・Hizを用いたオクルージョンカリング(前述のHizで説明済み)
・CPUでオクルージョンカリング(ソフトウェアによるオクルージョン・カリング | iSUS)
CPUでDepthMapを用意して、CPUでラスタライズをする手法。
・OcclusionQueryを発行して描画したモデルのピクセル数を取得
オクルージョンカリングのミドルウェア
・Umbra(Umbra Support)
オクルージョンカリングのゲームでの実例
GRAVITY DAZE:4Gamer.net ― [GTMF 2012]「GRAVITY DAZE」開発スタッフが語る,アートコンセプトをPS Vita上で実現した手法の実際
BattleField3:http://twvideo01.ubm-us.net/o1/vault/gdc2011/slides/Daniel_Collin_Programming_Culling_The_Battlefield.pdf.pdf
KillZone3:Practical Occlusion Culling on PS3
参考リンク:
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
なにか間違えやアドバイスなどあればご指摘願います。