深度バッファーの更新はGPUでどのように機能しますか?


10

現在私はソフトウェアにある種の深度バッファを実装しようとしています、そしてそれを書いているとき私は大きな問題を抱えています。1つのmutexを持つことは絶対的な過剰です。そこで、スレッドの数と同じ数のミューテックスを作成しました。現在のピクセル(pixel_index%mutexes_number)に基づいてミューテックスをロックしていますが、これはうまく機能しますが、それでも非常に遅くなります。そして、それは実際のGPUでどのように行われるのでしょうか?巧妙なアルゴリズムまたはハードウェアがそれを処理しますか?

回答:


9

高度に専門化されたハードウェアがそれを処理します。典型的な戦略は、GPUがラスタライズをタイル化し、深度情報を圧縮形式で格納することです(たとえば、ポリゴンがタイルを完全にカバーする場合のZ方程式)。これにより、タイル全体を一度にテストできます。その他のクールなHWトリックには、ピクセルシェーダーが実行される前の深度テストが含まれます(条件が許せば、シェーダーは深度値を書き込めません)。各スレッドがタイルのサブセットを「所有」し、各プリミティブを個別に歩く、または代替フレームや代替ラスターラインなどのマルチGPU戦略を模倣するなど、ソフトウェアで同様のことを検討する場合があります。


11

実際のGPUでは、深度バッファーの同じ領域の読み取り/書き込みを試み、それらの間で同期を試みる複数のコアを使用する代わりに、深度バッファーがタイル(16x16や32x32など)に分割されます。タイルは単一のコアに割り当てられます。そのコアは、そのタイルのすべてのラスタライズを担当します。そのタイルに接する三角形は、所有するコアによって(そのタイル内で)ラスタライズされます。これにより、コア間の干渉がなくなり、フレームバッファの一部にアクセスするときにコアを同期する必要がなくなります。

これは、複数のタイルに接する三角形を複数のコアでラスタライズする必要があることを意味します。したがって、ジオメトリ処理(頂点と三角形の操作)とピクセル処理の間に作業の再配布ステップがあります。

ジオメトリステージでは、各コアが入力プリミティブのチャンクを処理する場合があります。次に、各プリミティブについて、プリミティブが接触するタイルをすばやく決定し(これは「粗いラスタライズ」と呼ばれます)、影響を受けるタイルの1つを所有する各コアのキューにプリミティブを追加します。

次に、ピクセルステージでは、各コアはキュー内のプリミティブのリストを読み取り、コアが所有するタイルのピクセルカバレッジを計算し、さらに調整する必要なく、深度テスト、ピクセルシェーディング、フレームバッファーの更新に進むことができます。他のコアと。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.