DirectX 3D/DirectX9

2. Direct3D로 첫걸음!

멜데스 2016. 6. 14. 15:06

(D3D = Direct3D 손아파서...)

1. D3D가 어떻게 그래픽 하드웨어와 상호작용을 하는가?

2. D3D에서의 COM은 무엇이고 어떤 역할을 하는가?

3. 2D 이미지가 보관되는 방법, 페이지 플리핑, 깊이 버퍼링?

4. D3D를 초기화 하자!

=============================================================

Direct3D란?

Direct3D는 가속 하드웨어를 이용해 3D 세계를 표현할 수 있도록 해주는 저수준 그래픽 API이다.

즉, 애플리케이션과 그래픽 장치를 연결하는 중개자 정도로 생각하자.


애플리케이션 ===> Direct3D ====> HAL ====> 그래픽 장치

Direct3D 파트는 Direct3D가 애플리케이션 / 프로그래머에게 공개하는 인터페이스와 함수들로 구성되어 있으며, 이들 인터페이스와 함수는 현재 버전의 Direct3D가 지원하는 모든 기능을 나타낸다.

그렇지만 Direct3D가 공개하고 있는 기능이라고 해도 그래픽 하드웨어에서 반드시 지원하리라는 보장은 없다.

=============================================================

Direct3D와 그래픽장치 사이에는 HAL(하드웨어 추상 층 : Hardware Abstraction Layer)이라 불리는 중간단계가 존재한다.

그래픽카드 제조사는 MSI, GIGABYTE, ASUS, 사파이어 등 여러 종류가 있고 다양한 방법으로 작동하기 때문에 Direct3D가 직접 그래픽 장치를 제어하기란 불가능하다. 

ex) 화면소거와 같은 간단한 작업에서도 그래픽카드마다 전혀 다른 방식을 이용할 수 있다.

그렇기 때문에 Direct3D는 장치 제조 사에게 HAL을 구현할 것을 요구하고 있다.

HAL은 장치로 하여금 특별한 작업을 수행하도록 하는 장치 고유의 코드로, 이를 통해 Direct3D가 각 장치의 세부적인 부분을 제어할 필요가 없도록 하고, 하드웨어 장치에 독립적인 규약을 확립하는 것이 가능하다.

=============================================================

REF장치

Direct3D에서 제공하는 기능을 이용하는 프로그램을 작성하고 하는 경우 Direct3D API 장치를 소프트웨어로 에뮬레이트 하는 레퍼런스 래스터라이저(Reference Restorizer)를 제공하며, 이를 통해 장치에서 지원하지 않는 Direct3D기능을 이용하는 코드를 작성하고 테스트를 할 수 있다.

=============================================================

D3DDEVTYPE

HAL장치는 D3DDEVTYPE 열거형의 멤버인 D3DDEVTYPE_HAL로 지정. 

비슷하게 REF 장치 역시 D3DDEVTYPE 열거형의 멤버인 D3DDEVTYPE_REF로 지정된다.

장치를 만들때는 어떤 타입을 원하는지를 지정해야 하므로 이들 타입에 대해서는 반드시 기억해야 한다.

=============================================================

COM객체

컴포넌트 객체모델(COM : Component Object Model)은 DirectX를 프로그래밍 언어에 독립적으로 만들어주고 하위 호환성을 갖출 수 있게 하는 기술. (C++클래스와 비슷하게 이용됨)

C++를 이용해 DirectX를 프로그래밍하는동안 COM의 세부적인 부분들은 거의 대부분 프로그래머 간섭없이 작동하는데, 반드시 기억해야 할 한 가지는 다른 COM 인터페이스의 메서드나 특수한 함수를 통해 COM 인터페이스의 포인터를 얻는다는 것!

C++ new 키워드로 COM인터페이스를 만드는것이 아니다!

부가적으로, 인터페이스를 이용하는 작업이 모두 끝나면 우리가 직접 이를 지우는 것이 아니라 인터페이스의 Release 메서드를 호출해야 한다!(모든 COM 인터페이스는 IUnknown COM 인터페이스에서 기능을 상속받는다.) COM 객체는 자신의 메모리 관리를 스스로 수행한다.


ps. COM 인터페이스는 접두어로 대문자 I를 가진다. 예를 들어, 표면을 나타내는 COM 인터페이스의 이름은 Direct3DSurface9이다.