Direct3D 9 から Direct3D 10 への移行時の考慮事項 (Direct3D 10)

ここでは、Direct3D 9 と Direct3D 10 の主な相違点の基本的な概要を示します。このドキュメントは準備段階で未完了であり、DirectX SDK の将来のリリースで提供される Direct3D 9 から Direct3D 10 への移行およびクロスプラットフォーム開発の包括的なガイドの序章としての役割を果たします。次に示す概要には、Direct3D 9 の使用経験のある開発者による Direct3D 10 の検討と理解を助けるために、初期見解も含まれています。

  • Direct3D 10 における主な構造上の変更の概要
  • エンジンのアブストラクション (分離)
  • アプリケーションのビルドの問題を迅速に解決するための方法
  • Direct3D 10 API の操作
  • テクスチャーの移植
  • シェーダーの移植
  • その他の注意すべき Direct3D 10 の相違点

Direct3D 10 における主な構造上の変更の概要

  • 固定機能の廃止。
  • デバイス オブジェクト作成時の検証

Direct3D 10 デバイスを使用したレンダリング プロセスは、構造的には Direct3D 9 と同様です。

  • 頂点ストリーム ソースの設定
  • Direct3D 10 での入力レイアウトの設定 (Direct3D 9 での頂点ストリーム宣言の設定)
  • プリミティブ トポロジの宣言
  • テクスチャーの設定
  • ステート オブジェクトの設定
  • シェーダーの設定
  • Draw

Draw 呼び出しによって操作が結合されるため、Draw 呼び出しより前の呼び出しは、どのような順序でもかまいません。Direct3D 10 API の設計上の主な相違点は、次のとおりです。

  • 固定機能の廃止。
  • CAPS ビットの廃止 ? Direct3D 10 の基本機能セットが保証されています。
  • 次の事項における管理の強化 :リソースへのアクセス、デバイス ステート、シェーダー定数、ステージ間のシェーダー リンケージ (シェーダーに対する入出力)。
  • API エントリ ポイント名が、仮想 GPU メモリーの使用を反映するよう変更されました。(Lock() の代わりに Map())。
  • 作成時にデバッグ レイヤーをデバイスに追加できるようになりました。
  • プリミティブ トポロジは明示的ステートになりました (Draw 呼び出しから分離されました)。
  • 明示的シェーダー定数は、定数バッファーに格納されるようになりました。
  • シェーダー オーサリングは完全に HLSL で実行されるようになりました。HLSL コンパイラは、プライマリ Direct3D 10 DLL に格納されるようになりました。
  • 新しいプログラム可能ステージ ? ジオメトリ シェーダー。
  • BeginScene()/EndScene() の廃止。
  • 新しい次のコンポーネントには、一般的な 2D のフォーカスおよびアダプター管理機能が実装されています。DXGI。

固定機能の廃止。

プログラム可能なパイプラインを完全に活用する Direct3D 9 エンジンでさえも、固定機能 (FF) パイプラインに依存している領域をまだ多く残している場合があります。このような領域のうち最も多く見られるのが、UI としてスクリーン空間にアライメントされるレンダリングに関連する領域です。このため、必要な代用処理を提供する FF エミュレーション シェーダーまたは一連のシェーダーの作成が必要になる可能性があります。

このドキュメントには、最も一般的な FF 処理用の代用シェーダー ソースについて説明しているホワイト ペーパーが含まれています (「FixedFuncEMU サンプル」を参照)。アルファ テストを含み、一部の固定機能ピクセル処理は、シェーダーに移行されています。

デバイス オブジェクト作成時の検証

Direct3D 10 パイプラインは、ハードウェアおよびソフトウェアにおいて徹底的に、CPU オーバーヘッド (Draw 実行時) の軽減を主目的として再設計されています。費用を削減するために、すべての型のデバイス データに、デバイス自体が提供する明示的作成方法によってオブジェクトが割り当てられています。これによって、Direct3D 9 で通常実行されるように Draw 呼び出しのときではなく、オブジェクトの作成時に厳密なデータ検証を実行できます。

エンジンのアブストラクション (分離)

