|
|
发表于 2007-9-5 11:18:00
|
显示全部楼层
Re:「君が好き」の言い方数を?算するプログラムを作ろう
Direct3D 9 から Direct3D 10 に移行する?に考?]すべき点
Direct3D 9 と Direct3D 10 との相?点
以下のペ?ジに、 Direct3D 9 と Direct3D 10 の主な相?点の基本的な概要について?明します。本ドキュメントは、包括的な Direct3D 9 から Direct3D 10 への移植およびクロスプラットフォ?ムの??ガイドの序章といった役割を果たします。以下にある概要では、??者が Direct3D 9 での??を活かし、Direct3D 10 の探索と??付けを支援する初期の??を提供します。
Direct3D 10 における主な??造上の?涓?悚胃乓
エンジンの抽象概念 / 分?
アプリケ?ションのビルドの???をすぐに解?Qするための?技
Direct3D 10 API を??婴工
コンテンツを移植する
その他の注意すべき Direct3D 10 における相?点
Direct3D 10 における主な??造上の?涓?悚胃乓
Direct3D 10 の一般的 API は、前バ?ジョンの Direct3D と?なり、基本??造内で使用行します。 Direct3D 10 デバイスを使ってのレンダリングのプロセスは、??造的にパイプラインのフロ?に?兢Φ悚扦稀 Direct3D 9 と似ています。
?点ストリ?ム ソ?スを?定 (Set)
入力レイアウトを?定 (Set) (Direct3D 9 では、?点ストリ?ムの Decl に相当)
プリミティブ型トポロジを宣言 (Declare)
テクスチャを?定 (Set)
ステ?ト オブジェクトを?定 (Set)
シェ?ダを?定 (Set)
描画 (Draw)
Draw コマンドが、 「Set」 の呼び出しの操作を?合しますから、 「Draw」 コマンドの前にその操作が?生する限り、どんな?序で Set を呼び出してもかまいません。 Direct3D 10 API の??上の主な相?点は、以下のとおりです。
固定?C能の削除
CAPS ビットの削除 - Direct3D 10 のベ?ス?C能セットを保?
以下をより??密に管理
リソ?ス アクセス
デバイス ステ?ト
シェ?ダ定数
ステ?ジ?のシェ?ダ リンケ?ジ (シェ?ダへの入力および出力)
GPU メモリの?⑾牖?蚍从长筏 API エントリ ポイント名の?涓 (Lock()の代わりに、Map()))
作成?rにデバイスに追加することも可能なデバッグ レイヤ?の提供
Draw 呼び出しからのプリミティブ トポロジの切り?し。これは、明示的デバイス ステ?トになりました。
明示的な定数の代わりに、デバイス上の定数バッファ スロット
シェ?ダのオ?サリングは、完全に HLSL で?g行。 HLSL コンパイラは、 Direct3D 10 では、基本 Direct3D 10 DLL に常?
新しいプログラミング可能なステ?ジ-ジオメトリ シェ?ダ (Geomatory Shader : GS)
API での短?ステ?ジ名
VS - Vertex Shader (?点シェ?ダ) 、GS - Geometry Shader (ジオメトリ シェ?ダ) 、PS - Pixel Shader (ピクセル シェ?ダ)
Begin Scene / End Scene (シ?ンの?始、シ?ンの?了) の除去
通常の 2D 、フォ?カス、アダプタ管理?C能は、新しいコンポ?ネント DXGI にリファクタリング
本ドキュメントでは、上?にリストした?目の多くについて、??を?明していきます。
固定?C能の削除
プログラマブル パイプラインを完全に有?郡摔筏皮い Direct3D 9 エンジンでさえ、固定?C能パイプラインに依存するさまざまな?域を残しているのは、?rに?くべきことです。最も一般的な?域は、通常、 UI としてレンダリングされる配列された画面空?に??しています。このため、必要な代用?I理を提供する固定?C能エミュレ?ション シェ?ダや一?のシェ?ダをビルドする必要性が高くなります。
Fixed Function EMU Sample (英?) のサンプルには、最も一般的な固定?C能?I理用の代用シェ?ダ リソ?スを含む情?螭??蓼欷皮い蓼埂
アルファ テストを含む、いくつかの固定?C能 ピクセル?I理は、シェ?ダに移行していることにご注意ください。
デバイス オブジェクト作成?rの?试^
Direct3D 10 パイプラインは、 CPU オ?バ?ヘッド (Draw?r) の量を最小に削?pすることを主な目的として、ハ?ドウェア、およびソフトウェアに?して?氐椎膜嗽僭O?されています。?用を削?pするために、デバイス デ?タの型すべては、デバイスそのものによって提供された明示的作成方法とともに、オブジェクトが割り当てられています。この??ポイントは、 Direct3D 9 でよく行われているような Draw が呼び出されている?ではなく、オブジェクト作成?rに??密なデ?タ?试^を行うことを可能にします。
エンジンの抽象概念 / 分?
同?rに Direct3D 9 と Direct3D 10 をサポ?トしたい、ゲ?ムを含むアプリケ?ションは、残りのコ?ド ベ?スからレンダリング レイヤ?を抽出する必要があります。これを?g?するには多くの方法がありますが、そのすべての方法のカギとなっているのは、より低レベルである Direct3D デバイス用の抽象レイヤ?の??にあります。すべてのシステムは、 GPU リソ?スと低レベルの型管理を提供するために??された共通レイヤ??由でハ?ドウェアと通信すべきです。
Direct3D 9 依存部分を直接削除
大?模かつすでにテスト?gみのコ?ドベ?スを移植する?、事前にテスト?gみの?I理を?持するために、???に必要なコ?ド部分に??して、コ?ドの?涓?郡蜃钚∠蓼摔工毪长趣现匾?胜长趣扦埂M?X手?の 1 つは、コメントを使って、?涓?工腠?目の?鏊?胜嗓蛎鞔_にドキュメント化することです。通常、コ?ドベ?スを通して素早いナビゲ?ションを可能にしたり、アップデ?トを必要としているコ?ドの量を判断する手段を提供したりするために、この作?Iのためのコメント方法の基?胜蛟Oけておくと役に立ちます。
以下は、この作?Iに使用することのできる??实膜 1 行の?始ブロック コメント例のリストです。
// Direct3D 10 REMOVED
?数行または?数ブロックのコ?ドを削除した?龊悉恕ⅳ长欷蚴褂
// Direct3D 10 NEEDS UPDATE
NEED UPDATE コメントに、?I理移行?rに後でアクセスするために、どのような?I理/新しい API が必要なのか提言する注意???颔畅`ドに追加するとよいでしょう。
?o意?のうちに?ったコ?ドを?g行しないようにするためにも、// Direct3D 10 NEEDS UPDATE が?れた?鏊? assert(false) の多用もまた有?郡扦埂
// Direct3D 10 CHANGED
主な?涓??k生した?域は、将来のリファレンスとしてそのまま残し、コメントアウトすべきです。
// Direct3D 10 END
コ?ドブロックの?了を指定します
?数行のソ?スについては、 C言?のコメント?述スタイル、/* */ を使用すべきですが、?当する start / end コメントをその?域の周りに追加するようにしてください。
アプリケ?ションのビルドの???を素早く解?Qするための?技
Direct3D 9 の型をオ?バ?ライドする
Direct 3D 10 ヘッダ?によってサポ?トされていない Direct3D 9 ベ?スの型の型定?/オ?バ?ライドを含む上位レベルのヘッダ? ファイルを?啡毪工毪纫哿ⅳ膜?猡筏欷蓼护蟆 Direct3D 9 の型から新しく定?された Direct3D 10 の型に直接マッピングすれば、コ?ドやインタ?フェイス内の?涓?郡蜃畹拖蓼摔扦?蓼埂¥长畏椒à稀ⅴ畅`ドの?I理を 1 つのソ?スファイルにまとめておくのにも役立ちます。この?龊稀ⅳ饯紊稀 Direct3D 9 と Direct3D 10 API の?I方に及ぶ、レンダリング用の共通のコンストラクトを?述する、バ?ジョンに依存しない一般的な名前の型で定?するとよいでしょう。例えば、以下のとおりです。
#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;
リンクの???を解?Qする
Microsoft Visual Studio の最新版 (?坦P?r点ではバ?ジョン 8) を使って、 Direct3D 10 および Windows Vista アプリケ?ションを??することをお?幛幛筏蓼埂¥堡欷嗓狻⑶挨 Visual Studio の 2003 バ?ジョンを使って、 Direct3D 10 に依存する Windows Vista アプリケ?ションをビルドすることは可能です。 Direct3D 10 は、 Windows Vista プラットフォ?ム コンポ?ネントで、次の lib に?しては、依存??S (Server 2003 SP1 プラットフォ?ム SDK 同??) があります。 BufferOverflow.lib は、 buffer_security チェック リンカの???を解?Qする必要があります。
デバイスの CAPs をシミュレ?ションする
ゲ?ムを含む数多くのアプリケ?ションは、利用可能なデバイスの CAPS デ?タに依存するコ?ド?域があります。これは、エミュレ?ションをオ?バ?ライドしたり、デバイス CAPS を?g用的な??へと??制したりすることで、回避できます。可能であれば、後で、 CAPS の依存部分の?域にアクセスし、完全に CAPS を削除するようにすべきです。
Direct3D 10 API を操作する
この文章の次のセクションでは、 Direct3D 10 API の操作に特化した?域に重点を置き、 Direct3D 10 がもたらす?I理の?涓?悚???Iする方法に言及します。
リソ?スの作成
Direct3D 10 API では、?画した用途に?兢盲铺囟à违啸ぅ螗 フラグを持つ包括的なバッファ タイプとして、リソ?スを??しています。この??ポイントを?んだのは、?点バッファへレンダリングを行った後すぐに、 CPU を中断することなく、?果を描画するというようなシナリオで、パイプラインにあるリソ?スへのほとんどどこからでもアクセスできるようにするためです。以下の例では、?点バッファとインデックス バッファの割り当てを?明します。リソ?ス?述がGPUのリソ?ス バインド フラグによってのみ?なることを??できます。
Direct3D 10 API は、明示的にテクスチャ型リソ?スを作成するためのテクスチャ ヘルパ? メソッドを提供していますが、想像できるように、これらは、?g?的にヘルパ??数です。
CreateTexture2D()
CreateTextureCube()
CreateTexture3D()
Direct3D を??象にしている?龊稀ⅴ辚僵`ス作成?rに Direct3D 9 を??象にしていたときよりも、より数多くの?目を割り当てたいと思うでしょう。このことは、バッファにアクセスし、デバイスにリソ?スを?定するためのビュ?を作成する必要が?生するレンダ?タ?ゲット バッファとテクスチャの作成?rに最も明?になるでしょう。サンプルにある次のチュ?トリアルを参照してください。
Tutorial 1: Direct3D 10 Basics (英?)
ビュ?
ビュ?は、ピクセル バッファ内に格?されたデ?タに??する明?に型付けされたインタ?フェイスです。リソ?スは、一度にそれに割り当てられた?数のビュ?を?持できます。この?C能については、 SDK に含まれ次のサンプルで取り上げられています。
Programmers Guide page on Resource Access (英?)
CubeMap Sample (英?)
静的リソ?ス アクセスと?拥磨辚僵`ス アクセス
最高のパフォ?マンスを出すには、アプリケ?ションは、静的と?拥膜畏N?の?点で、使用するデ?タを分割すべきです。 Direct3D 10 は、この手法を十分に活用するように??されており、リソ?スへのアクセス ル?ルは、 Direct3D 9 と比べると著しく??密になっています。静的リソ?スは、作成?rにそのデ?タを持つリソ?スを理想的に配置されるはずです。使用しているエンジンが、 Direct3D 9 の??点である Create 、 Lock 、 Fill 、 Unlock をもとに??されている?龊悉稀ⅴ攻譬`ジング リソ?スとリソ?ス インタ?フェイスの UpdateSubResource メソッドを使うことで配置を Create ?rから?らせることができます。
Direct3D 10 エフェクト
Direct3D 10 エフェクト システムの使用法は、この文章の??焱猡扦埂%ē榨Д? システムは、 Direct3D 10 が提供する??造上の利点を十分に活用するように???欷皮い蓼埂
エフェクトなしの HLSL
Direct3D 10 シェ?ダ パイプラインは、 Direct3D 10 エフェクト システムを使用せずに??婴扦?蓼埂¥长?龊稀ⅳ工伽皮味ㄊ?啸氓榨 ⅴ伐З`ダ、サンプラ、テクスチャ バインディングは、アプリケ?ション自体が管理する必要があります。??については、サンプル リンクと以下に?く本ドキュメントのセクションを参照してください。
Direct3D 10 without Effects sample (英?)
シェ?ダのコンパイル
Direct3D 10 HLSL コンパイラは、 HLSL 言?の定?への?C能??化をもたらし、そのため、 2 つのモ?ドで操作することが可能です。 Direct3D 9 スタイルの?み?み?数およびセマンティックを完全にサポ?トするために、コンパイルは、 1 度のコンパイル?挨酥付?赡埭 COMPATIBILITY MODE フラグを使って、呼び出されるべきです。
Direct3D 10 シェ?ダ モデル 4.0 固有の HLSL 言?セマンティックと?み?み?数について、最も注意すべき Direct3D 9 HLSL からの??文の主な?涓?悚稀ⅴ匹?攻隶 アクセスの?域にあります。新しい??文が、互?Q性モ?ドの外部でコンパイラによってサポ?トされている唯一のフォ?ムとなります。
シェ?ダ リソ?スの作成
Direct3D10 Effects システムの外部のコンパイル?gみシェ?ダ インスタンスの作成は、 Direct3D 9 と同じようにして?g行できますが、 Direct3D 10 では、後で使用するために、シェ?ダ入力シグネチャを?持しておくことが重要です。シグネチャは、デフォルトでシェ?ダ ブロブの一部として返されますが、必要であれば、必要メモリを??pするために、抽出することも可能です。
シェ?ダ リフレクション レイヤ? インタ?フェイス
シェ?ダ リフレクション レイヤ?は、シェ?ダの要件に?する情?螭稳〉盲?赡埭圣ぅ螗咯`フェイスです。これは、正しい入力??造をシェ?ダに供?することを??するために、シェ?ダ入力の要件をトラバ?スする必要があるかもしれない?龊悉恕⑷肓Εⅴ互螗芝 リンケ?ジ (以下を参照) を作成する?に特に便利です。コンパイル?gみシェ?ダのインスタンスを作成するのと同?rに、リフレクション レイヤ?のインスタンスを作成することが可能です。
入力アセンブラ レイアウト-?点シェ?ダ / 入力ストリ?ム リンケ?ジ
入力アセンブラ (Input Assembler : IA) は、 Direct3D 9 スタイルの?点ストリ?ム宣言と置き?Qわります。その?述??造は、形式がとても似ています。 IA の主な?いは、作成された IA レイアウト オブジェクトは、シェ?ダ入力シグネチャの固有フォ?マットに 直接マップしなければならないとうことです。入力ストリ?ムをシェ?ダにリンクするために作成されたマッピング オブジェクトは、シェ?ダ入力シグネチャが、入力レイアウトを作成するのに使われたシェ?ダのものとマッチする?龊悉稀ⅴ伐З`ダに??して何度でも使用可能です。
静的デ?タでパイプラインを??婴工胍环?畏椒à稀⑷肓Ε攻去戛`ムフォ?マットのシェ?ダ入力シグネチャへの置?Qの可能性を考?]し、できるだけ早い?r点で IA レイアウト オブジェクト インスタンスを作成し、それらを可能な?鏊?窃偈褂盲工毪长趣扦埂
シェ?ダ デッド コ?ドの削除の影?
以下のセクションでは、エンジン コ?ド中で特に注意して?I理を行う必要がある Direct3D 9 と Direct3D 10 での著しい相?点について、??を?明します。多くの?龊稀⑻跫?饯蚝?啷伐З`ダは、コンパイルのプロセスの一部として、一定のコ?ド パスが削除されます。 Direct3D 9 では、削除された??コ?ドに???辘工肴肓σ?丐狻ⅳ饯违伐З`ダ入力??造体からのものです。必要以上にコストのかかる入力レイアウトの?涓??g行することなく、同じ入力シグネチャがすべての可能なシェ?ダ コ?ドの置?Qに使えるようにすることを意?恧筏皮い毪郡帷 Director3D 10 ではこれが?生することはありません。このことは、大きなシェ?ダを?I理したり、大きな入力レイアウトを作成したりする?に、エンジンに??して影?を与えます。コンパイラのデッド コ?ドの最?化によって削除される要素は、それでもやはり、入力??造体で宣言されなければなりません。以下の例では、この状?rを?明します。
?点シェ?ダ 入力??造体の例
typedef struct
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
} VS_INPUT;
* Direct3D 9 デッド コ?ドの削除は、条件付デッド コ?ド削除により、シェ?ダ中の宣言を削除します。
float4x4 g_WorldViewProjMtx;
bool g_bLightMapped = false;
VS_INPUT main(VS_INPUT i)
{
VS_INPUT o;
o.pos = mul( i.pos, g_ WorldViewProjMtx);
o.uv1 = i.uv1;
if ( g_bLightMap )
{
o.uv2 = i.uv2;
}
}
上?の例では、 Direct3D 9 のもと、uv2 要素がコンパイラのデッド コ?ド最?化によって削除されます。 Direct3D 10 のもとでは、デッド コ?ドは、同じように削除されますが、シェ?ダの入力アセンブラ レイアウトが入力デ?タを?持するために、その定?を必要とします。シェ?ダ入力の要件をトラバ?スし、入力ストリ?ムからシェ?ダ シグネチャ マッピングへの完全な?述を提供することを??gにするために、シェ?ダ リフレクション レイヤ?は、一般的な方法でこの状?rを?I理する手段を提供します。以下のコ?ド部分では、入力アセンブラ レイアウトの指定をするときの、シェ?ダの要件を?定するためのリフレクション レイヤ?の使用方法を?明しています。
// この例にある?数は、特定のセマンティックを要求しているかどうか、
// シェ?ダ シグネチャをチェックします。
// HardwareShader_t 入力??造体は、以下のように、前もって取得した
// シェ?ダ リフレクション レイヤ?へのポインタを含んでいます。
//
// typedef struct HardwareShader_s
// {
// ID3D10Blob *pShaderBlobwithSignature;
// ID3D10ShaderReflection *IReflect;
//
// // DEBUG - デバッグ中にシェ?ダのファイル名を?持
// #ifdef _DEBUG
// char filename[MAX_PATH];
// #endif
//
// } HardwareShader_t;
//
bool CheckShaderSignatureExpectations(const HardwareShader_t *pShader, const LPCSTR pSemantic)
{
D3D10_SHADER_DESC shaderDesc;
D3D10_SIGNATURE_PARAMETER_DESC paramDesc;
Assert(pShader);
Assert(pSemantic);
Assert(pShader->IReflect);
pShader->IReflect->GetDesc(&shaderDesc);
for (UINT k=0; k<shaderDesc.InputParameters; k++)
{
pShader->IReflect->GetInputParameterDesc( k, &paramDesc);
if (wcscmp( pSemantic, paramDesc.SemanticName)==0)
return true;
}
return false;
}
State (ステ?ト) オブジェクトの作成
エンジン コ?ドを移植する?、最初にデフォルトのステ?ト オブジェクトのセットを使って、すべての Direct3D 9 デバイス レンダリングのステ?ト / テクスチャのステ?ト?定を?o?郡摔工毪?柯实膜扦埂¥长欷稀ⅴ欹螗昆辚螗挨尾痪吆悉蛏?袱丹蓼工?⒆瞍庋杆伽?I理を完了し、作?婴丹护敕椒à扦埂a幛恰⒀}合キ?を使って、使用されたステ?ト オブジェクトの数の最大再使用を可能にするステ?ト オブジェクト管理システムを???すればよいのです。
コンテンツを移植する
テクスチャ フォ?マット
Direct3D 9 DXT* テクスチャ フォ?マットのフォ?マット名は、?涓?丹臁 DXGI ヘッダ?名の一部となっています。 DXGI コンポ?ネントは、バッファ デ?タの割り当てと管理に?与します。 Direct3D 10 では、使いやすさを目的にラッパ??数を提供しています。そのため、 DXGI は、Direct3D 10では、サポ?トされるカラ? フォ?マット タイプの定?に?与しています。Direct3D 9 フォ?マット名との???辘蛞韵陇伪恧衰辚攻趣筏蓼埂
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 swizzle を使って 赤を他のコンポ?ネントに??して、 D3D9 の?I理を取得してください。
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 まで??加しますが、これはシェ?ダ コ?ドで?I理されます)
D3DFMT_YUY2 ?当なし
D3DFMT_G8R8_G8B8 DXGI_FORMAT_R8G8_B8G8_UNORM (DX9 では、デ?タは、 255.0f まで??加しますが、これはシェ?ダ コ?ドで?I理されます)
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/ ハ?ドウェアの?点からは同じです。唯一の相?点は、 「?\算?gみのアルファ」 で、アプリケ?ションによってトラックすることができ、?eのフォ?マットを必要としません。
D3DFMT_DXT3 DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
D3DFMT_DXT4 DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB 注意 : DXT1 および DXT2 は、API/ ハ?ドウェアの?点からは同じです。唯一の相?点は、 「?\算?gみのアルファ」 で、アプリケ?ションによってトラックすることができ、?eのフォ?マットを必要としません。
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 の?I理を取得してください。
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&#12539;&#12539;&#12539;255.f) が必要となる?龊悉稀 UNIT は、?g?にシェ?ダで float32 に??Qすることが可能です。
D3DDECLTYPE_SHORT2 DXGI_FORMAT_R16G16_SINT 注意 : シェ?ダは、 SINT ??を取得しますが、 Direct3D 9 スタイルの integral float が必要となる?龊悉稀 SINT は、?g?にシェ?ダで float32 に??Qすることが可能です。
D3DDECLTYPE_SHORT4 DXGI_FORMAT_R16G16B16A16_SINT 注意 : シェ?ダは、 SINT ??を取得しますが、 Direct3D 9 スタイルの integral float が必要となる?龊悉稀 SINT は、?g?にシェ?ダで float32 に??Qすることが可能です。
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
非?R?フォ?マットに??しては、 DXGI は、任意のピクセル フォ?マット パタ?ンへのサポ?トを制限しています。全非?R?フォ?マットは、 RGBA タイプでなければなりません。これは、既存のアセットに??して、ピクセル フォ?マットの?? (swizzling) が必要になるかもしれません。その?龊悉稀⒖赡埭扦ⅳ欷小ⅴ?榨楗ぅ笫虑?I理パスとして?С?I理を行うことをお?幛幛筏蓼埂
シェ?ダを移植する
Direct3D 10 シェ?ダは、 HLSL でオ?サリング
Direct3D 10 は、デバッグ目的にのみ、アセンブリ言?を使用するように制限しています。そのため、 Direct3D 9 で使われていた手???违ⅴ互螗芝 シェ?ダは、 HLSL に??Qする必要があります。
シェ?ダ シグネチャとリンケ?ジ
入力アセンブリ リンケ?ジと?点シェ?ダ入力シグネチャの要件については、すでに本ドキュメントで?明しました (上?参照) 。 Direct3D ランタイムは、シェ?ダ??のステ?ジからステ?ジへのリンケ?ジの要件をより??しくしていることに注意してください。この?涓?稀ⅴ伐З`ダのソ?スに影?を与え、ステ?ジ?のバインディングは、完全に Direct3D 9 で?述したように?幼鳏筏胜い?猡筏欷蓼护蟆R韵陇死?颏ⅳ菠蓼埂
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;
* 破?pした VS - PS リンケ?ジ-ピクセル シェ?ダが行列全体の情?螭虮匾?趣筏胜?趣狻ⅴ辚螗暴`ジは、完全な float4x3 を指定しなければなりません。
ステ?ジ?のセマンティクスは、完全に一致していなければなりませんが、タ?ゲット ステ?ジの入力は、出力される??のプリフィックスであってもかまわないということに注意してください。上?の例では、ピクセル シェ?ダは、 position と texcoord1 のみを入力として持つことはできますが、?序の制?のため position と texcoord2 のみを入力として持つことはできません。
HLSL シェ?ダ ステ?ジ リンケ?ジ
シェ?ダ?のリンケ?ジは、パイプライン中の以下の点で?生する可能性があります。
入力アセンブラから?点シェ?ダ
?点からピクセルシェ?ダ
?点からジオメトリ シェ?ダ
ジオメトリ シェ?ダからピクセル シェ?ダ
ジオメトリ シェ?ダからストリ?ム アウト
定数バッファ
Direct3D 9 からコンテンツの移植を?略化するために、エフェクト システムの外部の定数管理への最初のアプロ?チには、すべての必要な定数を含む?g一の定数バッファの作成が伴うかもしれません。予期されるアップデ?トの?度により、定数をバッファ内に?序付けることは、パフォ?マンスにとって重要です。この??成は、不必要な定数のセット数を最小に削?pします。
その他の注目すべき Direct3D 10 における相?点
入力としての整数
Direct3D 9 では、整数のデ?タ型への?g?の意味でのハ?ドウェア サポ?トはありませんでしたが、 Direct3D 10 では、ハ?ドウェアは、明示的な整数型をサポ?トします。?点バッファに不?有∈?悭签`タがある?龊稀 float 入力がなければなりません。そうでなければ、 「int」 が浮?有∈?悚??の ビットパタ?ン表?になります。また、ピクセル シェ?ダの??が整数??でないために??が const interp とマ?クされていない限り、整数入力は、ピクセル シェ?ダへの入力として?められません。
参照数のふるまいの?涓
Direct3D の前バ?ジョンとは?なり、多くの Set ?数がデバイス オブジェクトへの参照を保持しなくなっています。つまり、アプリケ?ションは、オブジェクトをパイプラインに??させておく必要がある限り、オブジェクトへの参照を保持するようにする必要があります。オブジェクトの ref count が 0 になる?、オブジェクトは、破??されるものとして、パイプラインから??解除されます。このリファレンス保持のスタイルは、弱い参照の保持として知られており、そのため、 Device オブジェクトにある各バインドのロケ?ションは、インタ?フェイス / オブジェクトへの弱い参照を保持します。明示的に?述されていない?龊稀ⅳ长韦栅毪蓼い稀ⅳ工伽皮 Set メソッドに?当すると考えられえるべきです。オブジェクトの破??でバインド ポイントが NULL になると、デバッグ レイヤ?が警告を?行します。 OMGetRenderTargets() のようなデバイスの Get メソッドへの呼び出しは、返されるオブジェクトの参照数を??やすことに注意してください。
???レベルのテスト
D3D9 API IDirect3DDevice9::TestCooperativeLevel の?C能は、 IDXGISwapChain: resent (英?) の Flags パラメ?タの DXGI_PRESENT_TEST フラッグを?定するのと?似しています。
http://www.microsoft.com/japan/msdn/directx/general/bb205073.aspx |
|