본문 바로가기
Lib/DirectX

DirectX 기본 코드 구조.

by KingCat 2011. 11. 9.
// D3D 초기화를 위해 준비한 헤더를 포함
#include "d3dUtility.h"

// 장치를 위한 전역 변수를 인스턴스화
IDirect3DDevice9* Device = 0; 

// 프레임웍 함수를 구현 (기본구조 : Setup, Cleanup, Display)
bool Setup()
{
	return true;
}

void Cleanup()
{
	
}

bool Display(float timeDelta)
{
	// 후면 버퍼를 소거하고 깊이/스텐실 버퍼를 각각 검은색과 1.0으로 초기화하는 Clear 메서드를 호출.
	if( Device )
	{
		// 첫번째 인자 : pRects 배열 내의 사각형의 수
		// 두번째 인자 : 소거하려는 화면 사각형의 배열, 표면의 특정 영역만을 소거할 수 있도록 해준다.
		// 세번째 인자 : 어떤 표면을 소거할지를 지정.
		// D3DCLEAR_TARGET - 렌더 대상 표면. 보통은 후면 버퍼.
		// D3DCLEAR_ZBUFFER - 깊이 버퍼
		// D3DCLEAR_STENCIL - 스텐실 버퍼
		// 네번째 인자 : 렌더 대상을 소거할 색상
		// 다섯번째 인자 : 깊이 버퍼(z-버퍼)에 지정하고자 하는 값
		// 여섯번째 인자 : 스텐실 버퍼에 지정하고자 하는 값
		Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);

		// 소거 후 후면 버퍼 시연
		Device->Present(0, 0, 0, 0);
	}
	return true;
}

//
// 윈도우 프로시저 메서드
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch( msg )
	{
	case WM_DESTROY:
		::PostQuitMessage(0);
		break;
		
	case WM_KEYDOWN:
		// ESC 키를 눌러 창을 종료할 수 있게 함.
		if( wParam == VK_ESCAPE )
			::DestroyWindow(hwnd);
		break;
	}
	return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

//
// WinMain
//
int WINAPI WinMain(HINSTANCE hinstance,
				   HINSTANCE prevInstance, 
				   PSTR cmdLine,
				   int showCmd)
{
	// 메인 디스플레이 윈도우와 Direct3D를 초기화한다.
	if(!d3d::InitD3D(hinstance,
		640, 480, true, D3DDEVTYPE_HAL, &Device))
	{
		::MessageBox(0, "InitD3D() - FAILED", 0, 0);
		return 0;
	}
		
	// Setup 함수를 호출하여 애플리케이션 사전 준비를 수행.
	if(!Setup())
	{
		::MessageBox(0, "Setup() - FAILED", 0, 0);
		return 0;
	}

	// Display를 디스플레이 함수로 이용하여 메시지 루프에 진입.
	d3d::EnterMsgLoop( Display );

	// 애플리케이션을 정리하고 최종적으로 IDirect3DDevice9 객체를 해제.
	Cleanup();

	Device->Release();

	return 0;
}