/**-----------------------------------------------------------------------------
* \brief 디바이스 생성
* 파일: CreateDevice.cpp
*
* 설명: D3D 디바이스를 생성하고, 이를 사용해서 화면을 지우는 방법에 대해서
* 공부하게 된다.
*
**-----------------------------------------------------------------------------
*/
/// Direct3D9를 사용하기 위한 헤더
#include <d3d9.h>
/**-----------------------------------------------------------------------------
* 전역변수
*------------------------------------------------------------------------------
*/
LPDIRECT3D9 g_pD3D = NULL; /// D3D 디바이스를 생성할 D3D객체변수
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; /// 렌더링에 사용될 D3D디바이스
/**-----------------------------------------------------------------------------
* Direct3D 초기화
*------------------------------------------------------------------------------
*/
HRESULT InitD3D(HWND hWnd)
{
/// 디바이스를 생성하기위한 D3D객체 생성
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp; /// 디바이스 생성을 위한 구조체
ZeroMemory(&d3dpp, sizeof(d3dpp)); /// 반드시 ZeroMemory()함수로 미리 구조체를 깨끗이 지워야 한다.
d3dpp.Windowed = TRUE; /// 창모드로 생성
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; /// 가장 효율적인 SWAP효과
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; /// 현재 바탕화면 모드에 맞춰서 후면버퍼를 생성
/// 디바이스를 다음과 같은 설정으로 생성한다.
/// 1. 디폴트 비디오카드를 사용(대부분은 비디오카드가 1개 이다.)
/// 2. HAL디바이스를 생성한다.(HW가속장치를 사용하겠다는 의미)
/// 3. 정점처리는 모든 카드에서 지원하는 SW처리로 생성한다.(HW로 생성할경우 더욱 높은 성능을 낸다.)
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}
/// 디바이스 상태정보를 처리할경우 여기에서 한다.
return S_OK;
}
/**-----------------------------------------------------------------------------
* 초기화된 객체들을 소거한다.
*------------------------------------------------------------------------------
*/
VOID Cleanup()
{
if (g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if (g_pD3D != NULL)
g_pD3D->Release();
}
/**-----------------------------------------------------------------------------
* 화면을 그린다.
*------------------------------------------------------------------------------
*/
VOID Render()
{
if (NULL == g_pd3dDevice)
return;
/// 후면버퍼를 파란색(0,0,255)으로 지운다.
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
/// 렌더링 시작
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
/// 실제 렌더링 명령들이 나열될 곳
/// 렌더링 종료
g_pd3dDevice->EndScene();
}
/// 후면버퍼를 보이는 화면으로!
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
/**-----------------------------------------------------------------------------
* 윈도우 프로시져
*------------------------------------------------------------------------------
*/
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd, NULL);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
/**-----------------------------------------------------------------------------
* 이 프로그램의 시작점
*------------------------------------------------------------------------------
*/
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
/// 윈도우 클래스 등록
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"D3D Tutorial", NULL };
RegisterClassEx(&wc);
/// 윈도우 생성
HWND hWnd = CreateWindow("D3D Tutorial", "D3D Tutorial 01: CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
/// Direct3D 초기화
if (SUCCEEDED(InitD3D(hWnd)))
{
/// 윈도우 출력
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
/// 메시지 루프
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
/// 등록된 클래스 소거
UnregisterClass("D3D Tutorial", wc.hInstance);
return 0;
}
'Programming > DirectX' 카테고리의 다른 글
Additional Dependencies (0) | 2015.06.20 |
---|