Share via


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 の場合と同様に、描画呼び出し中ではなく、オブジェクト作成時に厳密なデータ検証が可能になります。

エンジンの抽象化/分離

ゲームを含む、Direct3D 9 と Direct3D 10 の両方をサポートするアプリケーションでは、コード ベースの残りの部分からレンダリング レイヤーを抽象化する必要があります。 これを実現するには多くの方法がありますが、それらすべてに重要なのは、下位レベルの Direct3D デバイス用の抽象化レイヤーの設計です。 すべてのシステムは、GPU リソースと低レベルの型管理を提供するように設計された共通レイヤーを介してハードウェアと通信する必要があります。

Direct3D 9 依存関係の直接削除

以前にテストした大規模なコード ベースを移植する場合は、以前にテストされた動作をコードで保持するために絶対に必要なコード変更の量を最小限に抑える必要があります。 ベスト プラクティスには、コメントを使用して項目が変更される場所を明確に文書化する方法が含まれます。 多くの場合、この作業のコメント標準を使用すると、コード ベースを素早く移動できます。

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

Item 説明
Direct3D 10 が削除されました
これを使用して、コードの行/ブロックが削除されます
Direct3D 10 の更新が必要
NEED UPDATE コメントに追加のメモを追加すると、動作変換のために後でコードにアクセスするために使用する必要がある作業/新しい API を提案できます。 assert(false) を頻繁に使用する必要があります。また、\\ Direct3D 10 NEEDS UPDATE が発生して、知らないうちに誤ったコードを実行しないようにする必要があります
Direct3D 10 の変更
大きな変更が発生した領域は、今後の参照のために保持する必要がありますが、コメント アウト
Direct3D 10 END
終了コード ブロック修飾子

 

複数行のソースの場合は、C スタイルの /* */ コメントも使用する必要がありますが、これらの領域に関連する開始/終了コメントを追加する必要があります。

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

Direct3D 9 型のオーバーライド

Direct3D 10 ヘッダーでサポートされなくなった Direct3D 9 基本型の型定義/オーバーライドを含む高レベルのヘッダー ファイルを挿入すると便利な場合があります。 これにより、Direct3D 9 型から新しく定義された Direct3D 10 型への直接マッピングがあるコードとインターフェイスの変更量を最小限に抑えることができます。 この方法は、コードの動作を 1 つのソース ファイルにまとめる場合にも役立ちます。 この場合は、Direct3D 9 と 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 を使用して Direct3D 10 に依存する Windows Vista アプリケーションを構築することはできます。 Direct3D 10 は Windows Vista プラットフォーム コンポーネントであり、(Server 2003 SP1 プラットフォーム SDK と同様に) 次のライブラリに依存関係があります。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 の基本

注意

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

 

ビュー

ビューは、ピクセル バッファーに格納されているデータに対する特に型指定されたインターフェイスです。 リソースには一度に複数のビューを割り当てることができ、この機能は、この SDK に含まれる Single Pass Render to 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 フラグを使用してコンパイルを呼び出す必要があります。

Direct3D 10 のシェーダー モデル 4.0 固有の HLSL 言語セマンティクスと組み込み関数は 、HLSL にあります。 の注意を引くために Direct3D 9 HLSL からの構文の主な変更は、テクスチャ アクセスの領域にあります。 互換性モードの外部でコンパイラでサポートされている唯一の形式は、新しい構文です。

注意

Direct3D 10 コンパイラタイプ API (D3D10CompileShader および D3D10CompileEffectFromMemory) は、Windows Vista 以降で実行される Direct3D 10、10.1、および 11 ランタイムによって提供されます。 Direct3D 10 コンパイラ型 API には、DirectX SDK に付属している HLSL コンパイラと同じ機能があります (2006 年 12 月)。 この HLSL コンパイラは、Direct3D 10.1 プロファイル (vs_4_1、ps_4_1、gs_4_1、fx_4_1) をサポートしていないため、多数の最適化と機能強化が不足しています。 最新のレガシ DirectX SDK リリースから、Direct3D 10.1 プロファイルをサポートする HLSL コンパイラを取得できます。 従来の DirectX SDK の詳細については、「 DirectX SDK はどこにありますか?」を参照してください。 最新の HLSL Fxc.exeコマンドライン コンパイラと D3DCompiler API は、Windows SDK から入手できます。

 

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