ゲームを含め、Direct3D 9 と Direct3D 10 の両方に対応させるアプリケーションでは、残りのコード ベースからレンダリング レイヤーを抽出する必要があります。これを実現する方法はたくさんありますが、すべての方法において重要な点は、下位レベルの Direct3D デバイスに対するアブストラクション レイヤーの設計です。すべてのシステムで、GPU リソースおよび低レベル タイプの管理を提供するよう設計された共通レイヤーを通してハードウェアと通信する必要があります。

Direct3D 9 の依存部分の直接削除

既にテスト済みの大規模なコード ベースを移植する場合、コード内で既にテスト済みの処理を維持するために、確実に必要なコード部分に対するコード変更の量を最小限に抑えることが重要です。コメントを使用して、項目を変更する場所を明確に記録することをお勧めします。コード ベース全体で迅速に移動できるように、この作業にコメント付けの基準を決めておくと便利です。

次に、この作業に使用可能な、標準的な 1 行の開始ブロック コメントの例を一覧で示します。

  • // Direct3D 10 REMOVED
    複数行または複数ブロックのコードを削除した場合にこれを使用
  • // Direct3D 10 NEEDS UPDATE
    処理変換のために後でコードにアクセスするときに使用する必要のある処理または新しい API を提案する注意書きを NEED UPDATE コメントに追加するとよいです。無意識のうちに誤ったコードを実行しないようにするために、¥¥ Direct3D 10 NEEDS UPDATE の出現箇所に、assert(false) を多用する必要もあります。
  • // Direct3D 10 CHANGED
    主な変更が発生した領域は、将来のリファレンスとしてそのまま残し、コメントアウトする必要があります。
  • // Direct3D 10 END
    コード ブロック終了の指定

複数行のソースの場合は、C 言語のコメント記述スタイル /* */ を使用する必要がありますが、該当する開始コメントと終了コメントをその領域の周りに追加してください。

アプリケーションのビルドの問題を迅速に解決するための方法

  • Direct3D 9 の型のオーバーライド
  • リンクに関する問題の解決
  • デバイスの CAPS のシミュレーション

Direct3D 9 の型のオーバーライド

Direct3D 10 ヘッダーではサポートされなくなった Direct3D 9 ベースの型の型定義およびオーバーライドを含む上位レベルのヘッダー ファイルの挿入が有用な場合があります。これによって、新しく定義された Direct3D 10 の型に Direct3D 9 の型からマッピングを直接実行するコードおよびインターフェイス内の変更量を最小限に抑えることができます。この方法は、コードの処理を 1 つのソース ファイルにまとめておく場合にも役立ちます。この場合、Direct3D 9 API と Direct3D 10 API の両方に渡る、レンダリング用の共通のコンストラクトを記述する、バージョンに依存しない一般的な名前の型を定義することをお勧めします。次に例を示します。

 #if defined(D3D9) typedef IDirect3DIndexBuffer9   IDirect3DIndexBuffer; typedef IDirect3DVertexBuffer9  IDirect3DVertexBuffer; #else //D3D10 typedef ID3D10Buffer            IDirect3DIndexBuffer; typedef ID3D10Buffer            IDirect3DVertexBuffer #endif 

他の Direct3D 10 固有の例を次に示します。

 typedef ID3D10TextureCube  IDirect3DCubeTexture; typedef ID3D10Texture3D   IDirect3DVolumeTexture; typedef D3D10_VIEWPORT      D3DVIEWPORT; typedef ID3D10VertexShader     IDirect3DVertexShader; typedef ID3D10PixelShader    IDirect3DPixelShader; 

リンクに関する問題の解決

Microsoft Visual Studio の最新版を使用して、Direct3D 10 および Windows Vista アプリケーションを開発することをお勧めします。ただし、前の Visual Studio の 2003 バージョンを使用して、Direct3D 10 に依存する Windows Vista アプリケーションをビルドすることは可能です。Direct3D 10 は、(Server 2003 SP1 プラットフォーム SDK と同様に) 次の lib に依存する Windows Vista プラットフォーム コンポーネントです。BufferOverflowU.lib は、buffer_security チェック リンカーに関する問題を解決するために必要です。

デバイスの CAPS のシミュレーション

