2017-09-26 16 views
0

現在、Direct3D 11での実用的なレンダリングと計算を読んでいます。DirectX/OpenGLの経験がほとんどない人は、非常に参考になり、すべてが理にかなっていて、簡単です(非常に重いですが)。異なるシェーダプログラムを使用したDirectX 11レンダリングパイプ

しかし、私は現在第3章(130+ページ入り)にありますが、まだ簡単なことについては混乱しています。

シェイダープログラム、たとえば、リソースの一部に特定のシェーダープログラムを使用し、別のものに他のシェーダープログラムを使用する場合はどうなりますか?あるいは、すべての単一のリソースが同じように処理されますか?ここでのリソースは、頂点/インデックスデータ、またはテクスチャ1/2/3を参照してください。モデルを持っていれば、パイプラインで特定のシェーダプログラムを使用したいと思っています。

明らかに、いくつかの入力が異なるレンダリング結果のために異なるパスを下るようにするには何らかの方法が必要です。

これまでのところ、私は本では見たことがありません。

この質問がすでにどこかにある場合は謝罪、あまりにも確かではないような何かのためにGoogle検索をフレームする方法。

EDIT:明確にするため

は私がShaderA_vs.hlslと呼ばれる頂点シェーダ、および他と呼ばれるShaderB_vs.hlslを考えてみましょう。今度は、2つのオブジェクトモデル、ModelAとModelBをロードしました。このモデルは、Direct3Dの8.1で導入され、進化した

をレンダリング

プログラマブル:GPUのシェーダプログラミングのための2つの別個の経路が実際にあります私はMODELAがShaderA_vsを使いたい、とModelBはShaderB_vs

答えて

1

を使用します「変換&ライト」部分と「テクスチャブレンドカスケード」の古い固定機能レガシーモデルのうちの1つです。 頂点シェーダは、 "Transform & Light"に置き換えられたシェーダプログラムであり、Pixel Shaderが "Texture blend cascade"に置き換えられました。

単一のオブジェクト(点、線、または三角形)をレンダリングするには、頂点バッファから元のデータとして提供されたポイントごとに1回実行される頂点シェーダを設定します(索引バッファによってインデックスされる場合もあります)。次に、ハードウェアラスタライザは、オブジェクトが2Dスクリーン上に描かれるときにオブジェクトがタッチするピクセルごとにピクセルシェーダを実行します。その特定のシェーダと関連する状態の組み合わせに対して、一度に1つのピクセルまたは40億の三角形を描画できます。

状態またはシェーダプログラム自体の任意の面を変更したい場合は、新しい描画を提出する必要があります。各描画間で状態の一部または全部を変更することができます。場合によっては、デバッグレイヤーからの検証警告を避けるために、ある状態を明示的にクリアする必要がある場合もあります。シーン全体にわたる

効率的な状態管理は、あなたが設定されていなかった、と仮定状態は、フレーム間Present呼び出しの間から持続デフォルトの状態に依存するので、状態を想定しないようにしてください、課題となっています。

ハードウェアテッセレーション、ジオメトリシェーダ、およびピクセル単位の物理的な照明のすべての装飾を備えた最新のDirectXパイプラインでも、同じ基本概念の拡張です。

グラフィックスレンダリングの場合、これは一般的には良い概念モデルであり、以前のT & L + TextureBlendingモデルで考え慣れた人によく対応します。また、ポリゴンのスキャンライン変換、zバッファ深度のカリング、アルファブレンディングなどの一般的な計算では、高価なものを実行するために、さまざまな方法で拡張することができ、固定機能ハードウェアを非常に効率的に使用します。

計算

人々はあなたは、あなたが本当にラスタライズまたは何頂点シェーダがやっているについては全く気にしない従来のプログラマブルパイプラインで興味深い非グラフィックスのものを行うために、以前のモデルを使用していましたレンダリングターゲット全体に大きな矩形を描画するだけで、ピクセルシェーダにはたくさんのものがあります。結果として得られるレンダーターゲットをある種の「汎用バッファ」として扱います。

ここで問題となるのは、問題をこの「描画だが他のことを行う」モデルにマップするのは苦痛だということです。これは「計算シェーダ」(DirectXはこのDirectComputeと呼ばれます)を取得するモデルです。このモデルでは、頂点バッファ、インデックスバッファ、ポイント/ライン/三角形、ラスタライザ、またはテクスチャブレンドをまったく使用しません。バッファを書き出す単一のシェーダを実行するだけです。 Dispatchを介して直接実行されるシェーダのインスタンス数を制御します。

頂点シェーダ、ピクセルシェーダ、計算シェーダなどは、すべてリソース(テクスチャまたは汎用バッファとして扱われる部分)を参照して基本的に同じことを実行し、それらの計算を行い、他のビデオメモリ。暗黙の入力のために異なるシェーダのトップレベルの呼び出しですが、それはそれです。

シェーダを計算することの1つは、シェーダの他のモデルが、少量の共有メモリを介して他のシェーダインスタンスと(限られた)通信することができないことです。これにより、以前のモデルから得た非常に強力なマルチスレッド化の利点が損なわれますが、特定の問題を実行するのがずっと簡単になります。このようなことは、大きなストールを引き起こすことなくやるのが難しく、通常、有効な結果を得るには、すべての同期を手動で把握する必要があります。

私はすべての低レベルシェーダのものを隠し、それはまだ計算」との事の同じ種類をやっているC.のふりをするシステムである、CUDAが何をするかである第三の経路があることを言及する必要があります" カバーの下に。

+0

ありがとうございますが、私はこれが私の質問に答えるとは思わない。申し訳ありませんが、私は非常に明確ではなかった。 ShaderA_vs.hlslという名前の頂点シェーダと、ShaderB_vs.hlslという名前の頂点シェーダがあるとします。今度は、2つのオブジェクトモデル、ModelAとModelBをロードしました。私はModelAにShaderA_vsを使用し、ModelBにShaderB_vsを使用させたい。 – Mike5050

+0

VS '' ShaderA_vs.hlsl''(および互換性のあるピクセルシェーダ)を設定します。 ModelAに対して1つ以上の '' DrawIndexed''呼び出しを送信します。その後、VS '' ShaderB_vs.hlsl''(および互換性のあるピクセルシェーダ)を設定します。 ModelBに対して1つ以上の '' DrawIndexed''呼び出しを送信します。各サブメスが状態とシェーダの単一の組み合わせである「サブメス」の一貫した典型的なモデル。ファンシー(Fancier)レンダリングシステムでは、すべてのサブメーションを素材別に並べ替えて、すべての「素材1」の素材を、次に「素材2」などを描画します。アルファブレンディングを使用するものを描画する前に、不透明素材を最初に描画することが重要です。 –

+0

さようなら! DrawIndexごとに(GPU上の)リソースを設定して共有することはできますか?ワークフローは次のとおりです。すべてのリソース(テクスチャなど)を設定し、シェーダを設定し、モデルを送信します。次のモデルでは、他のシェーダを設定して、送信してください!本当に素敵なワークフローのためには、各オブジェクトのすべての同じマテリアル/シェーダをグループ化して、リソースを一度しか設定しないでください。 – Mike5050

関連する問題