ハル、ドメイン、ジオメトリシェーダーは何に使用されますか?


21

私は(元)雇用主のために3Dゲームプログラミングの公平な分配を行いました。また、独自のインディーゲーム用に独自のカスタムエンジンでプログラミングを行いました。

最初は、Direct3D 9とD3DX9から始めました。これらはほとんどすべてを行い、シェーダーの観点から考える必要はまったくありませんでした。

その後、最初のDirect3D 9シェーダーを作成しましたが、ほとんどすべてを1つの非常にシンプルなシェーダーで使用しました。

ゲームエンジンの最新の反復では、Direct3D 11に移行し、それによって多くのシェーダーを作成しました。GPUスキニング、GPU計算パーティクル、多くの照明効果、後処理効果をすべてGPUで行いました。本当にクールなもの。

これまでのところ、頂点シェーダーとピクセル/フラグメントシェーダーのみを使用しました。まだ行っていないことはまだたくさんありますが、頂点シェーダーとピクセル/フラグメントシェーダーが何をするのか、それが3Dパイプライン全体にどのように適合するのかについて確かな知識があると思います。

最近の開発に追いついて、新しいシェーダーステージに非常に興味を持ちました。つまり、ジオメトリシェーダー、さらに新しいハルシェーダーとドメインシェーダーです。

私はこれらのステージを使用したことはありませんが、知っていることから、Geometryシェーダーは、有効になっている場合、頂点シェーダーの後に実行され、変換された各頂点に1回(またはプリミティブごとに1回)、頂点(およびプリミティブ?)を破棄できます、新しいものを作成します(パイプラインの最初に戻ると思いますか?)。

私の推測では、ジオメトリシェーダーの主な用途は、GPUでジオメトリをプログラムで生成することです。一般的な使用法は、単一の頂点に基づいてビルボードクワッドを作成することですが、フラクタルや100%プログラムで生成できる他のものを除いて、他の多くの一般的なシナリオを実際に視覚化しません。

ハルシェーダーとドメインシェーダーについては、テッセレーション(粗い表面からより滑らかな表面を作成する?)に関連しているようで、一緒に使用する必要があるか、まったく使用しない必要があります。ここでは「パッチ」という用語も一般的なようです。

これらの新しいシェーダーステージの目的、3Dパイプラインにどのように適合するか、どのような場合にそれらを使用することを検討する必要があるのか​​、実際の用語で誰かに説明してもらえますか?


あなたは間違った方法を求めていると思います-「何のために使われているのか」ではなく、「何をしているのか」を尋ねるべきです実際にそれらを行うことができます。
ウォンドラ

@wondra:それはほぼ同じ質問ですが、実際の使用例に焦点を当てたいと思います。実際の使用例については、理論的な説明ではなく。実際、MSDNには概要があり、何度も読んでいますが、それでも何ができるのか理解できません。私は知的な存在であり、AとBを接続し、そこからC、D、E、Fを把握できます。
パンダパジャマ

「実際の使用例」は私には少し広いようです。私はそれを突き刺しましたが、このコメントの前に、あなたのために「彼らは何をするか」に集中しすぎているかもしれません。
ジョシュ

@Josh:現実の世界でこれらのステージをすべて使用していますか、それともすべて使用しましたか?
パンダパジャマ

1
DirectX以外のバックグラウンド(私のような)を持つ人のためのFYIであるこれら2つは、OpenGLおよびVulkanでは「テッセレーションコントロールシェーダー」および「テッセレーション評価シェーダー」と呼ばれます。
シャーバズ

回答:


13

船体とドメイン

ハルおよびドメインシェーダーステージは、GPUのテッセレーションパイプラインの一部です。通常、これらは、三角形または四角形(et cetera)として定義される、低詳細な入力サーフェスジオメトリに基づいて、非常に詳細なサーフェスジオメトリを計算するために使用されます。詳細度の低い入力プリミティブは「パッチ」と呼ばれ、最終的に存在する実際のジオメトリを表すものではない可能性があることに注意することが重要です。サーフェスを除いて、ベジェ曲線の制御点に似ていると考えてください。

ハルシェーダーは入力パッチを取得し、出力パッチを生成します(またはパッチ。これは一般にパッチの再分割が行われる場所です)。パッチに関する一定のメタデータは、ハルシェーダー内で計算し、パイプラインの後のステージで処理するために出力することもできます。

ハルシェーダーの出力は、適切なタイプのタイル化され正規化されたドメイン(四角形や三角形など)を生成する(固定関数)テッセレーションステージを実行します。

ドメインシェーダーはこれらのドメインに対して実行され、前述のテッセレーションの結果であるドメイン内の任意のポイントの実際の頂点位置を計算します。したがって、ドメインシェーダーは頂点位置を出力します。

テッセレーションフェーズは、パイプラインの頂点シェーダーステージの後に発生します。

ジオメトリシェーダー

ジオメトリシェーダーは、ある意味で単純化されたハル/ドメインシェーダーに似ています。それらは単に入力頂点を取り、出力頂点を生成します。特定の入力頂点に対して、多くの出力頂点を生成できるため、それらを使用して「ジオメトリを生成」できます。

ジオメトリシェーダーステージは、頂点シェーダーとテッセレーションステージの後に発生します。

用途

ジオメトリシェーダーは、パイプラインのラスター化およびフラグメントシェーディングフェーズに直接供給される代わりに、ストリーム出力バッファーに書き込むことができます。つまり、頂点/ハル/ドメイン/ジオメトリシェーダーの繰り返しの組み合わせによって生成されたジオメトリをパイプラインに再実行し、別の頂点シェーダーステージなどで追加の作業を実行できることを意味します。

どのような私が本当にそのアドレスにしようとしませんので、あなたはこれらを使用することができますことは、かなり広い、効果的に無制限の話題です。しかし、それらを使用することを検討する動機付けの理由については...これらのシェーダーステージの大きな利点は、メモリや帯域幅のコストを常に支払うことなく、非常に多くの詳細を潜在的に取得できることです。また、処理をCPUからGPUに移動することもできます。

テレインは、このテクノロジーの一部を使用する好例です。一般的に、非常に近く(キャラクターが立っている)と非常に遠く(遠くの山々)に、そしてこれらのシェーダーステージを介して「オンザフライ」で地形ジオメトリに配置する場所と量を制御することは非常に強力です。代替案は、歴史的に常に地形に一定の平均コストを支払う(最低公分母のアプローチ)か、GPUメモリ内外のさまざまな詳細レベルのジオメトリのチャンクを手動でページングするかのいずれかでした。高価な。

かなり細かく分割できるメッシュまたはモデルをサポートする必要がある非常に広範な詳細レベルがある可能性がある同様の状況は、これらのシェーダーでも賢いことをする候補になる可能性があります。ただし、すべてがサブディビジョンサーフェススタイルの最適化にうまく対応するとは限りません。おそらく布や髪にも使用できます。

さらに読むために、私が合理的に覚えているか、ここに入ることができるよりもはるかに詳細を含む:


4
ハルおよびドメインシェーダーにはDirect3D機能レベル11.0以降のハードウェアが必要であり、ジオメトリシェーダーにはDirect3D機能レベル10.0以降のハードウェアが必要であることに注意してください。また、ほとんどのビデオカードの設計では、ジオメトリシェーダーステージに専用ハードウェアがほとんどないため、実用性は当初想定されていたよりもはるかに低くなります。
チャックウォルボーン

@ChuckWalbourn:よろしければ、別の答えでもっと聞きたいです
パンダパジャマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.