多くのアプリケーションに、使用可能なデバイスの CAPS データに依存するコード領域があります。これは、デバイスの列挙をオーバーライドしたり、デバイスの CAPS を実用的な値に強制したりすることによって回避してください。可能であれば、後で、CAPS の依存部分の領域に再アクセスして、完全に CAPS を削除します。

Direct3D 10 API の操作

ここでは、Direct3D 10 API によって生じる処理の変更について重点的に説明します。

  • リソースの作成
  • ビュー
  • 静的リソース アクセスと動的リソース アクセス
  • Direct3D 10 エフェクト
  • HLSLWithoutFX10 サンプル
  • シェーダーのコンパイル
  • シェーダー リソースの作成
  • シェーダー反射レイヤー インターフェイス
  • 入力アセンブラーのレイアウト ? 頂点シェーダー/入力ストリーム リンケージ
  • シェーダー デッド コードの削除の影響
  • 頂点シェーダー入力構造体の例
  • ステート オブジェクトの作成

リソースの作成

Direct3D 10 API では、計画した用途に従って特定のバインド フラグを持つ汎用的なバッファー タイプとして、リソースが設計されています。この設計ポイントが選択されたのは、頂点バッファーにレンダリングを行った後すぐに、CPU を中断することなく、結果を描画するというようなシナリオで、パイプラインのリソースにほとんどどこからでもアクセスできるようにするためです。次の例では、頂点バッファーとインデックス バッファーの割り当てを示します。リソース記述が GPU のリソース バインド フラグによってのみ異なることを確認できます。

Direct3D 10 API は、明示的にテクスチャー型リソースを作成するためのテクスチャー ヘルパー メソッドを提供していますが、想像できるように、これらは、実質的にはヘルパー関数です。

  • CreateTexture2D()
  • CreateTextureCube()
  • CreateTexture3D()

Direct3D 10 を対象にしている場合、ユーザーは、リソース作成時に Direct3D 9 を対象にしていたときよりも、より多くの項目を割り当てようとする傾向にあります。この傾向は、バッファーにアクセスし、デバイスにリソースを設定するためのビューも作成する必要があるレンダー ターゲット バッファーおよびテクスチャーの作成時に最も顕著になります。

チュートリアル 1: Direct3D 10 の基本機能

ビュー

ビューは、ピクセル バッファー内に格納されたデータに対する明確に型付けされたインターフェイスです。1 つのリソースに、一度に複数のビューを割り当てることができます。この機能については、この SDK に含まれる単一パスのキューブマップへのレンダリングのサンプルで取り上げられています。

プログラミング ガイドのリソース アクセスに関するページ

CubeMapGS サンプル

静的リソース アクセスと動的リソース アクセス

パフォーマンスを最善にするには、アプリケーションで、データの静的性質と動的性質の観点で、使用するデータを分割する必要があります。Direct3D 10 は、この手法を利用するように設計されているため、リソースへのアクセス ルールは、Direct3D 9 と比べると著しく厳密になっています。静的リソースの場合、作成時にリソースにデータを思うように入力できます。使用しているエンジンが、Direct3D 9 の設計ポイントである Create、Lock、Fill、Unlock を基に設計されている場合は、ステージング リソースとリソース インターフェイスの UpdateSubResource メソッドを使用することによってデータ入力を Create 時から遅らせることができます。

Direct3D 10 エフェクト

Direct3D 10 エフェクト システムの使用法は、この記事の範囲外です。エフェクト システムは、Direct3D 10 がもたらす構造上の利点を十分に利用するように記述されています。使用法の詳細については、「エフェクト (Direct3D 10)」を参照してください。

HLSLWithoutFX10 サンプル

Direct3D 10 シェーダー パイプラインは、Direct3D 10 エフェクト システムを使用せずに駆動できます。この場合、すべての定数バッファー、シェーダー、サンプラー、およびテクスチャー バインディングは、アプリケーション自体が管理する必要があります。詳細については、次のサンプル リンクと、このドキュメントの以降のセクションを参照してください。

HLSLWithoutFX10 サンプル

シェーダーのコンパイル

Direct3D 10 HLSL コンパイラを使用すると HLSL 言語定義の機能が強化されるため、このコンパイラは、2 つのモードで操作できます。Direct3D 9 スタイルの組み込み関数とセマンティクスを完全にサポートするには、コンパイルごとに指定できる COMPATIBILITY MODE フラグを使用してコンパイル処理を起動する必要があります。

