共有するシェーダーの変数と型の格納
クラス リンケージ オブジェクトは、複数のシェーダーが共有できる変数と型の名前空間です。 呼び出しでクラス リンケージ オブジェクトを渡してシェーダーを作成すると、ランタイムは、シェーダー内の各インターフェイスを実装できる変数と型の一覧を収集し、それらの変数と型の名前をクラス リンケージ オブジェクトに格納します。
したがって、 ID3D11ClassLinkage::GetClassInstance メソッドを呼び出してクラス リンケージ オブジェクトからクラス インスタンスを生成すると、ランタイムは、各シェーダーで指定された名前に対応する変数または型を取得できます (その名前が特定のシェーダーに対して有効な場合)。
たとえば、Color インターフェイスを実装する Light クラスがあり、頂点シェーダーとピクセル シェーダーでこのクラスを使用するとします。 シェーダーを作成する場合 (たとえば、 ID3D11Device::CreatePixelShader を呼び出すと)、ランタイムは Light クラスの種類が頂点シェーダーとピクセル シェーダーの両方で使用可能であると判断し、 Light クラス型をクラス リンケージ オブジェクトに追加します。 その後、必要な場所に Light インスタンスを作成し、両方のシェーダーのリソースをバインドし、シェーダーをデバイスに設定するときにクラス インスタンス配列でこのインスタンスを渡すことができます (たとえば、 ID3D11DeviceContext::P SSetShader を呼び出します)。 その後、ランタイムは次のシーケンスを実行します。
- インスタンスが同じクラス リンケージ オブジェクトを使用して作成されたことを確認します。
- Light クラスの種類が頂点シェーダーとピクセル シェーダーの両方で使用可能であることを確認します。
- 頂点シェーダーとピクセル シェーダーで異なる可能性がある正しい関数テーブルを選択します。
- インスタンスが提供するオフセットを送信します。
クラス リンケージ オブジェクトは、最終的には型と変数名のリポジトリです。 各項目で使用できる名前の最大数 (型と変数) は 64K です。 型と変数名が長いほど、シェーダーごとに格納されるインターフェイス メタデータのストレージ要件が高くなります。 これは、ランタイムがシェーダーごとにこれらの名前のマッピングを格納する必要があるためです。
関連トピック
関連トピック