#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);
}