Direct3D 10 シェーダー モデル 4.0 固有の HLSL 言語のセマンティクスおよび組み込み関数は、次に示したリンクから入手できます。最も注意が必要な Direct3D 9 HLSL からの構文の主な変更は、テクスチャー アクセスの領域にあります。新しい構文は、互換性モード以外でコンパイラによってサポートされる唯一の形式です。詳細については、「HLSL」を参照してください。

シェーダー リソースの作成

Direct3D 10 エフェクト システムの外部でのコンパイル済みシェーダー インスタンスの作成は、Direct3D 9 と同様の方法で実行できますが、Direct3D 10 では、後で使用するためにシェーダー入力シグネチャを維持しておくことが重要です。このシグネチャは、デフォルトでシェーダー ブロブの一部として返されますが、必要に応じて、必要なメモリーを軽減するために抽出することもできます。詳細については、「Direct3D 10 でのシェーダーの使用」を参照してください。

シェーダー反射レイヤー インターフェイス

シェーダー反射レイヤーは、シェーダー要件に関する情報の取得に使用できるインターフェイスです。これは、必ず正しい入力構造体をシェーダーに指定できるように、シェーダー入力要件の検討が必要な可能性がある入力アセンブリ リンケージ (次を参照) を作成する際に特に便利です。コンパイル済みシェーダーのインスタンスの作成と同時に反射レイヤー インターフェイスのインスタンスを作成できます。

シェーダー反射レイヤーは、同様の機能を提供する D3DX9 メソッドに替わるものです。たとえば、IsParameterUsedID3D10ShaderReflectionVariable::GetDesc メソッドに置き換わります。

入力アセンブラーのレイアウト ? 頂点シェーダー/入力ストリーム リンケージ

入力アセンブラー (IA) は、Direct3D 9 スタイルの頂点ストリーム宣言に置き換わるもので、その記述構造の形式は非常に似ています。IA の主な違いは、作成された IA レイアウト オブジェクトを、シェーダー入力シグネチャの特定の形式に直接マップする必要があるということです。入力ストリームをシェーダーにリンクするために作成されたマッピング オブジェクトは、シェーダー入力シグネチャが、入力レイアウトの作成に使用されたシェーダーのものと一致する場合は、任意の数のシェーダーに対して使用できます。

静的データでパイプラインを最適に操作するには、入力ストリーム形式のシェーダー入力シグネチャへの置換の可能性を考慮し、できるだけ早い時点で IA レイアウト オブジェクトのインスタンスを作成して、それらを可能な場所で再使用する必要があります。

シェーダー デッド コードの削除の影響

ここでは、エンジン コード内で注意して処理を行う必要がある Direct3D 9 と Direct3D 10 での顕著な相違点について、詳細を説明します。通常、条件式を含むシェーダーでは、コンパイル プロセスの一部として、特定のコード パスが削除されます。Direct3D 9 では、(次の例のような) シグネチャ入力と定数入力の 2 種類の入力が、未使用の場合に削除される可能性があります (削除対象としてマークされます)。定数バッファーの最後に未使用のエントリがある場合、シェーダー内のサイズ宣言は、最後の未使用のエントリを除いた定数バッファーのサイズを反映します。Direct3D 10 では、このどちらの種類の入力もシグネチャ バッファーまたは定数バッファーに残りますが、未使用の定数入力が定数バッファーの最後にある場合は特殊な例外となります。このことは、大きなシェーダーの処理や入力レイアウトの作成の際に、エンジンに影響を及ぼす可能性があります。コンパイラによるデッド コードの最適化で削除される要素は、引き続き入力構造体で宣言しておく必要があります。次にこの例を示します。

頂点シェーダー入力構造体の例

 struct VS_INPUT { float4 pos: SV_Position; float2 uv1 : Texcoord1; float2 uv2 : Texcoord2; * }; 

