次の方法で共有


State オブジェクト (Direct3D 10)

Direct3D 10 では、デバイスの状態が状態オブジェクトにグループ化され、状態の変更コストが大幅に削減されます。 複数の状態オブジェクトがあり、それぞれが特定のパイプライン ステージの状態セットを初期化するように設計されています。 状態オブジェクトの種類ごとに最大 4096 個を作成できます。

Input-Layout 状態

この状態グループ (D3D10_INPUT_ELEMENT_DESCを参照) は、入力アセンブラー ステージ 入力バッファーからデータを読み取り、頂点シェーダーで使用するためにアセンブルする方法を決定します。 これには、入力バッファー内の要素の数や入力データのシグネチャなどの状態が含まれます。 入力アセンブラー ステージは、メモリからパイプラインにプリミティブをストリーミングするジョブを持つパイプラインの新しいステージです。

入力レイアウト状態オブジェクトを作成するには、「CreateInputLayoutを参照してください。

ラスタライザーの状態

この状態グループ (D3D10_RASTERIZER_DESCを参照) は、ラスタライザー ステージを初期化します。 このオブジェクトには、塗りつぶしモードやカリング モード、クリッピング用のシザー四角形の有効化、マルチサンプル パラメーターの設定などの状態が含まれます。 このステージでは、プリミティブをピクセルにラスター化し、クリッピングやビューポートへのプリミティブのマッピングなどの操作を実行します。

ラスタライザー状態オブジェクトを作成するには、「CreateRasterizerState を参照してください。

Depth-Stencil 状態

この状態グループ (D3D10_DEPTH_STENCIL_DESCを参照) は、出力マージャー ステージの深度ステンシル部分を初期化します。 具体的には、このオブジェクトは深度テストとステンシル テストを初期化します。

深度ステンシル状態オブジェクトを作成するには、「CreateDepthStencilState を参照してください。

Blend State

この状態グループ (D3D10_BLEND_DESCを参照) は、出力マージャー ステージのブレンド部分初期化します。

ブレンド状態オブジェクトを作成するには、「CreateBlendState を参照してください。

サンプラーの状態

この状態グループ (D3D10_SAMPLER_DESCを参照) は、サンプラー オブジェクトを初期化します。 サンプラー オブジェクトは、メモリ内のテクスチャをフィルター処理するためにシェーダー ステージによって使用されます。

Direct3D 9 と Direct3D 10 の違い:

  • Direct3D 10 では、サンプラー オブジェクトは特定のテクスチャにバインドされなくなりました。アタッチされたリソースを指定してフィルター処理を行う方法を説明するだけです。

 

サンプラー状態オブジェクトを作成するには、「CreateSamplerState を参照してください。

パフォーマンスに関する考慮事項

状態オブジェクトを使用するように API を設計すると、いくつかのパフォーマンス上の利点が生じます。 これには、オブジェクト作成時の状態の検証、ハードウェアでの状態オブジェクトのキャッシュの有効化、状態設定 API 呼び出し中に渡される状態の量の大幅な削減が含まれます (状態ではなく状態オブジェクトにハンドルを渡すことによって)。

これらのパフォーマンス向上を実現するには、アプリケーションの起動時に、レンダー ループの前に状態オブジェクトを作成する必要があります。 状態オブジェクトは不変です。つまり、一度作成された状態オブジェクトは変更できません。 代わりに、それらを破棄して再作成する必要があります。 この制限に対処するために、状態オブジェクトの種類ごとに最大 4096 個を作成できます。 たとえば、さまざまなサンプラー状態の組み合わせを持つ複数のサンプラー オブジェクトを作成できます。 サンプラーの状態を変更するには、適切な Set API を呼び出します。この API は、(サンプラー状態ではなく) オブジェクトにハンドルを渡します。 これにより、呼び出しの数とデータ量が大幅に削減されるため、状態を変更するための各レンダリング フレームのオーバーヘッドが大幅に削減されます。

または、アプリケーションの状態オブジェクトの効率的な作成と破棄を自動的に管理する効果システムを使用することもできます。

API 機能 (Direct3D 10)