Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -DirectX11を初期化する-

まず始めに,DirectX用のヘッダーを追加します
プログラムの先頭はこんな感じになります
#include <windows.h>
#include <tchar.h>
#include <d3d11.h>

#pragma once
#pragma comment(lib, "d3d11.lib")
pragma onceやpragma commentって何? と思いますが(私も)
そもそも#pragmaと言うのは『環境依存命令ですよ』と言うことなので,深く考えずに
VC++2010では必要ライブラリはこうかくんだ。と思った方が利口です(*'-')
(gccだとMakefileに書くことをCソース中に書くんでしょ?)

それと,なんか流行ってるっぽい,リリースマクロも書いておきます
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
それでは,さぁ始めましょうか('-'*)
前回書いたShowWindowを消して,そこから記述します
//ウィンドウをクリエイトの直後から
//デバイスの生成
HRESULT hr;
ID3D11Device* hpDevice = NULL;
ID3D11DeviceContext* hpDeviceContext = NULL;
hr = D3D11CreateDevice(
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
0,
NULL,
0,
D3D11_SDK_VERSION,
&hpDevice,
NULL,
&hpDeviceContext);
if FAILED( hr )
{
MessageBox(hWnd, _T("D3D11CreateDevice"), _T("Err"), MB_ICONSTOP);
goto End;
}

//インターフェース取得
IDXGIDevice1* hpDXGI = NULL;
if(FAILED(hpDevice->QueryInterface(__uuidof(IDXGIDevice1), (void**)&hpDXGI))){
MessageBox(hWnd, _T("QueryInterface"), _T("Err"), MB_ICONSTOP);
goto End;
}

//アダプター取得
IDXGIAdapter* hpAdapter = NULL;
if(FAILED(hpDXGI->GetAdapter(&hpAdapter))){
MessageBox(hWnd, _T("GetAdapter"), _T("Err"), MB_ICONSTOP);
goto End;
}

//ファクトリー取得
IDXGIFactory* hpDXGIFactory = NULL;
hpAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&hpDXGIFactory);
if(hpDXGIFactory == NULL){
MessageBox(hWnd, _T("GetParent"), _T("Err"), MB_ICONSTOP);
goto End;
}

//ALT+Enterでフルスクリーンを許可する
if(FAILED(hpDXGIFactory->MakeWindowAssociation(hWnd, 0))){
MessageBox(hWnd, _T("MakeWindowAssociation"), _T("Err"), MB_ICONSTOP);
goto End;
}

//スワップチェイン作成
IDXGISwapChain* hpDXGISwpChain = NULL;
DXGI_SWAP_CHAIN_DESC hDXGISwapChainDesc;
hDXGISwapChainDesc.BufferDesc.Width = 1980;
hDXGISwapChainDesc.BufferDesc.Height = 1080;
hDXGISwapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
hDXGISwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
hDXGISwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
hDXGISwapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
hDXGISwapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
hDXGISwapChainDesc.SampleDesc.Count = 1;
hDXGISwapChainDesc.SampleDesc.Quality = 0;
hDXGISwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
hDXGISwapChainDesc.BufferCount = 1;
hDXGISwapChainDesc.OutputWindow = hWnd;
hDXGISwapChainDesc.Windowed = TRUE;
hDXGISwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
hDXGISwapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
if(FAILED(hpDXGIFactory->CreateSwapChain(hpDevice, &hDXGISwapChainDesc, &hpDXGISwpChain))){
MessageBox(hWnd, _T("CreateSwapChain"), _T("Err"), MB_ICONSTOP);
goto End;
}

//そのスワップチェインのバックバッファ取得
ID3D11Texture2D* hpBackBuffer = NULL;
if(FAILED(hpDXGISwpChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&hpBackBuffer))){
MessageBox(hWnd, _T("SwpChain GetBuffer"), _T("Err"), MB_ICONSTOP);
goto End;
}

//そのバックバッファから描画ターゲット生成
ID3D11RenderTargetView *hpRenderTargetView = NULL;
if(FAILED(hpDevice->CreateRenderTargetView(hpBackBuffer, NULL, &hpRenderTargetView))){
MessageBox(hWnd, _T("CreateRenderTargetView"), _T("Err"), MB_ICONSTOP);
goto End;
}

//更にその描画ターゲットをコンテキストに設定
hpDeviceContext->OMSetRenderTargets(1, &hpRenderTargetView, NULL);

//ビューポート設定
D3D11_VIEWPORT vp;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
vp.Width = 1920;
vp.Height = 1080;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
hpDeviceContext->RSSetViewports(1, &vp);

//メインループ
MSG hMsg;
while(true){
while(PeekMessageW(&hMsg, NULL, 0, 0, PM_REMOVE)){
if(hMsg.message == WM_QUIT){
goto End;
}
TranslateMessage(&hMsg);
DispatchMessage(&hMsg);
}

float ClearColor[] = {0.0f, 0.0f, 1.0f, 1.0f};
hpDeviceContext->ClearRenderTargetView(hpRenderTargetView, ClearColor);
hpDXGISwpChain->Present(0, 0);
}

End:
//ポインタで生成したものはリリースする必要がある
//どの変数か識別し易いように,hpで始めてある
SAFE_RELEASE(hpRenderTargetView);
SAFE_RELEASE(hpBackBuffer);
SAFE_RELEASE(hpDXGISwpChain);
SAFE_RELEASE(hpDXGIFactory);
SAFE_RELEASE(hpAdapter);
SAFE_RELEASE(hpDXGI);
SAFE_RELEASE(hpDeviceContext);
SAFE_RELEASE(hpDevice);

return 0;
}
長いよ! MSDNの説明読むのに疲れたよ!
メンドウだから 1980x1080(フルHD)固定にしちゃったよ(ぉ
立体視(3D Vision)用プログラムだから,それでいいよね?


TOPプログラマ専用DirectX11開発

Melonbooks DL