Direct3D 10 Effects システムの外部でコンパイルされたシェーダー インスタンスの作成は、Direct3D 9 と非常によく似た方法で行われますが、Direct3D 10 では、後で使用するためにシェーダー入力シグネチャを維持することが重要です。 署名はシェーダー BLOB の一部として既定で返されますが、必要に応じてメモリ要件を減らすために抽出される場合があります。 詳細については、「 Direct3D 10 でのシェーダーの使用」を参照してください。

シェーダー リフレクション レイヤー インターフェイス

シェーダー リフレクション レイヤーは、シェーダー要件に関する情報を取得するためのインターフェイスです。 これは、シェーダーに正しい入力構造を確実に提供するためにシェーダー入力要件を走査する必要がある場合がある入力アセンブリ リンケージ (下記参照) を作成する場合に特に便利です。 リフレクション レイヤー インターフェイスのインスタンスは、コンパイルされたシェーダーのインスタンスの作成と同時に作成できます。

シェーダー リフレクション レイヤーは、同様の機能を提供する D3DX9 メソッドを置き換えます。 たとえば 、IsParameterUsedGetDesc メソッドに置き換えられます。

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

入力アセンブラー (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 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 列挙体を比較します。

注意

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 swizzle を使用して、他のコンポーネントに赤を複製して 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 swizzle を使用して、他のコンポーネントに赤を複製して 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 Display Driver Model (WDDM) for Windows Vista (WDDM 1.0) に実装されているドライバーを備えた 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 を指定する必要があります。

ただし、ステージ間のリンケージ セマンティクスは正確に一致する必要がありますが、ターゲット ステージの入力は、出力される値のプレフィックスである可能性があります。 上記の例では、ピクセル シェーダーは position と texcoord1 を唯一の入力として持つことができますが、順序付けの制約により、位置と texcoord2 を唯一の入力として持つことはできませんでした。

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

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

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

定数バッファー

Direct3D 9 からコンテンツを移植しやすいように、Effects システムの外部で定数管理を行う最初のアプローチでは、必要なすべての定数を含む 1 つの定数バッファーを作成することが必要になる場合があります。 パフォーマンスでは、予想される更新頻度によって定数をバッファーに並べ替える必要があります。 このorganizationは、冗長定数セットの量を最小に減らします。

機能レベル 9 以降の HLSL のユーザー クリップ プレーン

Windows 8以降、HLSL 関数宣言clipplanes 関数属性を使用して、SV_ClipDistanceではなく、機能レベル 9_xおよび機能レベル 10 以上でシェーダーを動作させることができます。 詳細については、「 機能レベル 9 ハードウェアのユーザー クリップ プレーン」を参照してください。

その他の Direct3D 10 の違いを監視する

入力としての整数

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

マウス カーソル

以前のバージョンの 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 関数はデバイス オブジェクトへの参照を保持しません。 つまり、アプリケーションは、そのオブジェクトをパイプラインにバインドする限り、オブジェクトに対する参照を保持する必要があります。 オブジェクトの 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 機能レベルが存在し、これらの機能をサポートしている場合)。

注意

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 11 ランタイムに含まれる Direct3D 10.1 API のマイナー更新プログラムが含まれていました。 この更新プログラムは、次の機能レベルのサポートを追加します。

Windows 7 では、Direct3D 10.1 for Windows Advanced Rasterization Platform (WARP) のサポートも追加されました。 WARP ドライバーは、 D3D10_DRIVER_TYPE_WARPを使用して指定できます。

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

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