開発環境 Microsoft Visual Studio Express 2013 for Windows Desktop
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 Visual C++/Win32/Win32 プロジェクト
プロジェクト名 DxTest3
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト、SDLチェック

参考

DxTest3.cpp
#pragma comment(lib, "d3d11")
 
#include <d3d11.h>
 
#include <DirectXColors.h>
using namespace DirectX;
 
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
 
#define WIDTH 640
#define HEIGHT 480
 
const TCHAR appname[] = L"DxTest3";
 
// 外部変数
ID3D11Device *pDevice;
ID3D11DeviceContext *pDeviceContext;
IDXGISwapChain *pSwapChain;
ID3D11RenderTargetView *pRenderTargetView;
 
// 関数プロトタイプ宣言
HWND InitWnd(HINSTANCE hInstance);
HRESULT InitDevice(HWND hWnd);
void CleanupDevice();
void Render();
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
//==============================================================================
 
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
	HWND hWnd = InitWnd(hInstance);
	if (hWnd == NULL) {
		return 0;
	}
	if (FAILED(InitDevice(hWnd))) {
		return 0;
	}
	ShowWindow(hWnd, nCmdShow);
 
	MSG msg;
	do {
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			DispatchMessage(&msg);
		}
		else {
			Render();
		}
	} while (msg.message != WM_QUIT);
 
	CleanupDevice();
	return msg.wParam;
}
 
HWND InitWnd(HINSTANCE hInstance)
{
	WNDCLASSEX wc = { sizeof wc };
	wc.lpfnWndProc = WndProc;
	wc.hInstance = hInstance;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.lpszClassName = appname;
	if (RegisterClassEx(&wc) == 0) {
		return 0;
	}
 
	DWORD dwStyle = WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME;
	RECT rc = { 0, 0, WIDTH, HEIGHT };
	AdjustWindowRect(&rc, dwStyle, FALSE);
 
	HWND hWnd = CreateWindow(appname, appname, dwStyle,
		CW_USEDEFAULT, 0, rc.right - rc.left, rc.bottom - rc.top,
		NULL, NULL, hInstance, NULL);
	return hWnd;
}
 
HRESULT InitDevice(HWND hWnd)
{
	//----------------------------------------------------------------------
	// デバイス、デバイスコンテキスト、スワップチェイン
 
	D3D_DRIVER_TYPE DriverType[] = {
		D3D_DRIVER_TYPE_HARDWARE,
//		D3D_DRIVER_TYPE_WARP,
		D3D_DRIVER_TYPE_REFERENCE,
	};
 
	D3D_FEATURE_LEVEL FeatureLevels[] = {
		D3D_FEATURE_LEVEL_11_1,
		D3D_FEATURE_LEVEL_11_0,
//		D3D_FEATURE_LEVEL_10_1,
//		D3D_FEATURE_LEVEL_10_0,
	};
 
	DXGI_SWAP_CHAIN_DESC sd = { 0 };
	sd.BufferCount = 1;
	sd.BufferDesc.Width = WIDTH;
	sd.BufferDesc.Height = HEIGHT;
	sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	sd.BufferDesc.RefreshRate.Numerator = 60;
	sd.BufferDesc.RefreshRate.Denominator = 1;
	sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
	sd.OutputWindow = hWnd;
	sd.SampleDesc.Count = 1;
	sd.SampleDesc.Quality = 0;
	sd.Windowed = TRUE;
 
	HRESULT hr;
	for (int i = 0; i < ARRAYSIZE(DriverType); i++) {
		D3D_FEATURE_LEVEL FeatureLevel;
		hr = D3D11CreateDeviceAndSwapChain(NULL, DriverType[i], NULL, 0,
			FeatureLevels, ARRAYSIZE(FeatureLevels), D3D11_SDK_VERSION, &sd,
			&pSwapChain, &pDevice, &FeatureLevel, &pDeviceContext);
		if (SUCCEEDED(hr)) break;
	}
	if (FAILED(hr)) {
		return hr;
	}
 
	//----------------------------------------------------------------------
	// レンダーターゲット
 
	ID3D11Texture2D *pBackBuffer;
	hr = pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
 
	hr = pDevice->CreateRenderTargetView(pBackBuffer, NULL, &pRenderTargetView);
	pBackBuffer->Release();
 
	// output-merger
	pDeviceContext->OMSetRenderTargets(1, &pRenderTargetView, NULL);
 
	//----------------------------------------------------------------------
	// ビューポート
 
	D3D11_VIEWPORT vp = { 0 };
	vp.Width = WIDTH;
	vp.Height = HEIGHT;
	vp.MinDepth = 0.0f;
	vp.MaxDepth = 1.0f;
 
	// rasterizer stage
	pDeviceContext->RSSetViewports(1, &vp);
 
	return hr;
}
 
void CleanupDevice()
{
	if (pDeviceContext) {
		pDeviceContext->ClearState();
		pDeviceContext->Flush();
	}
	SAFE_RELEASE(pRenderTargetView);
	SAFE_RELEASE(pSwapChain);
	SAFE_RELEASE(pDeviceContext);
	SAFE_RELEASE(pDevice);
}
 
void Render()
{
	pDeviceContext->ClearRenderTargetView(pRenderTargetView, Colors::CornflowerBlue);
	pSwapChain->Present(0, 0);
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_KEYDOWN:
		switch (wParam) {
		case VK_ESCAPE:
			DestroyWindow(hWnd);
			break;
		}
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
最終更新:2014年06月06日 21:32