* Direct3D 9 デッド コードの削除では、条件付きデッド コード削除によって、シェーダー内の宣言が削除されます。

 float4x4  g_WorldViewProjMtx; static const bool g_bLightMapped = false; // define a compile time constant  VS_INPUT main(VS_INPUT i)  {     VS_INPUT o;     o.pos = mul( i.pos, g_WorldViewProjMtx);     o.uv1 = i.uv1;     if ( g_bLightMapped )     {         o.uv2 = i.uv2;     }     return o; } 

または、次の宣言によって、この定数がコンパイル時定数であることを明確にできます。

 #define LIGHT_MAPPED false 

上記の例では、Direct3D 9 のもと、コンパイラのデッド コード最適化によって、uv2 要素が削除されます。Direct3D 10 でもデッド コードは削除されますが、シェーダーの入力アセンブラー レイアウトでは入力データの定義の存在が要求されます。シェーダー反射レイヤーには、汎用的な方法でこの状況を処理する方法が用意されています。この方法では、シェーダー入力要件を検討し、シェーダー シグネチャ マッピングに入力ストリームの完全な記述を確実に指定できます。

次に、関数シグネチャ内のセマンティック名/インデックスの存在を検出する関数の例を示します。

 // Returns true if the SemanticName / SemanticIndex is used in the input signature. // pReflector is a previously acquired shader reflection interface. bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex) {   D3D10_SHADER_DESC               shaderDesc;     D3D10_SIGNATURE_PARAMETER_DESC  paramDesc;      Assert(pReflector);     Assert(SemanticName);   pReflector->GetDesc(&shaderDesc);    for (UINT k=0; k<shaderDesc.InputParameters; k++)    {       pReflector->GetInputParameterDesc( k, &paramDesc);       if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex)           return true;    }   return false; } 

ステート オブジェクトの作成

エンジン コードを移植する際、最初にデフォルトのステート オブジェクトのセットを使用して、すべての Direct3D 9 デバイスのレンダリング ステートまたはテクスチャー ステートの設定を無効にすると効率的な場合があります。これは、レンダリングの不具合を生じさますが、最も迅速に処理を完了し、作動させる方法です。後で、複合キーを使用して、使用されたステート オブジェクトの数の最大再使用を可能にするステート オブジェクト管理システムを構築できます。

テクスチャーの移植

サポートされているファイル形式

グラフィック ファイルとの間でテクスチャーの作成と保存を実行する D3DXCreateXXX 関数および D3DXSaveXXX 関数 (D3DXCreateTextureFromFile など) がサポートするファイル形式は、Direct3D 10 と Direct3D 9 とで次のように異なります。

ファイル形式 Direct3D 9 Direct3D 10
.bmp x x
.jpg x x
.tga x
.png x x
.dds x x
.ppm x
.dib x
.hdr x
.pfm x
.tiff x
.gif x
.tif x

詳細については、Direct3D 9 の D3DXIMAGE_FILEFORMAT 列挙型と Direct3D 10 の D3DX10_IMAGE_FILE_FORMAT 列挙型を比較してください。

テクスチャー フォーマットのマッピング

次の表は、Direct3D 9 から Direct3D 10 へのテクスチャー フォーマットのマッピングを示しています。DXGI で使用できないフォーマットのコンテンツはすべて、ユーティリティ ルーチンによって変換する必要があります。

