Direct3D 10, Occlusion Predicate Query

Published 21 July 06 01:01 PM | hiroyuk 

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 サンプルを参照してください。

Filed under:

Comments

No Comments
Anonymous comments are disabled

About hiroyuk

マイクロソフト㈱エバンジェリスト。北海道大学理学部物理学科卒。リアルタイム3Dグラフィックスを専門とし、グラフィックスやシェーダに関する技術文章を執筆・講演。 DirectX SDK日本語ドキュメントの開発に携わるとともに、Windows Presentation Foundation プログラミング(オーム社)、Game Programming Gemsシリーズ、リアルタイム レンダリング第2版(ボーンデジタル)、Texturing & Modeling, A Procedural Approach などを翻訳・監修、XAMLプログラミング(ソフトバンク クリエイティブ)を執筆。趣味は薪割り。

Search

This Blog

DirectX 情報

Silverlight 情報

Windows 情報

WPF 情報

並列コンピューティング情報

著書

Syndication

Page view tracker