본문 바로가기

예전/3D

[3D] Direct3D 초기화



1. Direct3D란?


- Direct3D는 3D 가속 하드웨어를 사용해 3D를 표현하게 하는 저수준 그래픽 API응용프로그램과 그래픽 장치를 연결하는 중개자이다.





- Direct3D 가 공개하는 기능이라 하더라도 그래픽 하드웨어에서 지원하리라는 보장은 없다. 그래픽 카드의 종류는 매우 다양하며 각기 다른 방법으로 동작하기 때문에 Direct3D가 직접 그래픽 장치를 제어하기른 불가능하다. 때문에 Direct3D는 제조사에게 HAL을 구현할 것을 요구한다. 




- HAL (Hardward Abstraction Layer)

: HAL은 그래픽 장치가 특정한 작업을 수행하게 하는 장치 고유의 코드로 이를 통해 Direct3D가 각 장치의 세부적인 부분을 제어할 필요가 없게 한다.

즉, 하드웨어 장치에 독립적인 규약을 확립하게 했다.

제조사는 자신의 장치가 지원하는 모든 기능을 사용해 HAL을 구현하며, Direct3D에는 정의 되었지만 장치에서 지원하지 않는 기능은 HAL에 포함하지 않는다. 만약, HAL에서 구현되지 않은 함수를 호출할 시 오류가 발생한다.



- REF (Reference Rasterizer) 장치

: Direct3D는 Direct3D API를 소프트웨어로 에뮬레이트하는 장치이다. 그래픽 카드에서 지원하진 않지만, Direct3D에서 제공하는 기능을 사용한 프로그램을 작성하고자 할때 사용된다.


에뮬레이터란 어떤 하드웨어나 소프트웨어의 기능을 다른 종류의 하드웨어나 소프트웨어로 모방하여 실현시키기 위한 장치 혹은 프로그램이다. 여러 제약을 극복하고 호완성을 실현하는 방법의 하나로 사용된다. 모방하다(Emulate)라는 뜻에서 붙여진 이름으로 본래의 기능을 흉내내어 유사한 기능을 할 수 있도록 했다는 뜻에서 사용하게 되었다.



- D3DDEVTYPE 은 장치 타입이다. 

D3DDEVTYPE_HAL은 하드웨어 장치를 D3DDEVTYPE_REF는 소프트웨어 장치를 사용함을 의미한다.


- COM (Component Object Model)

: Microsoft가 책정한 객체간의 통신 규약으로 DirectX를 프로그래밍 언어에 독립적으로 만들어 주고, 하위 호환성을 갖출 수 있게 하는 기술이다. 보통 COM 객체를 인터페이스로 부르며, C++의 클래스와 비슷하게 사용된다. COM은 다른 COM 인터페이스의 메소드나 특수한 함수를 통해 COM 인터페이스의 포인터를 얻는다.


인터페이스의 사용이 끝났을 경우 인터페이스의 Release함수를 호출해야 하며, COM객체는 자신의 메모리 관리를 스스로 한다.

 




2. Direct3D의 초기화 과정


① IDirect3D9 인터페이스로의 포인터를 얻는 것으로 초기화가 시작된다.


LPDIRECT3D9    g_pd3d = NULL;

g_pd3d = Direct3DCreate9(D3D_SDK_VERSION);


D3D_SDK_VERSION 인자는 애플리 케이션이 올바른 헤더 파일로 만들어 졌는가를 확인하기 위한 것으로 만약 함수가 실패하면 NULL을 리턴한다.


g_pd3d는 장치검증과, Direct3DDevice9 객체 생성의 용도로 사용된다. 여기서 장치 검증이란 시스템의 그래픽 장치가 제공하는 특성에 대한 정보를 얻는 과정이다.



② Hardware Vertex Processing 확인


Direct3DDevice9 객체를 생성할 때는 반드시 원하는 버텍스 프로세싱 모드를 지정해야 한다.

하드웨어 버텍스 프로세싱을 선택하는 것이 가장 좋지만 모든 그래픽 카드가 이를 지원하는 것은 아니므로 하드웨어 버텍스 프로세싱을 지원하는지를 먼저 확인해야 한다.


버텍스 프로세싱 타입을 변수에 보관해 이후에 Direct3DDevice9 객체 생성시 버텍스 프로세싱 타입을 지정할 수 있다.



③ D3DPRESENT_PARAMETERS 구조체


D3DPRESENT_PARAMETERS 구조체를 생성하고, 초기화(ZeroMemory)하며, 구조체의 내용을 채운다.

이 구조체는 Direct3DDevice9 객체의 성격을 결정하는데 이용된다.



④ Direct3DDevice9 인터페이스 생성






'예전 > 3D' 카테고리의 다른 글

[UI엔진] 처음 내 프로젝트를 만들고서  (0) 2012.09.27
[3D] 김벌락 (Gimbal Lock)  (0) 2012.09.06
[3D] 행렬  (0) 2012.08.06
[3D] 벡터  (0) 2012.08.06
[3D] 그래픽스 파이프 라인  (0) 2012.08.02