Direct3D 9 フォーマット Direct3D 10 フォーマット
D3DFMT_UNKNOWN DXGI_FORMAT_UNKNOWN
D3DFMT_R8G8B8 利用不可
D3DFMT_A8R8G8B8 利用不可
D3DFMT_X8R8G8B8 利用不可
D3DFMT_R5G6B5 利用不可
D3DFMT_X1R5G5B5 利用不可
D3DFMT_A1R5G5B5 利用不可
D3DFMT_A4R4G4B4 利用不可
D3DFMT_R3G3B2 利用不可
D3DFMT_A8 DXGI_FORMAT_A8_UNORM
D3DFMT_A8R3G3B2 利用不可
D3DFMT_X4R4G4B4 利用不可
D3DFMT_A2B10G10R10 DXGI_FORMAT_R10G10B10A2
D3DFMT_A8B8G8R8 DXGI_FORMAT_R8G8B8A8_UNORM および DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
D3DFMT_X8B8G8R8 利用不可
D3DFMT_G16R16 DXGI_FORMAT_R16G16_UNORM
D3DFMT_A2R10G10B10 利用不可
D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_UNORM
D3DFMT_A8P8 利用不可
D3DFMT_P8 利用不可
D3DFMT_L8 DXGI_FORMAT_R8_UNORM 注意 :シェーダーの .r スィズルを使用して、赤を他のコンポーネントに複製し、D3D9 の処理を取得します。
D3DFMT_A8L8 利用不可
D3DFMT_A4L4 利用不可
D3DFMT_V8U8 DXGI_FORMAT_R8G8_SNORM
D3DFMT_L6V5U5 利用不可
D3DFMT_X8L8V8U8 利用不可
D3DFMT_Q8W8V8U8 DXGI_FORMAT_R8G8B8A8_SNORM
D3DFMT_V16U16 DXGI_FORMAT_R16G16_SNORM
D3DFMT_W11V11U10 利用不可
D3DFMT_A2W10V10U10 利用不可
D3DFMT_UYVY 利用不可
D3DFMT_R8G8_B8G8 DXGI_FORMAT_G8R8_G8B8_UNORM (DX9 でデータの範囲が 255.0f まで拡大されましたが、これはシェーダー コードで処理できます)
D3DFMT_YUY2 利用不可
D3DFMT_G8R8_G8B8 DXGI_FORMAT_R8G8_B8G8_UNORM (DX9 でデータの範囲が 255.0f まで拡大されましたが、これはシェーダー コードで処理できます)
D3DFMT_DXT1 DXGI_FORMAT_BC1_UNORM および DXGI_FORMAT_BC1_UNORM_SRGB
D3DFMT_DXT2 DXGI_FORMAT_BC1_UNORM および DXGI_FORMAT_BC1_UNORM_SRGB 注意 :DXT1 と DXT2 は、API (ハードウェア) の観点からは同じです。唯一の相違点は、"乗算済みのアルファ" で、これはアプリケーションによって追跡でき、別のフォーマットを必要としません。
D3DFMT_DXT3 DXGI_FORMAT_BC2_UNORM および DXGI_FORMAT_BC2_UNORM_SRGB
D3DFMT_DXT4 DXGI_FORMAT_BC2_UNORM および DXGI_FORMAT_BC2_UNORM_SRGB 注意 :DXT3 と DXT4 は、API (ハードウェア) の観点からは同じです。唯一の相違点は、"乗算済みのアルファ" で、これはアプリケーションによって追跡でき、別のフォーマットを必要としません。
D3DFMT_DXT5 DXGI_FORMAT_BC3_UNORM および DXGI_FORMAT_BC3_UNORM_SRGB
D3DFMT_D16 および D3DFMT_D16_LOCKABLE DXGI_FORMAT_D16_UNORM
D3DFMT_D32 利用不可
D3DFMT_D15S1 利用不可
D3DFMT_D24S8 利用不可
D3DFMT_D24X8 利用不可
D3DFMT_D24X4S4 利用不可
D3DFMT_D16 DXGI_FORMAT_D16_UNORM
D3DFMT_D32F_LOCKABLE DXGI_FORMAT_D32_FLOAT
D3DFMT_D24FS8 利用不可
D3DFMT_S1D15 利用不可
D3DFMT_S8D24 DXGI_FORMAT_D24_UNORM_S8_UINT
D3DFMT_X8D24 利用不可
D3DFMT_X4S4D24 利用不可
D3DFMT_L16 DXGI_FORMAT_R16_UNORM 注意 :シェーダーの .r スィズルを使用して、赤を他のコンポーネントに複製し、D3D9 の処理を取得します。
D3DFMT_INDEX16 DXGI_FORMAT_R16_UINT
D3DFMT_INDEX32 DXGI_FORMAT_R32_UINT
D3DFMT_Q16W16V16U16 DXGI_FORMAT_R16G16B16A16_SNORM
D3DFMT_MULTI2_ARGB8 利用不可
D3DFMT_R16F DXGI_FORMAT_R16_FLOAT
D3DFMT_G16R16F DXGI_FORMAT_R16G16_FLOAT
D3DFMT_A16B16G16R16F DXGI_FORMAT_R16G16B16A16_FLOAT
D3DFMT_R32F DXGI_FORMAT_R32_FLOAT
D3DFMT_G32R32F DXGI_FORMAT_R32G32_FLOAT
D3DFMT_A32B32G32R32F DXGI_FORMAT_R32G32B32A32_FLOAT
D3DFMT_CxV8U8 利用不可
D3DDECLTYPE_FLOAT1 DXGI_FORMAT_R32_FLOAT
D3DDECLTYPE_FLOAT2 DXGI_FORMAT_R32G32_FLOAT
D3DDECLTYPE_FLOAT3 DXGI_FORMAT_R32G32B32_FLOAT
D3DDECLTYPE_FLOAT4 DXGI_FORMAT_R32G32B32A32_FLOAT
D3DDECLTYPED3DCOLOR 利用不可
D3DDECLTYPE_UBYTE4 DXGI_FORMAT_R8G8B8A8_UINT 注意 :シェーダーは UINT 値を取得しますが、Direct3D 9 スタイルの integral float (0.0f、1.0f... 255.f) が必要な場合は、UINT をシェーダーで float32 に変換できます。
D3DDECLTYPE_SHORT2 DXGI_FORMAT_R16G16_SINT 注意 :シェーダーは SINT 値を取得しますが、Direct3D 9 スタイルの integral float が必要な場合は、SINT をシェーダーで float32 に変換できます。
D3DDECLTYPE_SHORT4 DXGI_FORMAT_R16G16B16A16_SINT 注意 :シェーダーは SINT 値を取得しますが、Direct3D 9 スタイルの integral float が必要な場合は、SINT をシェーダーで float32 に変換できます。
D3DDECLTYPE_UBYTE4N DXGI_FORMAT_R8G8B8A8_UNORM
D3DDECLTYPE_SHORT2N DXGI_FORMAT_R16G16_SNORM
D3DDECLTYPE_SHORT4N DXGI_FORMAT_R16G16B16A16_SNORM
D3DDECLTYPE_USHORT2N DXGI_FORMAT_R16G16_UNORM
D3DDECLTYPE_USHORT4N DXGI_FORMAT_R16G16B16A16_UNORM
D3DDECLTYPE_UDEC3 利用不可
D3DDECLTYPE_DEC3N 利用不可
D3DDECLTYPE_FLOAT16_2 DXGI_FORMAT_R16G16_FLOAT
D3DDECLTYPE_FLOAT16_4 DXGI_FORMAT_R16G16B16A16_FLOAT

