State オブジェクト (Direct3D 10)
Direct3D 10 では、デバイスの状態が状態オブジェクトにグループ化され、状態変更のコストが大幅に削減されます。 状態オブジェクトは数種類あり、それぞれ、特定のパイプライン ステージ向けに一連の状態を初期化することを目的としています。 状態オブジェクトの種類ごとに最大 4096 個を作成できます。
入力レイアウトの状態
この状態グループ ( D3D10_INPUT_ELEMENT_DESC参照) は、 入力アセンブラー ステージが入力 バッファーからデータを読み取り、頂点シェーダーで使用するためにデータをアセンブルする方法を指定します。 これには、入力バッファー内の要素数や、入力データの署名などの状態が含まれます。 入力アセンブラー ステージは、メモリからパイプラインにプリミティブをストリーム配信するジョブを持つパイプラインの新しいステージです。
input-layout-state オブジェクトを作成するには、「 CreateInputLayout」を参照してください。
ラスタライザーの状態
この状態グループ ( D3D10_RASTERIZER_DESCを参照) は 、ラスタライザー ステージを初期化します。 このオブジェクトには、塗りつぶしやカリングのモード、クリッピングでのシザリング四角形の有効化、マルチサンプル パラメーターの設定などの状態が含まれます。 このステージでは、プリミティブをピクセルにラスタライズし、クリッピングやプリミティブのビューポートへのマッピングなどの操作を実行します。
ラスタライザー状態オブジェクトを作成するには、「 CreateRasterizerState」を参照してください。
深度ステンシルの状態
この状態グループ ( D3D10_DEPTH_STENCIL_DESC参照) は、 出力合併ステージの深度ステンシル部分を初期化します。 具体的には、このオブジェクトは、深度とステンシルのテストを初期化します。
深度ステンシル状態オブジェクトを作成するには、「 CreateDepthStencilState」を参照してください。
ブレンドの状態
この状態グループ ( D3D10_BLEND_DESC参照) は、 出力合併ステージのブレンド部分を初期化します。
ブレンド状態オブジェクトを作成するには、「 CreateBlendState」を参照してください。
サンプラーの状態
この状態グループ ( D3D10_SAMPLER_DESCを参照) は、サンプラー オブジェクトを初期化します。 サンプラー オブジェクトは、シェーダー ステージにおいて、メモリ内のフィルター テクスチャに対して使用されます。
Direct3D 9 と Direct3D 10 の違い:
- Direct3D 10 では、サンプラー オブジェクトは特定のテクスチャにバインドされなくなりました。アタッチされたリソースを指定してフィルター処理を行う方法について説明するだけです。
sampler-state オブジェクトを作成するには、「 CreateSamplerState」を参照してください。
パフォーマンスに関する考慮事項
状態オブジェクトを使用するように API を設計すると、いくつかパフォーマンス上のメリットが得られます。 これには、オブジェクト作成時の状態の検証、ハードウェアでの状態オブジェクトのキャッシュの実現、(状態ではなく状態へのハンドルを渡すことで) 状態設定 API 呼び出し中に渡される状態の量の大幅な削減などが含まれます。
このようなパフォーマンスの向上を実現するには、アプリケーションの起動時 (レンダー ループのかなり前の時点) に状態オブジェクトを作成します。 状態オブジェクトは変更できません。つまり、一度作成されると、変更できません。 変更する場合は破棄して作成し直す必要があります。 この制限に対処するために、状態オブジェクトの種類ごとに最大 4096 個を作成できます。 たとえば、さまざまなサンプラー状態の組み合わせを使用して、複数のサンプラー オブジェクトを作成できます。 その後、サンプラーの状態を変更するには、適切な Set API を呼び出し、(サンプラーの状態ではなく) オブジェクトにハンドルを渡します。 これにより、呼び出しの回数とデータ量が大幅に削減されるため、状態変更のレンダー フレームごとにオーバーヘッドが大幅に削減されます。
または、アプリケーションの状態オブジェクトの効率的な作成と破棄を自動的に管理する効果オブジェクトを使用することもできます。
関連トピック