Direct3D 9 から Direct3D 10 への考慮事項 (Direct3D 10)
次のページでは、Direct3D 9 と Direct3D 10 の主な違いの基本的な概要を示します。 次のアウトラインでは、開発者が Direct3D 9 のエクスペリエンスを使用して Direct3D 10 を探索して関連付けるのに役立ついくつかの分析情報を提供します。
このトピックの情報では Direct3D 9 と Direct3D 10 を比較していますが、Direct3D 11 は Direct3D 10 と 10.1 で行われた機能強化に基づいていますが、Direct3D 9 から Direct3D 11 に移行するには、この情報も必要です。 Direct3D 10 から Direct3D 11 への移行については、「 Direct3D 11 への移行を参照してください。
- Direct3D 10 における主な構造変化の概要
- エンジンの抽象化/分離
- アプリケーション ビルドの問題をすばやく解決するためのテクニック
- Direct3D 10 API の駆動
- テクスチャの移植
- シェーダーの移植
- その他の Direct3D 10 の相違点
- Direct3D 10.1 のその他の相違点
- 関連トピック
Direct3D 10 における主な構造変化の概要
Direct3D 10 デバイスを使用してレンダリングするプロセスは、Direct3D 9 と構造的に似ています。
- 頂点ストリーム ソースを設定する
- Direct3D 10 で入力レイアウトを設定する (Direct3D 9 で頂点ストリーム宣言を設定する)
- プリミティブ トポロジを宣言する
- テクスチャを設定する
- 状態オブジェクトの設定
- シェーダーを設定する
- Draw
Draw呼び出しは操作を結び付けます。Draw 呼び出しの前の呼び出しの順序は任意です。 Direct3D 10 API 設計の主な違いは次のとおりです。
- 固定関数の削除
- CAPS ビットの削除 - Direct3D 10 の基本機能セットが保証されます
- より厳密な管理: リソース アクセス、デバイスの状態、シェーダー定数、シェーダー リンケージ (シェーダーへの入力と出力) をステージ間で行う
- API エントリ ポイント名の変更には、Lock() ではなく仮想 GPU メモリ (Map() の使用が反映されます。
- デバッグ レイヤーは、作成時にデバイスに追加できます
- プリミティブ トポロジが明示的な状態になりました ( Draw 呼び出しから分離)
- 明示的なシェーダー定数が定数バッファーに格納されるようになりました
- シェーダーの作成は、HLSL で完全に行われます。 HLSL コンパイラがプライマリ Direct3D 10 DLL に存在するようになりました。
- 新しいプログラム可能なステージ - ジオメトリ シェーダー
- BeginScene()/EndScene() の削除
- 新しいコンポーネントに実装された一般的な 2D、フォーカス、アダプター管理機能: DXGI
固定関数の削除
プログラム可能なパイプラインを完全に利用する Direct3D 9 エンジンでも、固定関数 (FF) パイプラインに依存する領域が多数残っているのは驚く場合があります。 最も一般的な領域は、通常、UI の画面空間配置レンダリングに関連しています。 このため、必要な置換動作を提供する FF エミュレーション シェーダーまたは一連のシェーダーを構築する必要がある可能性があります。
このドキュメントには、最も一般的な FF 動作の代替シェーダー ソースを含むホワイト ペーパーが含まれています ( 修正関数 EMU サンプルを参照してください)。 アルファ テストを含む一部の固定関数ピクセル動作がシェーダーに移動されました。
デバイス オブジェクトの作成時間の検証
Direct3D 10 パイプラインは、CPU オーバーヘッドを (描画時に) 削減することを主な目的として、ハードウェアとソフトウェアで一から再設計されました。 コストを削減するために、すべての種類のデバイス データに、デバイス自体によって提供される明示的な作成方法を持つオブジェクトが割り当てられます。 これにより、Direct3D 9 の場合と同様に、Draw 呼び出し時ではなく、オブジェクト作成時に厳密なデータ検証が可能になります。
エンジンの抽象化/分離
ゲームを含む、Direct3D 9 と Direct3D 10 の両方をサポートするアプリケーションでは、残りのコード ベースからレンダリング レイヤーを抽象化する必要があります。 これを実現するには多くの方法がありますが、それらすべてに重要なのは、下位レベルの Direct3D デバイスの抽象化レイヤーの設計です。 すべてのシステムは、GPU リソースと低レベルの型管理を提供するように設計された共通レイヤーを介してハードウェアと通信する必要があります。
Direct3D 9 依存関係の直接削除
以前にテストした大規模なコード ベースを移植する場合は、コードで以前にテストされた動作を維持するために絶対に必要なコード変更の量を最小限に抑える必要があります。 ベスト プラクティスには、コメントを使用して項目が変更される場所を明確に文書化する方法が含まれます。 多くの場合、この作業のコメント標準を使用すると、コード ベースを簡単に移動できます。
この作業に使用できる標準の 1 行/開始ブロック コメントの一覧の例を次に示します。
アイテム | 説明 |
---|---|
Direct3D 10 の削除 |
これを使用して、コードの行/ブロックが削除されます |
// Direct3D 10 NEEDS UPDATE |
NEED UPDATE コメントに、動作変換のために後でコードにアクセスするために使用する必要がある作業/新しい API を示す追加のメモを追加するのに役立ちます。 assert(false) を頻繁に使用する必要があります。ここで、\\ Direct3D 10 NEEDS UPDATE が発生して、間違ったコードを知らずに実行しないようにする必要があります。 |
// Direct3D 10 CHANGED |
大きな変更が発生した領域は、今後の参照のために保持する必要がありますが、コメント アウト |
// Direct3D 10 END |
終了コード ブロック修飾子 |
複数行のソースの場合は、C スタイルの /* */ コメントも使用する必要がありますが、これらの領域の周囲に関連する開始/終了コメントを追加する必要があります。
アプリケーション ビルドの問題をすばやく解決するためのテクニック
Direct3D 9 型のオーバーライド
Direct3D 10 ヘッダーでサポートされなくなった Direct3D 9 基本型の型定義/オーバーライドを含む高レベルのヘッダー ファイルを挿入すると便利な場合があります。 これにより、Direct3D 9 型から新しく定義された Direct3D 10 型への直接マッピングがあるコードとインターフェイスの変更量を最小限に抑えることができます。 この方法は、コードの動作を 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 アプリケーションを開発することをお勧めします。 ただし、以前の 2003 バージョンの Visual Studio を使用して Direct3D 10 に依存する Windows Vista アプリケーションをビルドすることはできます。 Direct3D 10 は、次のライブラリ上の依存関係 (Server 2003 SP1 プラットフォーム SDK と同様) を持つ Windows Vista プラットフォーム コンポーネントです。リンカーの問題を確認buffer_security解決するには、BufferOverflowU.lib が必要です。
デバイス CAP のシミュレート
多くのアプリケーションには、使用可能なデバイス CAPS データに依存するコード領域が含まれています。 この問題を回避するには、デバイスの列挙をオーバーライドし、デバイス CAPS を適切な値に強制します。 可能な場合は、CAPS を完全に削除するために、後で CAPS に依存する領域に再びアクセスすることを計画します。
Direct3D 10 API の駆動
このセクションでは、Direct3D 10 API によって発生する動作の変更について説明します。
- リソースの作成
- ビュー
- 静的リソース アクセスと動的リソース アクセス
- Direct3D 10 効果
- 効果のない HLSL
- シェーダーのコンパイル
- シェーダー リソースの作成
- シェーダー リフレクション レイヤー インターフェイス
- 入力アセンブラー レイアウト - 頂点シェーダー/入力ストリーム リンケージ
- シェーダーのデッド コードの削除の影響
- 頂点シェーダー入力構造体の例
- State オブジェクトの作成
リソースの作成
Direct3D 10 API は、計画された使用に応じて特定のバインド フラグを持つ汎用バッファー型としてリソースを設計しています。 この設計ポイントは、パイプライン内のリソースへのほぼユビキタスなアクセスを容易にするために選択されました。これは、頂点バッファーへのレンダリングなどのシナリオで、CPU を中断することなく即座に結果を描画します。 次の例では、頂点バッファーとインデックス バッファーの割り当てを示します。リソースの説明は GPU リソース バインド フラグによってのみ異なることがわかります。
Direct3D 10 API には、テクスチャ型リソースを明示的に作成するためのテクスチャ ヘルパー メソッドが用意されていますが、ご想像のとおり、これらは実際にはヘルパー関数です。
- CreateTexture2D()
- CreateTextureCube()
- CreateTexture3D()
Direct3D 10 を対象とする場合、リソースの作成時に、Direct3D 9 で使用したアイテムよりも多くの項目を割り当てる必要がある可能性があります。 これは、レンダー ターゲット バッファーとテクスチャを作成する際に最も顕著になります。この場合、バッファーにアクセスし、デバイスでリソースを設定するためのビューも作成する必要があります。
Note
Direct3D 10 以降のバージョンの Direct3D では、DDS ファイル形式が拡張され、新しい DXGI 形式、テクスチャ配列、およびキューブ マップ配列がサポートされます。 ファイル拡張子DDSの詳細については、DDSプログラミングガイドを参照してください。
ビュー
ビューは、ピクセル バッファーに格納されているデータに対する、具体的に型指定されたインターフェイスです。 リソースには一度に複数のビューを割り当てることができ、この機能は、この SDK に含まれる Cubemap へのシングル パス レンダリング サンプルで強調表示されています。
静的リソース アクセスと動的リソース アクセス
最適なパフォーマンスを得るためのアプリケーションでは、データの静的な性質と動的な性質の観点からデータの使用をパーティション分割する必要があります。 Direct3D 10 はこのアプローチを利用するように設計されているため、リソースのアクセス規則は Direct3D 9 よりも大幅に強化されています。 静的リソースの場合は、作成時にリソースにデータを設定することをお勧めします。 エンジンが Direct3D 9 の作成、ロック、フィル、ロック解除のデザイン ポイントを中心に設計されている場合は、リソース インターフェイスでステージング リソースと UpdateSubResource メソッドを使用して、作成時間から作成を延期できます。
Direct3D 10 効果
Direct3D 10 Effects システムの使用は、この記事の範囲外です。 このシステムは、Direct3D 10 が提供するアーキテクチャ上の利点を最大限に活用するように設計されています。 使用の詳細については、「 Effects (Direct3D 10) 」セクションを参照してください。
効果のない HLSL
Direct3D 10 シェーダー パイプラインは、Direct3D 10 Effects システムを使用せずに駆動できます。 このインスタンスでは、すべての定数バッファー、シェーダー、サンプラー、およびテクスチャ バインドをアプリケーション自体で管理する必要があることに注意してください。 詳細については、このドキュメントのサンプル リンクと次のセクションを参照してください。
シェーダーのコンパイル
Direct3D 10 HLSL コンパイラは、HLSL 言語定義の機能強化を実現するため、2 つのモードで動作できます。 Direct3D 9 スタイルの組み込み関数とセマンティクスを完全にサポートするには、コンパイルごとに指定できる COMPATIBILITY MODE フラグを使用してコンパイルを呼び出す必要があります。
Direct3D 10 のシェーダー モデル 4.0 固有の HLSL 言語セマンティクスと組み込み関数は、 HLSLにあります。 Direct3D 9 HLSL からの構文の主な変更点は、テクスチャ アクセスの領域にあります。 互換性モード以外のコンパイラでサポートされている唯一の形式は、新しい構文です。
Note
Direct3D 10 コンパイラ型 API (D3D10CompileShader および D3D10CompileEffectFromMemory) は、Windows Vista 以降で実行される Direct3D 10、10.1、および 11 ランタイムによって提供されます。 Direct3D 10 コンパイラタイプの API は、DirectX SDK (2006 年 12 月) に付属している HLSL コンパイラと同じ機能を備えています。 この HLSL コンパイラは、Direct3D 10.1 プロファイル (vs_4_1、ps_4_1、gs_4_1、fx_4_1) をサポートしていないため、多数の最適化と改善が欠けています。 Direct3D 10.1 プロファイルをサポートする HLSL コンパイラは、最新のレガシ DirectX SDK リリースから入手できます。 従来の DirectX SDK の詳細については、「DirectX SDK はどこにありますか」を参照してください。 最新の HLSL Fxc.exeコマンド ライン コンパイラと D3DCompiler API を Windows SDK から取得できます。
シェーダー リソースの作成
Direct3D 10 Effects システムの外部でコンパイルされたシェーダー インスタンスの作成は、Direct3D 9 とよく似た方法で行われますが、Direct3D 10 では、後で使用するためにシェーダー入力シグネチャを保持することが重要です。 署名はシェーダー BLOB の一部として既定で返されますが、必要に応じてメモリ要件を減らすために抽出される場合があります。 詳細については、「 Direct3D 10 でのシェーダーの使用」を参照してください。
シェーダー リフレクション レイヤー インターフェイス
シェーダー リフレクション レイヤーは、シェーダーの要件に関する情報を取得できるインターフェイスです。 これは、シェーダーに正しい入力構造を確実に提供するためにシェーダー入力要件を走査する必要がある場合がある入力アセンブリ リンケージ (下記参照) を作成する場合に特に便利です。 リフレクション レイヤー インターフェイスのインスタンスは、コンパイル済みシェーダーのインスタンスの作成と同時に作成できます。
シェーダー リフレクション レイヤーは、同様の機能を提供する D3DX9 メソッドを置き換えます。 たとえば、 IsParameterUsed は 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, ¶mDesc);
if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex)
return true;
}
return false;
}
State オブジェクトの作成
エンジン コードを移植するときに、最初に状態オブジェクトの既定のセットを使用し、すべての Direct3D 9 デバイスのレンダリング状態/テクスチャ状態設定を無効にするのに役立つ場合があります。 これにより、レンダリングアーティファクトが発生しますが、作業を開始して実行する最も簡単な方法です。 後で、複合キーを使用して使用されている状態オブジェクトの数を最大限に再利用できる状態オブジェクト管理システムを構築できます。
テクスチャの移植
サポートされているファイル形式
グラフィックス ファイルとの間でテクスチャを作成または保存する D3DXxxCreateXXX および D3DXxxSaveXXX 関数は、Direct3D 9 とは異なるファイル形式のセットを Direct3D 10 でサポートします (たとえば、 D3DX10CreateTextureFromFile)。
ファイル形式 | Direct3D 9 | Direct3D 10 |
---|---|---|
.bmp | はい | はい |
.jpg | はい | はい |
.tga | はい | |
.png | はい | はい |
.dds | はい | はい |
.ppm | はい | |
.dib | はい | |
.hdr | はい | |
.pfm | はい | |
.tiff | はい | |
.gif | はい | |
.tif | はい |
詳細については、Direct3D 9 D3DXIMAGE_FILEFORMAT 列挙体と Direct3D 10 の D3DX10_IMAGE_FILE_FORMAT 列挙体を比較します。
Note
D3DX (D3DX 9、D3DX 10、D3DX 11) ユーティリティ ライブラリは、Windows 8 では非推奨です。 テクスチャ ファイルの処理には、 DirectXTex を使用することをお勧めします。
テクスチャ形式のマッピング
次の表は、Direct3D 9 から Direct3D 10 へのテクスチャ形式のマッピングを示しています。 DXGI で使用できない形式のコンテンツは、ユーティリティ ルーチンで変換する必要があります。
Direct3D 9 形式 | Direct3D 10 形式 |
---|---|
D3DFMT_UNKNOWN | DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 | 使用不可 |
D3DFMT_A8R8G8B8 | DXGI_FORMAT_B8G8R8A8_UNORM & DXGI_FORMAT_B8G8R8A8_UNORM_SRGB¹ |
D3DFMT_X8R8G8B8 | DXGI_FORMAT_B8G8R8X8_UNORM & DXGI_FORMAT_B8G8R8X8_UNORM_SRGB¹ |
D3DFMT_R5G6B5 | DXGI_FORMAT_B5G6R5_UNORM² |
D3DFMT_X1R5G5B5 | 使用不可 |
D3DFMT_A1R5G5B5 | DXGI_FORMAT_B5G5R5A1_UNORM² |
D3DFMT_A4R4G4B4 | DXGI_FORMAT_B4G4R4A4_UNORM ² |
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 | DXGI_FORMAT_R8G8_UNORM注: シェーダーで swizzle .rrrg を使用して赤を複製し、緑をアルファ コンポーネントに移動して D3D9 動作を取得します。 |
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 スタイルの整数浮動小数点数が必要な場合 (0.0f、1.0f...255.f)、UINT はシェーダーで float32 に変換できます。 |
D3DDECLTYPE_SHORT2 | DXGI_FORMAT_R16G16_SINT注: シェーダーは SINT 値を取得しますが、Direct3D 9 スタイルの整数浮動小数点数が必要な場合は、シェーダーで SINT を float32 に変換できます。 |
D3DDECLTYPE_SHORT4 | DXGI_FORMAT_R16G16B16A16_SINT注: シェーダーは SINT 値を取得しますが、Direct3D 9 スタイルの整数浮動小数点数が必要な場合は、シェーダーで 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 |
FourCC 'ATI1' | DXGI_FORMAT_BC4_UNORM |
FourCC 'ATI2' | DXGI_FORMAT_BC5_UNORM |
Direct3D 11 ランタイムに含まれる ¹DXGI 1.1 には、BGRA 形式が含まれています。 ただし、これらの形式のサポートは、Windows Vista (WDDM 1.0) 用 Windows ディスプレイ ドライバー モデル (WDDM) に実装されているドライバーを持つ Direct3D 10 および 10.1 デバイスでは省略可能です。 代わりにDXGI_FORMAT_R8G8B8A8_UNORMを使用することを検討してください。 または、 D3D10_CREATE_DEVICE_BGRA_SUPPORT を使用してデバイスを作成して、Direct3D 11.0 ランタイムと WDDM 1.1 以上のドライバーがインストールされているコンピューターのみをサポートするようにすることもできます。
²DXGI 1.0 では 5:6:5 形式と 5:5:5:1 形式が定義されていますが、Direct3D 10.x または Direct3D 11.0 ランタイムではサポートされていませんでした。 これらの形式は、必要に応じて DirectX 11.1 ランタイムの DXGI 1.2 でサポートされます。これは、機能レベル 11.1 のビデオ アダプターと WDDM 1.2 (Windows 8 以降のディスプレイ ドライバー モデル) ドライバーに必要であり、10level9 機能レベルで既にサポートされています。
²DXGI 1.2 では、4:4:4:4 形式が導入されました。 この形式は、必要に応じて DirectX 11.1 ランタイムでサポートされます。これは、機能レベル 11.1 のビデオ アダプターと WDDM 1.2 ドライバーに必要であり、10level9 機能レベルで既にサポートされています。
非圧縮形式の場合、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 を指定する必要があります。
ただし、ステージ間のリンケージ セマンティクスは正確に一致する必要があることに注意してください。ただし、ターゲット ステージの入力は、出力される値のプレフィックスである可能性があります。 上の例では、ピクセル シェーダーは唯一の入力として位置と texcoord1 を持つことができますが、順序制約のために位置と texcoord2 を唯一の入力として持つことができました。
HLSL シェーダー ステージ リンケージ
シェーダー間のリンケージは、パイプライン内の次のいずれかのポイントで発生する可能性があります。
- 頂点シェーダーへの入力アセンブラー
- 頂点シェーダーからピクセル シェーダーへ
- 頂点シェーダーからジオメトリ シェーダーへ
- 頂点シェーダーからストリーム出力へ
- ジオメトリ シェーダーからピクセル シェーダーへ
- ストリーミング アウトするジオメトリ シェーダー
定数バッファー
Direct3D 9 からコンテンツを移植しやすくするために、Effects システムの外部で定数管理を行う最初のアプローチでは、必要なすべての定数を含む単一の定数バッファーを作成する必要があります。 パフォーマンスでは、予想される更新頻度によって定数をバッファーに並べ替える必要があります。 この組織では、冗長定数セットの量を最小限に減らします。
機能レベル 9 以降の HLSL のユーザー クリップ プレーン
Windows 8 以降では、SV_ClipDistanceではなく、HLSL 関数宣言で clipplanes 関数属性を使用してシェーダーを機能レベル機能レベル 9_x機能レベル 10 以上で動作させることができます。 詳細については、「機能レベル 9 ハードウェアのユーザー クリップ プレーン」を参照してください。
その他の Direct3D 10 の相違点
入力としての整数
Direct3D 9 では、整数データ型に対する実際のハードウェア サポートはありませんでしたが、Direct3D 10 ハードウェアでは明示的な整数型がサポートされています。 頂点バッファーに浮動小数点データがある場合は、浮動小数点入力が必要です。 それ以外の場合、整数型は浮動小数点値のビット パターン表現になります。 値が補間なしとしてマークされていない限り、ピクセル シェーダー入力に整数型は使用できません (「 Interpolation Modifiers」を参照)。
マウス カーソル
以前のバージョンの Windows では、標準の GDI マウス カーソル ルーチンが、すべての全画面表示専用デバイスで正しく動作しませんでした。 これらのケースを処理するために、 SetCursorProperties、 ShowCursor、および 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 関数はデバイス オブジェクトへの参照を保持しません。 つまり、アプリケーションは、そのオブジェクトをパイプラインにバインドする必要がある限り、オブジェクトの参照を保持する必要があります。 オブジェクトの ref カウントが 0 に低下すると、オブジェクトは破棄されるときにパイプラインからバインド解除されます。 この参照保持のスタイルは弱参照保持とも呼ばれるため、Device オブジェクト上の各バインド位置はインターフェイス/オブジェクトへの弱参照を保持します。 特に明記されていない限り、すべての Set メソッドでこの動作を想定する必要があります。 オブジェクトの破棄によってバインド ポイントが NULL に設定されるたびに デバッグ レイヤーは警告を発行します。 OMGetRenderTargets などのデバイス Get メソッドを呼び出すと、返されるオブジェクトの参照数が増えます。
協調レベルのテスト
Direct3D 9 API TestCooperativeLevel の機能は、Present を呼び出すときのDXGI_PRESENT_TESTの設定に似ています。
StretchRect
Direct3D 9 IDirect3DDevice9::StretchRect メソッドのような関数は、Direct3D 10 および 10.1 では使用できません。 リソース サーフェイスをコピーするには、 ID3D10Device::CopySubresourceRegion を使用します。 サイズ変更操作の場合は、テクスチャ フィルタリングを使用してテクスチャにレンダリングします。 MSAA サーフェスを非 MSAA サーフェスに変換するには、 ID3D10Device::ResolveSubresource を使用します。
Direct3D 10.1 のその他の相違点
Windows Vista Service Pack 1 (SP1) には、Direct3D 10 と Direct3D 10.1 のマイナー更新プログラムが含まれており、次の追加のハードウェア機能が公開されました。
- サンプルごとの MSAA シェーダー
- MSAA 深度の読み取り戻し
- レンダー ターゲットごとの独立したブレンド モード
- キューブ マップ配列
- ブロック圧縮 (BC) 形式にレンダリングする
Direct3D 10.1 更新プログラムでは、既存のインターフェイスから派生した次の新しいインターフェイスのサポートが追加されました。
Direct3D 10.1 更新プログラムには、次の追加の構造も含まれていました。
Direct3D 10.1 API には、機能レベルという名前の新しい概念が含まれています。 この概念は、Direct3D 10.1 API を使用して、Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) または Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1) ハードウェアを駆動できることを意味します。 Direct3D 10.1 API は Direct3D 10 インターフェイスから派生しているため、アプリケーションは Direct3D 10.1 デバイスを作成し、新しい 10.1 固有の機能が必要な場合を除き、Direct3D 10.0 デバイスとして使用できます ( D3D10_FEATURE_LEVEL_10_1 機能レベルが存在し、これらの機能をサポートしている場合)。
Note
Direct3D 10.1 デバイスでは、既存の 10.0 HLSL シェーダー プロファイル (vs_4_0、ps_4_0、gs_4_0) と新しい 10.1 プロファイル (vs_4_1、ps_4_1、gs_4_1) を追加の HLSL 命令と機能と共に使用できます。
Windows 7 には、Direct3D 10.1 ランタイムに含まれる Direct3D 10.1 API のマイナー更新プログラムが含まれていました。 この更新プログラムは、次の機能レベルのサポートを追加します。
Windows 7 では、Direct3D 10.1 for Windows Advanced Rasterization Platform (WARP)のサポートも追加されました。
Direct3D 10.1 の詳細については、「 Direct3D 10.1 の機能 および D3D10_FEATURE_LEVEL1 列挙型」を参照してください。
関連トピック