//-----------------------------------------------------------------------------
// File: CreateDevice.cpp
//
// Desc: D3D 디바이스를 생성하고, 이를 사용해서 화면을 지우는 방법에 대해서
// 공부하게 된다.
//
//-----------------------------------------------------------------------------
// Direct3D9를 사용하기 위한 헤더
#include <d3d9.h>
//-----------------------------------------------------------------------------
// 전역 변수
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 렌더링에 사용될 D3D 디바이스
//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: 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. 디폴트 비디오카드를 사용한다. (대부분은 비디오카드가 한 개다 )
// 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;
}
//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: 초기화된 객체들을 소거한다.
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if( g_pD3D != NULL)
g_pD3D->Release();
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: 화면 그리기
//-----------------------------------------------------------------------------
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
// 후면 버퍼를 파란색으로 지운다.
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 );
}
//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: 윈두우 프로시저
//-----------------------------------------------------------------------------
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 );
}
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: 이 프로그램의 시작점
//-----------------------------------------------------------------------------
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;
}