Nanashi-soft○プログラマ専用○DirectX11開発○
#include <windows.h>pragma onceやpragma commentって何? と思いますが(私も)
#include <tchar.h>
#include <d3d11.h>
#pragma once
#pragma comment(lib, "d3d11.lib")
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }それでは,さぁ始めましょうか('-'*)
//ウィンドウをクリエイトの直後から長いよ! MSDNの説明読むのに疲れたよ!
//デバイスの生成
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;
}