次の方法で共有


ステート オブジェクト (Direct3D 10)

Direct3D 10 では、デバイスのステートはステート オブジェクトにグループ化されます。これにより、ステートの変更にかかるコストを大きく削減することができます。ステート オブジェクトには数種類あり、それぞれが特定のパイプライン ステージで一連のステートを初期化するように設計されています。ステート オブジェクトは 1 種類につき最高 4,096 個作成できます。

  • 入力レイアウト ステート
  • ラスタライザー ステート
  • 深度/ステンシル ステート
  • ブレンディング ステート
  • サンプラ ステート
  • パフォーマンスに関する考慮事項

入力レイアウト ステート

このステート グループ (「D3D10_INPUT_ELEMENT_DESC」を参照) は、入力アセンブラー ステージが入力バッファーからデータを読み取り、頂点シェーダーで使用できるようにアセンブルする方法を示します。これには、入力バッファー内の要素の数や、入力データのシグネチャなどのステートがあります。入力アセンブラー ステージは、パイプラインの新しいステージで、そのジョブではメモリーからパイプラインへのプリミティブのストリームが行われます。

入力レイアウト ステート オブジェクトを作成する方法については、「ID3D10Device::CreateInputLayout」を参照してください。

ラスタライザー ステート

このステート グループ (「D3D10_RASTERIZER_DESC」を参照) は、ラスタライザー ステージを初期化します。このオブジェクトには描画モードやカリング モードなどのステートがあり、クリッピングでのシザー矩形の使用や、マルチサンプル パラメーターの設定が可能になります。このステージでは、プリミティブがピクセルにラスター化され、ビューポイントへのプリミティブのクリッピングやマップなどの操作が実行されます。

ラスタライザー ステート オブジェクトを作成する方法については、「ID3D10Device::CreateRasterizerState」を参照してください。

深度/ステンシル ステート

このステート グループ (「D3D10_DEPTH_STENCIL_DESC」を参照) は、出力結合ステージの深度/ステンシルの部分を初期化します。具体的に言うと、このオブジェクトは、深度およびステンシル テストを初期化します。

深度/ステンシル ステート オブジェクトを作成する方法については、「ID3D10Device::CreateDepthStencilState」を参照してください。

ブレンディング ステート

このステート グループ (「D3D10_BLEND_DESC」を参照) は、出力結合ステージのブレンド部分を初期化します。

ブレンド ステート オブジェクトを作成する方法については、「ID3D10Device::CreateBlendState」を参照してください。

サンプラ ステート

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

Direct3D 9 と Direct3D 10 の違い

Direct3D 10 では、サンプラー オブジェクトは特定のテクスチャーにはバインドされません。アタッチされたリソースで、どのようにフィルターを行うかを表すだけです。

サンプラー ステート オブジェクトを作成する方法については、「ID3D10Device::CreateSamplerState」を参照してください。

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

ステート オブジェクトを使用するように API をデザインすることは、パフォーマンス上、いくつか利点があります。これには、オブジェクト作成時にステートの検証が可能になることや、ハードウェアにステート オブジェクトをキャッシュできるようになることが挙げられます。また、ステートではなくステート オブジェクトにハンドルを渡すことにより、ステート設定 API の呼び出しで渡されるステートの数が大きく削減されることも挙げられます。

このようなパフォーマンス上の改善を実現するには、レンダリング ループよりもはるか前のアプリケーションの起動時にステート オブジェクトを作成する必要があります。ステート オブジェクトは不変です。つまり、いったん作成されたステート オブジェクトは変更できません。代わりに、ステート オブジェクトを破棄し、作り直す必要があります。この制限に対処するため、ステート オブジェクトは 1 種類につき最高 4,096 個作成できます。たとえば、さまざまなサンプラーとステートを組み合わせて、数種類のサンプラー オブジェクトを作成することができます。その後、サンプラー ステートを変更するには、オブジェクトに (そのサンプラー ステートとは異なる) ハンドルを渡す適切な Set API を呼び出すことで行います。これにより、呼び出しの数とデータの量が大きく削減されるため、各レンダリング フレームでのステートの変更にかかるオーバーヘッドの量も大きく削減されます。

また、この代わりに、アプリケーションでステート オブジェクトの作成と破棄を効率よく自動管理するエフェクト システムを使用することも可能です。

関連項目

API の機能 (Direct3D 10)