非圧縮フォーマットの場合、DXGI では、任意のピクセル フォーマット パターンに対するサポートが制限されています。非圧縮フォーマットはすべて RGBA タイプである必要があります。これによって、既存のアセットに対して、ピクセル フォーマットのスィズルが必要になる場合があります。この場合、可能なときはオフライン事前処理パスとして計算処理を実行することをお勧めします。

シェーダーの移植

Direct3D 10 シェーダーは HLSL でオーサリング

Direct3D 10 では、アセンブリ言語の使用がデバッグ目的のみに制限されます。このため、Direct3D 9 で使用されていた手書きのアセンブリ シェーダーはすべて HLSL に変換する必要があります。

シェーダー シグネチャとリンケージ

頂点シェーダー入力シグネチャへの入力アセンブリ リンケージの要件については、既にこのドキュメントで説明しました (上記参照)。また、Direct3D 10 ランタイムでは、シェーダー間のステージからステージへのリンケージの要件がより厳密になっています。この変更によって、Direct3D 9 でステージ間のバインドが完全には記述されていない可能性のあるシェーダー ソースが影響を受けます。次に例を示します。

 VS_OUTPUT                       PS_INPUT float4   pos : SV_POSITION;     float4 pos : SV_POSITION; float4   uv1 : TEXCOORD1;       float4 uv1 : TEXCOORD1; float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; * float4   Color : TEXCOORD6;     float4 color : TEXCOORD6; 

* 破損した VS - PS リンケージ ? ピクセル シェーダーで行列全体の情報が必要でない場合でも、リンケージで完全な float4x3 を指定する必要があります。

リンケージのセマンティクスはステージ間で完全に一致する必要がありますが、ターゲット ステージの入力は、出力される値のプレフィクスである場合があります。上記の例では、ピクセル シェーダーに position と texcoord1 のみを入力として指定できましたが、順序の制約のため position と texcoord2 のみを入力として指定することはできません。

