次の方法で共有


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 デバイスを使用してレンダリングするプロセスは、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 動作の代替シェーダー ソースを含むホワイト ペーパーが含まれています (「Fixed Function EMU Sample」を参照)。 アルファ テストを含む一部の固定関数ピクセル動作がシェーダーに移動されました。

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

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 API は、計画された使用に応じて特定のバインド フラグを持つ汎用バッファー型としてリソースを設計しています。 この設計ポイントは、パイプライン内のリソースへのほぼユビキタスなアクセスを容易にするために選択されました。これは、頂点バッファーへのレンダリングなどのシナリオで、CPU を中断することなく即座に結果を描画します。 次の例では、頂点バッファーとインデックス バッファーの割り当てを示します。リソースの説明は GPU リソース バインド フラグによってのみ異なることがわかります。

Direct3D 10 API には、テクスチャ型リソースを明示的に作成するためのテクスチャ ヘルパー メソッドが用意されていますが、ご想像のとおり、これらは実際にはヘルパー関数です。

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

Direct3D 10 を対象とする場合、リソースの作成時に、Direct3D 9 で使用したアイテムよりも多くの項目を割り当てる必要がある可能性があります。 これは、レンダー ターゲット バッファーとテクスチャを作成する際に最も顕著になります。この場合、バッファーにアクセスし、デバイスでリソースを設定するためのビューも作成する必要があります。

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

Note

Direct3D 10 以降のバージョンの Direct3D では、DDS ファイル形式が拡張され、新しい DXGI 形式、テクスチャ配列、およびキューブ マップ配列がサポートされます。 DDS ファイル形式拡張子の詳細については、DDS のプログラミング ガイドを参照してください。

 

ビュー

ビューは、ピクセル バッファーに格納されているデータに対する、具体的に型指定されたインターフェイスです。 リソースには一度に複数のビューを割り当てることができ、この機能は、この SDK に含まれる Cubemap へのシングル パス レンダリング サンプルで強調表示されています。

リソース アクセスのプログラマ ガイド ページ

CubeMap サンプル

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

最適なパフォーマンスを得るためのアプリケーションでは、データの静的な性質と動的な性質の観点からデータの使用をパーティション分割する必要があります。 Direct3D 10 はこのアプローチを利用するように設計されているため、リソースのアクセス規則は Direct3D 9 よりも大幅に強化されています。 静的リソースの場合は、作成時にリソースにデータを設定することをお勧めします。 エンジンが Direct3D 9 の作成、ロック、フィル、ロック解除のデザイン ポイントを中心に設計されている場合は、リソース インターフェイスでステージング リソースと UpdateSubResource メソッドを使用して、作成時間から作成を延期できます。

Direct3D 10 効果

Direct3D 10 Effects システムの使用は、この記事の範囲外です。 このシステムは、Direct3D 10 が提供するアーキテクチャ上の利点を最大限に活用するように設計されています。 使用の詳細については、「 効果 (Direct3D 10)」 セクションを参照してください。

効果のない HLSL

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

エフェクトなしの HLSL サンプル

シェーダーのコンパイル

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

シェーダー モデル 4.0 固有の HLSL 言語セマンティクスと Direct3D 10 の組み込み関数は 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 はどこにありますか」を参照してください。 Windows SDK から最新の HLSL Fxc.exeコマンド ライン コンパイラと D3DCompiler API を取得できます。

 

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

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, &paramDesc);
        if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex) 
            return true;
    }

    return false;
}

State オブジェクトの作成

エンジン コードを移植するときに、最初に状態オブジェクトの既定のセットを使用し、すべての Direct3D 9 デバイスのレンダリング状態/テクスチャ状態設定を無効にするのに役立つ場合があります。 これにより、レンダリングアーティファクトが発生しますが、作業を開始して実行する最も簡単な方法です。 後で、複合キーを使用して使用されている状態オブジェクトの数を最大限に再利用できる状態オブジェクト管理システムを構築できます。

テクスチャの移植

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

グラフィックス ファイルとの間でテクスチャを作成または保存する D3DXxxCreateXXX および D3DXxxSaveXXX 関数 (D3DX10CreateTextureFromFile など) では、Direct3D 9 とは異なるファイル形式のセットが Direct3D 10 でサポートされています。

ファイル形式 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 以降では、機能レベル 9_xおよび機能レベル 10 以上でシェーダーを動作させるには、SV_ClipDistanceではなく、HLSL 関数宣言で clipplanes 関数属性を使用できます。 詳細については、「機能レベル 9 ハードウェアのユーザー クリップ プレーン」を参照してください。

その他の Direct3D 10 の相違点

入力としての整数

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

マウス カーソル

以前のバージョンの 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) のサポートも追加されました。 D3D10_DRIVER_TYPE_WARPを使用して WARP ドライバーを指定できます。

Direct3D 10.1 の詳細については、「 Direct3D 10.1 の機能D3D10_FEATURE_LEVEL1 列挙型」を参照してください。

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