#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"d3dx11.lib")
#include <d3dx11.h>
//定数定義
#define WINDOW_WIDTH 320 //ウィンドウ幅
#define WINDOW_HEIGHT 240 //ウィンドウ高さ
//グローバル変数
HWND hWnd=NULL;
ID3D11Device* Device = NULL;
ID3D11DeviceContext* DeviceContext=NULL;
IDXGISwapChain* SwapChain = NULL;
ID3D11RenderTargetView* RenderTargetView = NULL;
//ダイレクト3Dの初期化関数
HRESULT InitD3D(HWND hWnd)
{
// デバイスとスワップチェーンの作成
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory( &sd, sizeof(sd) );
sd.BufferCount = 1; //バックバッファの数
sd.BufferDesc.Width = WINDOW_WIDTH; //バッファの幅
sd.BufferDesc.Height = WINDOW_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;
D3D_FEATURE_LEVEL FeatureLevel = D3D_FEATURE_LEVEL_11_0;
if( FAILED( D3D11CreateDeviceAndSwapChain( NULL, D3D_DRIVER_TYPE_REFERENCE,
NULL,0,
&FeatureLevel,1,
D3D11_SDK_VERSION, &sd, &SwapChain, &Device
,NULL,&DeviceContext) ) )
{
return FALSE;
}
//レンダーターゲットビューの作成
ID3D11Texture2D *BackBuffer;
SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D
),(LPVOID*)&BackBuffer);
Device->CreateRenderTargetView( BackBuffer, NULL, &RenderTargetView
);
BackBuffer->Release();
DeviceContext->OMSetRenderTargets(1, &RenderTargetView,NULL);
//ビューポートの設定
D3D11_VIEWPORT vp;
vp.Width = WINDOW_WIDTH;
vp.Height = WINDOW_HEIGHT;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
DeviceContext->RSSetViewports( 1, &vp );
return S_OK;
}
//レンダリング
VOID Render()
{
float ClearColor[4] = {1,1,1,1 }; // クリア色作成 RGBAの順
DeviceContext->ClearRenderTargetView( RenderTargetView, ClearColor
);//画面クリア
SwapChain->Present( 0, 0 );//画面更新(バックバッファをフロントバッファに)
}
//終了時解放処理
VOID Cleanup()
{
SwapChain->Release();
RenderTargetView->Release();
DeviceContext->Release();
Device->Release();
}
//メッセージプロシージャ
LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY://終了時
Cleanup();
PostQuitMessage(0);
break;
}
return DefWindowProc (hWnd, msg, wParam, lParam);
}
//メイン関数
INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT
iCmdShow)
{
//ウインドウクラスの登録
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L"Window1", NULL };
RegisterClassEx( &wc );
//タイトルバーとウインドウ枠の分を含めてウインドウサイズを設定
RECT rect;
SetRect(&rect,0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
rect.right=rect.right-rect.left;
rect.bottom=rect.bottom-rect.top;
rect.top=0;
rect.left=0;
//ウインドウの生成
hWnd = CreateWindow( L"Window1", L"Hello DirectX11 World !!",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rect.right,
rect.bottom,
NULL, NULL, wc.hInstance, NULL );
MSG msg;
ZeroMemory(&msg,sizeof(msg));
//Direct3D初期化
if(SUCCEEDED(InitD3D(hWnd)))
{
//ウインドウ表示
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
while(msg.message!=WM_QUIT)
{
if( PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
//終了
return 0;
}
|