次の方法で共有


シェーダー間で共有するための変数と型の格納

クラス リンケージ オブジェクトは、複数のシェーダーが共有できる変数と型の名前空間です。 シェーダーを作成する呼び出しでクラス リンケージ オブジェクトを渡すと、ランタイムは、シェーダーに各インターフェイスを実装できる変数と型のリストを収集し、それらの変数と型の名前をクラス リンケージ オブジェクトに格納します。

そのため、 ID3D11ClassLinkage::GetClassInstance メソッドを呼び出してクラス リンケージ オブジェクトからクラス インスタンスを生成すると、ランタイムは、各シェーダーで指定された名前に対応する変数または型を取得できます (その名前が特定のシェーダーに対して有効な場合)。

たとえば、Color インターフェイスを実装する Light クラスがあり、頂点シェーダーとピクセル シェーダーでこのクラスを使用するとします。 シェーダーを作成すると (たとえば、 ID3D11Device::CreatePixelShader を呼び出すことによって)、ランタイムは Light クラスの種類が頂点シェーダーとピクセル シェーダーの両方で使用可能であると判断し、 Light クラス型をクラス リンケージ オブジェクトに追加します。 その後、必要な場所に Light インスタンスを作成し、両方のシェーダーのリソースをバインドし、シェーダーをデバイスに設定するときにクラス インスタンス配列でこのインスタンスを渡すことができます (たとえば、 ID3D11DeviceContext::P SSetShader を呼び出します)。 その後、ランタイムは次のシーケンスを実行します。

  1. インスタンスが同じクラス リンケージ オブジェクトを使用して作成されたことを確認します。
  2. 頂点シェーダーとピクセル シェーダーの両方で Light クラスの種類が使用可能であることを確認します。
  3. 頂点シェーダーとピクセル シェーダーで異なる可能性がある、適切な関数テーブルを選択します。
  4. インスタンスが提供するオフセットを送信します。

クラス リンケージ オブジェクトは、最終的には型と変数名のリポジトリです。 各項目 (型と変数) で使用できる名前の最大数は 64,000 個です。 型と変数名が長いほど、シェーダーごとに格納されるインターフェイス メタデータのストレージ要件が高くなります。 これは、ランタイムがシェーダーごとにこれらの名前のマッピングを格納する必要があるためです。

動的リンク

動的リンク