Programming/DirectX2015. 6. 20. 12:28

/**-----------------------------------------------------------------------------

* \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
Posted by 레라리