D3D Init

2022. 8. 5. 22:14Public/GraphicsAPI

먼저 d3dUtility.h를 포함시키고, 장치를 위한 전역 변수를 인스턴스화

#include "d3dUtility.h"
IDirect3DDevice9* Device = 0;

 

해당 예제에서는 자원을 할당할 필요가 없으므로 Setup과 Cleanup 메서드는 비어뒀다.

//*******************공통***********************
bool Setup() { return true; } //자원의 할당이나 장치 특성의 확인, 애플리케이션 상태의 설정 등과 같이 예제를 실행하기 위한 사전 준비 작업이 이 함수에서 수행된다.
void Cleanup() {	} //Setup 함수에서 할당된 자원을 해제하는 작업을 수행한다.

//이 함수는 모든 드로잉 코드를 구현하며, 물체의 위치를 수정하는 등의 매 프레임마다 일어나야 하는 작업을 수행한다. 
//timeDelta 인자는 각 프레임의 경과시간이며, 초당 프레임과의 애니메이션 동기화에 이용된다.
bool Display(float timeDelta) 
{
	if (Device)
	{
		Device->Clear(
			0,			//pRects 배열 내 사각형의 수
			0,			//소거하려는 화면 사각형의 배열
			D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,	//어떤 표면을 소거할지 지정
			0x00000080,	//랜더 대상을 소거할 색상
			1.0f,		//깊이 버퍼를 지정하고자 하는 값
			0			//스텐실 버퍼를 지정하고자 하는 값
		);
		Device->Present(0, 0, 0, 0); //후면 버퍼와 프론트 버퍼 스왑
	}

	return true;
}

 

Display 메서드는 후면 버퍼를 소가혹 깊이/스텐실 버퍼를 각각 검은색과 1.0으로 초기화하는 IDirect3DDevice9::Clear 메서드를 호출한다. 애플리케이션이 중지 상태가 아닌 경우에만 드로잉을 수행하였음을 확인하자. IDirect3DDevice9::Clear 

선언은 다음과 같다.

HRESULT IDirect3DDevice9::Clear(
   DWORD Couont,
   const D3DRECT* pRects,
   DWORD Flags,
   D3DCOLOR Color,
   float Z,
   DWORD Stencil
 );
  • Count - pRects 배열 내 사각형의 수
  • pRects - 소거하려는 화면 사각형의 배열, 표면의 특정 영역만을 소거할 수 있도록 해준다.
  • Flags - 어떤 표면을 소거할지를 지정한다. 다음과 같은 표면들을 소거할 수 있다.
    -> D3DCLEAR_TARGET - 렌더 대상 표면, 보통은 후면 버퍼이다.
    -> D3DCLEAR_ZBUFFER - 깊이 버퍼
    -> D3DCLEAR_STENCIL - 스텐실 버퍼
  • Color - 렌더 대상을 소거할 색상
  • Z - 깊이 버퍼(z-버퍼)에 지정하고자 하는 값
  • Stencil - 스텐실 버퍼에 지정하고자 하는 

표면을 소거한 다음에 Present 메서드를 호출하여 후면 버퍼를 시연하였다.

윈도우 프로시저 메서드는 몇 가지의 이벤트를 처리한다.

현재 코드에서는 ESC 키를 눌러 애플리케이션을 종료할 수 있도록 해준다.

LRESULT CALLBACK d3d::WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	switch (iMessage)
	{
	case WM_DESTROY:
		::PostQuitMessage(0);
		break;
	case WM_KEYDOWN:
		if (wParam == VK_ESCAPE)
			::DestroyWindow(hWnd);
		break;
	}

	return ::DefWindowProc(hWnd, iMessage, wParam, lParam);
}

WinMain은 다음과 같은 단계를 수행한다.

  1. 메인 디스플레이 윈도우와 Direct3D를 초기화한다.
  2. Setup 함수를 호출하여 애플리케이션 사전 준비를 수행한다.
  3. Display를 디스플레이 함수로 이용하여 메시지 루프에 진입한다.
  4. 애플리케이션을 정리하고 최종적으로 IDirect3DDevice9 객체를 해제한다.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nCmdShow)
{
	//메인 디스플레이 윈도우와 Direct3D초기화
	if (!d3d::InitD3D(hInstance, 800, 600, true, D3DDEVTYPE_HAL, &Device))
	{
		::MessageBox(NULL, TEXT("InitD3D()-FAILED"), NULL, MB_OK);
		return 0;
	}

	//Setup함수 호출
	if (!Setup())
	{
		::MessageBox(NULL, TEXT("Setup()-FAILED"), NULL, MB_OK);
		return 0;
	}

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

	//애플리케이션 정리 & 삭제
	Cleanup();
	Device->Release();
	return 0;
}

 

  • Direct3D는 프로그래머와 그래픽 하드웨어를 연결하는 하나의 매개자로 생각할 수 있다. 프로그래머는 Direct3D 함수를 호출하며, 물리적 하드웨어는 장치의 HAL(하드웨어 추상 레이어)과의 인터페이싱을 통해 프로그래머가 요청한 작업을 수행한다.
  • REF 장치는 개발자의 장치에서 지원하지 않는 기능을 이용하는 Direct3D 애플리케이션을 테스트할 수 있도록 해준다.
  • 컴포넌트 객체 모델(COM)은 DirectX를 프로그래밍 언어에 독립적이고 하위 호환성을 가질 수 있도록 해주는 기술이다. Direct3D 프로그래머는 COM의 세부적인 부분이나 작동 원리에 대해 알 필요는 없으며, COM 인터페이스를 얻고 해제하는 방법만을 기억하면 된다.
  • 표면은 2D 이미지를 보관하는 데 이용되는 특별한 Direct3D 인터페이스로, D3DFORMAT 열거형의 멤버를 이용해 표면의 픽셀  포맷을 지정한다. 그 밖의 Direct3D의 자원들은 D3DPOOL 열거형의 멤버로 지정하는 여러 가지 다른 메모리 풀에 보관될 수 있으며, 부가적으로 표면에 멀티 샘플링 처리를 적용하여 좀더 부드러운 이미지를 만들어낼 수 있다.
  • IDirect3D9 인터페이스를 이용하면 시스템의 그래픽 장치에 대한 정보를 얻을 수 있다. 예를 들어, 이 인터페이스를 통해 장치 특성에 대한 정보를 얻고 IDirect3DDevice9 인터페이스를 만드는 데 이 정보를 이용할 수 있다.
  • IDirect3DDevice9 인터페이스는 그래픽 장치를 제어하기 위한 소프트웨어 인터페이스이다. 예를 들어, IDirect3DDevice9::Clear 메서드를 호출하면 간접적으로 그래픽 장치의 지정된 표면을 소거한다.

'Public > GraphicsAPI' 카테고리의 다른 글

정점 버퍼  (0) 2022.08.14
FVF  (0) 2022.08.14
일반적인 WIN32 구조와 D3D 비교  (0) 2022.08.10
삼각형  (0) 2022.08.06
모델표현 / 버텍스 포맷  (0) 2022.08.06