🔍

オクルージョンクエリとPrediactedRendering

2022/06/09に公開

出てくる用語はD3D12で使われている意味のままという想定。

ID3D12CommandListにはSetPredicationという関数があり、第一引数のバッファを、第三引数のD3D12_PREDICATION_OPに従って評価しtrueならレンダリングをスキップするという機能がある。

bufferが0、OPがEQUAL_ZEROの場合はtrueになるので以降のレンダリングを省略することができる。(当然、OPがNOT_EAQUAL_ZEROならばfalseなので描画がされる。)

これの使いみちとしてクエリを利用したオクルージョンカリングなどがある。D3D12 SampleのQueryで実例を見ることができる。

オブジェクトが遮蔽されているかいないかを動的にバッファに格納し、次のレンダーパスで描画するかどうかを決めている。

サンプルに使われているD3D12_QUERY_TYPED3D12_QUERY_TYPE_OCCLUSIONは全部が遮蔽されていたら0、どこか一つでも見えていたら1を設定する。

したがってSetPredicationのOPEQUAL_ZEORと組み合わせると全部遮蔽されている(buffer=0)のときに描画がスキップされるという挙動になる。

ちなみに、vulkanやmetalで同様のことをやるには以下をみるとわかりやすい。

https://github.com/gpuweb/gpuweb/issues/551

metalだけSetPredicationにあたるAPIがなくIndirectDrawなど他の方法で実現しなければならなくマルチプラットフォームAPIを書くときは注意が必要。

Discussion