5
for (int i = 0; i < Number_Of_queries; i++)
{
    glBeginQueryARB(GL_SAMPLES_PASSED_ARB, queries[i]);

    Box[i]

    glEndQueryARB(GL_SAMPLES_PASSED_ARB);
}

特定の数のクエリが実行されるオクルージョン カリングのために GPU GEMS 1 で提案されている方法に興味があります。説明されている方法を使用して、個々のボックスを相互にテストすることはできないため、次のことを行う必要がありますか?

テスト ボックス A -> レンダリング ボックス A

テスト ボックス B -> レンダリング ボックス B

テスト ボックス C -> レンダリング ボックス C

等々...

4

2 に答える 2

2

私があなたを正しく理解しているかどうかはわかりませんが、これは最初にすべてのボックスをレンダリングし (深度バッファーに書き込みません)、次にクエリ結果を使用してすべてのオブジェクトをチェックする単純な実装の欠点の 1 つではありませんか? ただし、単一のボックスのクエリ結果をすぐに使用するという提案は、パイプラインを停止させるため、さらに単純なアプローチです。この章 (第 29 章を参照していると仮定して) をさらに読むと、単純な両方のアプローチの欠点を克服するための簡単な手法が提示されます (つまり、すべてを通常どおりにレンダリングし、前のフレームのクエリ結果を使用するだけです)。

于 2011-08-14T16:38:32.633 に答える
0

(GPU gems の記事をリンクするとよかったのに...) と思いますが、次のような拡張機能で説明されているように、多少非同期のクエリについて混乱しています。

http://developer.download.nvidia.com/opengl/specs/GL_NV_conditional_render.txt

私が正しく思い出せば、ブロックせずに結果の可用性をチェックするための他の拡張機能がありました。

クリスチャン・ラウが指摘しているように、「クエリを実行し、結果を待ち、結果に基づいて何かを実行する」だけでは、「何かを実行する」作業の量によっては、停止する可能性があり、そのために利益が得られない可能性があります。実際、単一の描画呼び出しを保存するためだけにクエリを実行し、往復するのを待つことは、ほとんどの場合、まったく役に立ちません。

于 2012-02-04T05:31:49.743 に答える