Direct 31 D 11-1初期化
4656 ワード
何かを使う前に、車の給油、携帯電話の充電など、彼を初期化する必要があります.そこで私たちは普段の符号化習慣を取って、次のコードを書こうとしました.
Direct3D11 _direct3d11;
実際には、Direct 31 D 11をこのように初期化することはできません.Direct 3 D APIを実行するためのデバイスを作成する必要があります.
Direct 3 Dデバイスは、リソース管理、レンダリング、グラフィックスインタラクションを担当し、11でこのデバイスは2つの部分に分解されます.
デバイスリソースの作成
devicecontextレンダリングを実行する
HRESULT WINAPI D3D11CreateDevice(
__in_opt IDXGIAdapter* pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
CONST D3D_FEATURE_LEVEL* pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
__out_opt ID3D11Device** ppDevice,
__out_opt D3D_FEATURE_LEVEL* pFeatureLevel,
__out_opt ID3D11DeviceContext** ppImmediateContext
);
最初のパラメータはvideo adapterを指すポインタが必要ですが、このようなポインタは得られません.そこでこのパラメータをnullptrに設定すると、APIはデフォルトのグラフィックスカードからDeviceとDeviceContextを作成します.
2番目のパラメータは、D 3 Dがハードウェア上で動作するかソフトウェア上で動作するかを示す必要があります.最初のパラメータはデフォルトグラフィックスを指すため、DriverType=D 3 D_DRIVER_TYPE_HARDWARE
3番目のパラメータは明らかに0で、4番目のパラメータはあなたのコードがReleaseかDebugかによって、明らかです.我々はDebugモードで(このモードは大量の呼び出しエラーを提示することができる)Flags=D 3 D 11_CREATE_DEVICE_DEBUG
(win 8.1にアップグレードし、VS 2012ではこのflagsは使用できません)
SDKVersion = D3D11_SDK_VERSION.次の3つのパラメータは出力に使用されます.注意すべきはpFeatureLevelです.このパラメータはDeviceの特性レベルを受け入れるために使用されます.例えば、デフォルトのグラフィックスカードはDXのバージョンをサポートしています.彼らはそれぞれ可能です.
enum D3D_FEATURE_LEVEL
{ D3D_FEATURE_LEVEL_9_1 = 0x9100,
D3D_FEATURE_LEVEL_9_2 = 0x9200,
D3D_FEATURE_LEVEL_9_3 = 0x9300,
D3D_FEATURE_LEVEL_10_0 = 0xa000,
D3D_FEATURE_LEVEL_10_1 = 0xa100,
D3D_FEATURE_LEVEL_11_0 = 0xb000
} D3D_FEATURE_LEVEL;
(これに対応するpFeatureLevelsはCONST D 3 D_FEATURE_LEVEL*pFeatureLevels UINT FeatureLevelsであり、この2つのパラメータはテストが必要な特性を示し、0であればすべての特性をテストすることを示す.そして最大サポート可能な特性をpFeatureLevelsに戻す)
このFeatureを見くびってはいけないLevel、彼は機知に富んで1つのゲームのプログラミングが異なるハードウェアの問題に直面することを解決して、ゲームの開発者はこのAPIがグラフィックカードに支持されるかどうかを保証することができなくて、以前のDirect 3 Dプログラミングの中で、あなたは重い設備の列挙(各グラフィックカードの性能を検出する)を見ることができます.もちろん設備の列挙は簡単ではありませんが、開発者は保証されています.
「このグラフィックスカードがDX 11をサポートしている場合、彼はDX 11のすべての特性をサポートします」
母はもう相手のビデオカードがサポートされていないことを心配する必要はありません.最後のコードはこう見えます
UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
D3D11CreateDevice(
nullptr, //default adapter
D3D_DRIVER_TYPE_HARDWARE,
nullptr, //no software device
createDeviceFlags,
0,0, //default feature level array
D3D11_SDK_VERSION,
&md3dDevice,
&featureLevel,
&md3dImmediateContext
);
デバイスを作成することは、完了を意味するものではありません.たとえば、Direct 3 Dレンダリングはどこへ行くのか、buffを提供する必要があります.よりスムーズなアニメーションを生成するために.DirectXでは,交換チェーンとページ置換技術を用いた.僕らはいつも
Drawは画面から離れたbuffに入り、2つのbuffを置き換えて画面に描画します.プログラム構造はこうです.バックグラウンドキャッシュで描画 バックグラウンドキャッシュのコンテンツをコミット は、ステップ1 に戻る.
はい、これは交換チェーンを作成する必要があることを意味します.コードは次のとおりです.
DXGI_SWAP_CHAIN_DESC sd;//交換チェーンのプロパティを説明するために使用される
sd.BufferDesc.Width = mClientWidth;//幅と高さ
sd.BufferDesc.Height = mClientHeight;
sd.BufferDesc.RefreshRate.Numerator = 60;//HZ更新
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;//ピクセルフォーマット
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;//レンダリングターゲットとして
sd.BufferCount = 1;
sd.OutputWindow = mhMainWnd;
sd.Windowed = true;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
IDXGIDevice* dxgiDevice = 0;
HR(md3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice));
//インタフェース取得、COM参照
IDXGIAdapter* dxgiAdapter = 0;
HR(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter));
IDXGIFactory * dxgiFactory = 0;
HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory));
HR(dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain));
次にdemoチュートリアルをリリースします.このチュートリアルでは交換チェーンは作成されていませんが、簡単なグラフィックス列挙とグラフィックスとインタラクティブな内容があり、HLSLコードが導入されています.
Direct3D11 _direct3d11;
実際には、Direct 31 D 11をこのように初期化することはできません.Direct 3 D APIを実行するためのデバイスを作成する必要があります.
Direct 3 Dデバイスは、リソース管理、レンダリング、グラフィックスインタラクションを担当し、11でこのデバイスは2つの部分に分解されます.
デバイスリソースの作成
devicecontextレンダリングを実行する
Direct3D11 , ( )ID3D11Device * ,ID3D11DeviceContext *( , COM), , API : http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082(v=vs.85).aspx
HRESULT WINAPI D3D11CreateDevice(
__in_opt IDXGIAdapter* pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
CONST D3D_FEATURE_LEVEL* pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
__out_opt ID3D11Device** ppDevice,
__out_opt D3D_FEATURE_LEVEL* pFeatureLevel,
__out_opt ID3D11DeviceContext** ppImmediateContext
);
最初のパラメータはvideo adapterを指すポインタが必要ですが、このようなポインタは得られません.そこでこのパラメータをnullptrに設定すると、APIはデフォルトのグラフィックスカードからDeviceとDeviceContextを作成します.
2番目のパラメータは、D 3 Dがハードウェア上で動作するかソフトウェア上で動作するかを示す必要があります.最初のパラメータはデフォルトグラフィックスを指すため、DriverType=D 3 D_DRIVER_TYPE_HARDWARE
3番目のパラメータは明らかに0で、4番目のパラメータはあなたのコードがReleaseかDebugかによって、明らかです.我々はDebugモードで(このモードは大量の呼び出しエラーを提示することができる)Flags=D 3 D 11_CREATE_DEVICE_DEBUG
(win 8.1にアップグレードし、VS 2012ではこのflagsは使用できません)
SDKVersion = D3D11_SDK_VERSION.次の3つのパラメータは出力に使用されます.注意すべきはpFeatureLevelです.このパラメータはDeviceの特性レベルを受け入れるために使用されます.例えば、デフォルトのグラフィックスカードはDXのバージョンをサポートしています.彼らはそれぞれ可能です.
enum D3D_FEATURE_LEVEL
{ D3D_FEATURE_LEVEL_9_1 = 0x9100,
D3D_FEATURE_LEVEL_9_2 = 0x9200,
D3D_FEATURE_LEVEL_9_3 = 0x9300,
D3D_FEATURE_LEVEL_10_0 = 0xa000,
D3D_FEATURE_LEVEL_10_1 = 0xa100,
D3D_FEATURE_LEVEL_11_0 = 0xb000
} D3D_FEATURE_LEVEL;
(これに対応するpFeatureLevelsはCONST D 3 D_FEATURE_LEVEL*pFeatureLevels UINT FeatureLevelsであり、この2つのパラメータはテストが必要な特性を示し、0であればすべての特性をテストすることを示す.そして最大サポート可能な特性をpFeatureLevelsに戻す)
このFeatureを見くびってはいけないLevel、彼は機知に富んで1つのゲームのプログラミングが異なるハードウェアの問題に直面することを解決して、ゲームの開発者はこのAPIがグラフィックカードに支持されるかどうかを保証することができなくて、以前のDirect 3 Dプログラミングの中で、あなたは重い設備の列挙(各グラフィックカードの性能を検出する)を見ることができます.もちろん設備の列挙は簡単ではありませんが、開発者は保証されています.
「このグラフィックスカードがDX 11をサポートしている場合、彼はDX 11のすべての特性をサポートします」
母はもう相手のビデオカードがサポートされていないことを心配する必要はありません.最後のコードはこう見えます
UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
D3D11CreateDevice(
nullptr, //default adapter
D3D_DRIVER_TYPE_HARDWARE,
nullptr, //no software device
createDeviceFlags,
0,0, //default feature level array
D3D11_SDK_VERSION,
&md3dDevice,
&featureLevel,
&md3dImmediateContext
);
デバイスを作成することは、完了を意味するものではありません.たとえば、Direct 3 Dレンダリングはどこへ行くのか、buffを提供する必要があります.よりスムーズなアニメーションを生成するために.DirectXでは,交換チェーンとページ置換技術を用いた.僕らはいつも
Drawは画面から離れたbuffに入り、2つのbuffを置き換えて画面に描画します.プログラム構造はこうです.
はい、これは交換チェーンを作成する必要があることを意味します.コードは次のとおりです.
DXGI_SWAP_CHAIN_DESC sd;//交換チェーンのプロパティを説明するために使用される
sd.BufferDesc.Width = mClientWidth;//幅と高さ
sd.BufferDesc.Height = mClientHeight;
sd.BufferDesc.RefreshRate.Numerator = 60;//HZ更新
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;//ピクセルフォーマット
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;//レンダリングターゲットとして
sd.BufferCount = 1;
sd.OutputWindow = mhMainWnd;
sd.Windowed = true;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
IDXGIDevice* dxgiDevice = 0;
HR(md3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice));
//インタフェース取得、COM参照
IDXGIAdapter* dxgiAdapter = 0;
HR(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter));
IDXGIFactory * dxgiFactory = 0;
HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory));
HR(dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain));
次にdemoチュートリアルをリリースします.このチュートリアルでは交換チェーンは作成されていませんが、簡単なグラフィックス列挙とグラフィックスとインタラクティブな内容があり、HLSLコードが導入されています.