HLSL シェーダー ステージのリンケージ

シェーダー間のリンケージは、パイプライン内の次のいずれかのポイントで発生する可能性があります。

  • 入力アセンブラーから頂点シェーダー
  • 頂点シェーダーからピクセル シェーダー
  • 頂点シェーダーからジオメトリ シェーダー
  • 頂点シェーダーからストリーム出力
  • ジオメトリ シェーダーからピクセル シェーダー
  • ジオメトリ シェーダーからストリーム出力

定数バッファー

Direct3D 9 からのコンテンツの移植を簡略化するために、エフェクト システムの外部の定数管理への最初の取り組みで、必要な定数すべてを含む単一の定数バッファーを作成できます。パフォーマンス向上のために、予期される更新頻度によって、バッファーに定数を順序付けることが重要です。この編成によって、重複する定数セットの数が最小に抑えられます。

その他の注意すべき Direct3D 10 の相違点

入力としての整数

Direct3D 9 では、整数データ型に対する実際のハードウェア サポートはありませんでしたが、Direct3D 10 のハードウェアでは明示的な整数型がサポートされます。頂点バッファーに浮動小数点データがある場合は、浮動小数点型の入力が必要です。そうでなければ、整数型が浮動小数点値のビット パターン表記になります。整数型は、補間ではないと値がマークされていない限り、ピクセル シェーダーの入力として許可されません (「補間修飾子」を参照)。

マウス カーソル

前のバージョンの Windows では、標準の GDI マウス カーソルのルーチンは、フルスクリーン排他デバイスすべてにおいて正常に機能しませんでした。このような状況に対処するために、SetCursorPropertiesShowCursor、および SetCursorPosition の各 API が追加されました。Windows Vista のバージョンの GDI は、DXGI サーフェスを完全に認識するため、この特殊化されたマウス カーソル API の必要がないので、Direct3D 10 には相当するものはありません。Direct3D 10 アプリケーションでは、代わりに標準の GDI マウス カーソル ルーチンをマウス カーソルで使用する必要があります。

Direct3D 10 でのテクセルからピクセルへのマッピング

Direct3D 9 では、テクセルの中心とピクセルの中心は半単位離れていました (「テクセルからピクセルへの直接的なマッピング (Direct3D 9)」を参照)。Direct3D 10 では、テクセルの中央は既に半単位ごとに配置されるため、頂点座標をシフトする必要はまったくありません。

フルスクリーン クワッドのレンダリングは、Direct3D 10 ではより単純になっています。フルスクリーン クワッドをクリップスペース (-1,1) で定義して、そのまま頂点シェーダーを通過させる必要があるだけです。このため、画面解像度が変わるたびに頂点バッファーを再ロードする必要がなく、テクスチャー座標を利用するためにピクセル シェーダーで追加の作業を行う必要がありません。

リファレンス カウントの動作の変更

前の Direct3D バージョンと異なり、さまざまな Set 関数でデバイス オブジェクトへのリファレンスが保持されなくなっています。つまり、アプリケーションでは、オブジェクトをパイプラインにバインドさせておく必要がある限り、オブジェクトへのリファレンスが保持されるようにする必要があります。オブジェクトのリファレンス カウントが 0 になると、オブジェクトは破棄されるため、パイプラインからバインドが解除されます。このリファレンス保持のスタイルは、弱いリファレンスの保持とも呼ばれており、Device オブジェクト上の各バインド場所で、インターフェイスまたはオブジェクトへの弱いリファレンスが保持されます。明示的に記述されていない限り、この動作はすべての Set メソッドに該当すると考えられます。オブジェクトの破棄によってバインド ポイントが NULL になったときは常に、デバッグ レイヤーから警告が発行されます。ID3D10Device::OMGetRenderTargets などのデバイスの Get メソッドの呼び出しによって、返されるオブジェクトのリファレンス カウントが増加することに注意してください。

協力型レベルのテスト

Direct3D 9 API の機能である TestCooperativeLevel は、Present を呼び出すときの DXGI_PRESENT_TEST の設定と類似しています。

関連項目

Direct3D 10 プログラミング ガイド