Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Direct3D 10 の興味深い機能の1つに、occlusion predicate query (遮蔽断定問い合わせ?) があります。これは複雑な(大量の頂点を持つ)ジオメトリオブジェクトを描画する前に、それが現在の視点から見えているか、つまり他のジオメトリに遮られていないかどうかを問い合わせることができる機能です。もし遮蔽されていれば、自動的にそのジオメトリを描画しないようにして、むだな描画を減らします。
// Predicate オブジェクトの作成
ID3D10Predicate * g_pPredicate;
...
D3D10_QUERY_DESC qdesc;
qdesc.MiscFlags = D3D10_QUERY_MISC_PREDICATEHINT;
qdesc.Query = D3D10_QUERY_OCCLUSION_PREDICATE;
for( int i=0; i<NUM_MICROSCOPE_INSTANCES; i++ )
{
V_RETURN(pd3dDevice->CreatePredicate( &qdesc, &g_pPredicate[i] ));
}
// 遮蔽物メッシュのレンダリング
g_pPredicate[i]->Begin();
g_OccluderMesh.Render( pd3dDevice, g_pRenderOccluder );
g_pPredicate[i]->End();
// 頂点数の多いメッシュのレンダリング (predicate に合格した場合のみ)
pd3dDevice->SetPredication( g_pPredicate[i], FALSE );
...
g_HeavyMesh.Render( pd3dDevice, g_pRenderTextured, g_pDiffuseTex );
...
pd3dDevice->SetPredication( NULL, FALSE );
いわゆるハードウェアによる遮蔽カリングの1つですが、問い合わせによってハードウェアをストールさせないので、問い合わせによる大きな性能の低下がありません。ヒットすれば大量のジオメトリ描画が削減でき、性能向上が見込めます。
ただし、必ずしも Predicate「断定」の結果が正しいことが、保障されているわけではありません。それは、ハードウェアによる描画が必ずしも命令の順序やタイミングと一致ないからです。
詳しくは、DirecX SDK の DrawPredicated サンプルを参照してください。