카테고리 Archives: C++

[DX9] 1.디바이스의 작성 2 – Direct3D 의 초기화

CreateDevice 샘플 프로젝트는 윈도우 작성후에, WinMain 로부터 호출된  InitD3D 애플리케이션 정의함수 중에서 Direct3D 초기화를 실행합니다. 애플리케이션 윈도우의 적성후에는 언제라도, 신을 렌더링하기 위해 사용하는 Direct3D 오브젝트를 초기화 할 수 있습니다. 이 프로세스는 오브젝트를 작성하고 프레젠테이션 파라메터를 설정하고 마지막으로 Direct3D 디바이스를 작성합니다.

Direct3D 오브젝트의 작성 후 IDirect3D9::CreateDevice 메소드를 사용해 디바이스를 작성하고 디바이스, 타입, 모드 등의 열거 할 수 있습니다.

if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
	return E_FAIL;

Direct3DCreate9 에 넘겨지는 파라메터는 언제나 D3D_SDK_VERSION 뿐입니다. 이것은 바른 헤더 파일이 사용되고 있다는 것을 Direct3D에 통지합니다. 이 값은 헤더 또는 그 외의 변경에 의한 애플리케이션을 다시 빌드할 필요가 생길때마다 인클리멘트됩니다. 버전이 일치하지 않는 경우 Direct3DCreate9은 실패합니다.

D3DPRESENT_PARAMETERS 의 필드를 채워서 3D 애플리케이션의 동작방법을 지정할 수 있습니다. CreateDevice 샘플 프로젝트에서는 Windowed 가 TRUE, SwapEffect가 D3DSWAPEFFECT_DISCARD, BackBufferFormat가 D3DFMT_UNKONWN에 설정됩니다.

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

마지막 순서로 다음 코드의 예에 나타낸 것처럼 IDirect3D9::CreateDevice 메소드를 사용해 Direct3D 디바이스를 작성합니다.

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  &d3dpp, &g_pd3dDevice ) ) )

상기 샘플코드는 D3DADAPTER_DEFAULT 플래그를 사용해서 디폴트 어댑터를 가진 디바이스를 작성합니다. 통상, 시스템은 복수의 그래픽 하드웨어 카드가 인스톨 되어있지 않은 한, 단일 어댑터만을 가집니다. DeviceType 파라메터에 D3DDEVTYPE_HAL을 지정하면, 소프트웨어 디바이스에 의한 하드웨어 디바이스 쪽이 우선됩니다. 이 샘플코드에서는 D3DCREATE_SOFTWARE_VERTEXPROCESSING 를 사용해서, 시스템에 소프트웨어 정점처리를 사용하도록 지시하고 있습니다. D3DCREATE_HARDWARE_VERTEXPROCESSING 를 지정해, 시스템의 하드웨어 정점처리를 사용하도록 하는 경우에는 하드웨어 정점처리 퍼포먼스가 대폭 향상하는 점에 주의해 주십시오.

이것으로 Direct3D 오브젝터는 초기화 되었습니다. 다음에는 「3 – 시스템 메시지의 처리」에서 설명하고 있는 것처럼, 시스템 메시지를 처리하는 메카니즘의 확보를 수행합니다.

[DX9] 1.디바이스의 작성 1 – 윈도우 작성

Windows 애플리케이션이 실행될 때에 최초로 처리되어야할 것은 유저에게 표시하는 애플리케이션 윈도우를 작성하는 것입니다. 이것을 실행하려면 CreateDevice 샘플 프로젝트의  WinMain 함수로 실행을 개시합니다. 다음의 샘플 코드는 윈도우의 초기화를 실행합니다.

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
	// Register the window class.
	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
	GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
	"Direct3D Tutorial", NULL };

	RegisterClassEx( &wc );

	// Create the application's window.
	HWND hWnd = CreateWindow( "Direct3D Tutorial", "Direct3D Tutorial 01: CreateDevice",
	WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
	GetDesktopWindow(), NULL, wc.hInstance, NULL );

상기의 샘플코드는 표준 Windows 프로그래밍입니다. 샘플에서는 최초로 “Direct3D Tutorial”이라는 윈도우 클래스를 정의해 등록하고 있습니다. 클래스를 등록한 뒤 샘플 코드는 폭 300픽셀, 높이 300픽셀의 클라이언트 영역을 가지고 등록한 클래스를 사용하는 기본적인 최상위 윈도우를 작성합니다. 이 윈도우에는 메뉴와 자식 윈도우는 없습니다. 샘플에서는 WS_OVERLAPPEDWINDOW 윈도우 스타일을 사용해 윈도우 애플리케이션에 공통의 [최소화], [최대화], 그리고 [닫기] 버튼을 가진 윈도우를 작성합니다.(샘플이 풀스크린 모드로 실행될 경우, 추천되는 윈도우 스타일은 WS_EX_TOPMOST입니다. 이것은 작성된 윈도우를 최상위가 아닌 모든 윈도우 위에 배치해 윈도우가 비 액티브인 경우에도 최상위에 남아있도록 지정합니다.) 윈도우가 작성되면 표준의 Win32함수를 호출해 윈도우 표시를 갱신합니다.

애플리케이션 윈도우가 준비되었으면 「2 – Direct3D의 초기화」에서 설명하는대로 필수 Direct3D 오브젝트의 셋업을 개시할 수 있습니다.

DirectX Software Development Kit / 튜토리얼/ Direct3D 튜토리얼/ 튜토리얼 1: 디바이스의 작성 도움말에서