Direct3D 8.0버전 부터 단순화된 초기하 모델을 도입했으며 사용하려는 9.0 역시 동일한 모델을 따르고 있다.

초기화 과정을 문제없이 수행하기 위해서는 가본적인 그래픽 개념과 Direct3D 형에 대한 기본적인 지식이 필요하다.


목표

- Direct3D가 그래픽 하드웨어와 상호작용하는 방법을 배운다.

- Direct3D에서 COM의 역할을 이해한다.

- 2D 이미지가 보관되는 방법, 페이지 플리핑 깊이 버퍼링 등과 같은 기본적인 그래픽 개념을 배운다.

- Direct3D를 초기화하는 방법을 배운다.

- 책의 예제 애플리케이션에서 이용하고 있는 범용적인 구조에 익숙해진다.



Direct3D 개요

Direct3D는 3D 가속 하드웨어를 이용을 도와주는 API, 어플리케이션과 그래픽 장치(3D 하드웨어)를 연결하는 중재자

애플리케이션, Direct3D, 하드웨어 간의 관계

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


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

HAL이 중재자 역할을 해주면서 Direct3D가 각 장치의 세부적인 부분을 제어할 필요가 없도록 하고, 하드웨어 장치에 독립적인 규약을 확립하는 것이 가능하다.

때문에 HAL에서 구현 하지 않는 Direct3D 함수를 호출하면 오류가 발생한다. 최신 기능을 이용하고자 할 때는 먼저 원하는 기능을 지원 하는지 확인 해야한다.



REF 장치

레퍼런스 래스터라이저(REF 장치라고 불린다) 이를 통해 장치에서 지원하지 않는 Direct3D 기능을 이용하는 코드를 작성하고 테스트할 수 있다.

DirectX SDK에만 포함되며, 최종 사용자에게는 배포할 수 없다. REF 장치는 테스트 이외의 목적으로 이용하기에는 상당히 느리다.



D3DDEVTYPE

HAL 장치는 D3DDEVTYPE 열거형의 멤버인 D3DDEVTYPE_HAL로 지정된다. 비슷하게

REF 장치 역시 D3DDEVTYPE_REF로 지정된다. 우리는 장치를 만들 떄는 어떤 타입을 원하는지를 지정한다.


COM

모델(COM)은 DirectX를 프로그래밍 언어에 독립적으로 만들어죽 하위 호환성을 갖출 수 있게 하는 기술이다.

COM은 C++ new 키워들 COM 인터페이스를 만드는 아니며 작업이 끝난면 직접 지우는 것이 아니라 인터페이스의 Release 메서드를 호출

모든 COM 인터페이스는 IUnknown COM 인터페이스에서 기능을 상속받는다.

COM 객체는 자신의 메모리 관리를 스스로 수행한다.

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



약간의 준비

기본적인 그래픽 개념

Direct3D 형에 대한 이해



표면(surface)

Direct3D가 주로 2D 이미지 데이터를 보관하는 데 이용하는 픽셀의 핵렬이다.

아래 그림은 표면 데이터를 행려로 그려냈지만, 실제로 픽셀 데이터는 선형 배열에 보관된다.

표면의 너비와 높이는 픽셀 단위로 계산된다. 피치는 바이트로 계산 되며 하드웨어 구현에 따라서는 너비보다 길 수도 있다.


코드에서 표면을 이용하는 IDirect3DSurface9의 메서드

LockRect - 메서드는 표면 메모리로의 포인터를 제공한다. 여기서 약간의 포인터 연산을 거치면 표면 내의 각 픽셀을 읽고 쓸 수 있게 된다.

UnlockRect - LockRect를 호출하고 표면 메모리에 대한 작업이 끝난 뒤에는 이 메서드를 호출 하여 표면의 잠금을 해제해야 한다.

GetDesc - 표면에 대한 정보를 D3DSURFACE_DESC 구조체를 통해 얻어온다.


표면을 잠그고 각각의 픽셀을 빨간색으로 지정하는 과정의 코드



멀티 샘플링(Multisampling)

픽셀 매트릭스로 이미지를 표현할 때 나타나는 거친 이미지를 부드럽게 만드는데 이용되는 기술이다.

각이 있는 선이 흐리게 변함.



픽셀 포맷

표면이나 텍스처를 만들기 위해서는 Direct3D 자원의 픽셀 포맷을 지정해야 한다.

자주 사용 하게될 픽셀 포멧은 D3DFORMAT 포맷 열거형 멤버로 지정됨.

A = 알파, R = 빨강색, G = 녹색, B = 파랑색

D3DFMT_R8G8B8 - 24-비트 필셀 포맷을 지정한다. 8비트씩 RGB순으로 할당됨.

D3DFMT_X8R8G8B8 - 32-비트 필셀 포맷을 지정한다. X의 8비트는 이용되지 않고 나머지는 8비트씩 RGB순으로 할당됨.

D3DFMT_A8R8G8B8 - 32-비트 필셀 포맷을 지정한다. 8비트씩 ARGB순으로 할당됨.

D3DFMT_A16B16G16R16F - 64-비트 부동소수점 픽셀 포맷을 지정한다. 16비트 씩 ABGR순으로 할당됨.

D3DFMT_A32B32G32R32F - 128-비트 부동소수점 픽셀 포맷을 지정한다. 32비트 씩 ABGR순으로 할당됨.

D3DFMT_R8G8B8 , D3DFMT_X8R8G8B8, D3DFMT_A8R8G8B8 3개의 포맷은 일반적인 것이며 거의 대부분의 하드웨어에서 지원함.

포맷 이름에 argb와 숫자로 몇비트 포맷인지 알 수 있다.

레퍼런스에 D3DFORMAT을 검색 하면 픽셀 포맷 전체 목록을 확인 가능함.



메모리 풀

리소스들은 여러 가지 종류의 메모리 풀에 보관할 수 있다. D3DPOOL 열거형의 멤버들

- D3DPOOL_DEFAULT - 디폴트 메모리 풀은 자원의 타입과 이용 방식에 가장 적합한 자원들을 메모리에 보관하도록 Direct3D에 요청한다. 여기서 말하는 자원이란 비디오 메모리나 AGP 메모리, 혹은 시스템 메모리 등을 말하는 것으로, 디폴트 풀 내의 자원은 반드시 IDirect3DDeviec9::Reset호출 이전에 파괴(해제)되어야 하며, Reset 호출 이후에 다시 초기화되어야 한다.


- D3DPOOL_MANAGED 관리 풀에 보관된 자원은 Direct3D에 의해 관리된다 (즉 필요에 따라 자동으로 비디오 메모리나 AGP 메모리로 옮겨진다) 부가적으로 자원의 백업 복사본이 시스템 메모리 내에 보관되는데, 애플리케이션이 자원에 접근하고 수정할 때는 시스템 복사본을 이용하며, Direct3D는 필요에 따라 자동으로 이를 비디오 메모리에 갱신한다.


- D3DPOOL_SYSTEMMEM - 시스템 메모리 내에 보관될 자원을 지정한다.


- D3DPOOL_SCRATCH - 시스템 메모리 내에 보관될 자원을 지정한다 앞서의 D3DPOOL_SYSETMMEM과는 달리 이 풀의 자원은 그래픽 장치의 제한을 따라서는 안 된다. 따라서 장치는 이 풀 내의 자원에 직접 접근할 수 없지만 자원을 두 풀 사이에 서로 복사하는 것은 가능하다.



스왑 체인과 페이지 플리핑

Direct3D는 보통 두 개나 세 개의 표면을 하나의 컬렉션으로 관리하며, 이를 스왑 체인지라 부른다.

IDirect3DSwapChain9 인터페이스를 통해 이용할 수 있지만 Direct3D가 직접 관리해서 이용하는 경우는 거의 없다.

렌더링 코드의 순서

1. 후면 버퍼를 렌더링한다 -> 2. 후면버퍼를 시연한다. -> 3. 1번으로 돌아간다.

더블 버퍼를 생각하면 됨.



깊이 버퍼(depth buffer)

데이터가 아닌 특정 픽셀의 깊이 정보를 포함하는 표면.

싶이 버퍼 내에는 최종 렌더링된 이미지의 각 픽셀에 해당하는 항목들을 포함한다.

렌더링된 이미지가 640 x 480 해상도를 가진다면 640 x 480개의 깊이 항목이 존재한다.

물체의 픽셀이 다른 픽셀을 가리는지의 여부를 판단하기 위해 깊이 버퍼링 혹은 z-버퍼링을 이용함.

카메라를 기준으로 가장 가까운 깊이 값을 가지는 픽셀이 경쟁에서 승리하며, 승리한 픽셀 이미지가 그려진다.

깊이 버퍼의 포맷은 깊이 테스트의 정확도르 결정한다.(24비트 깊이 버퍼는 16비트 깊이 버퍼에 비해 더 정확함)

D3DFMT_D32 - 32-비트 깊이 버퍼

D3DFMT_D24S8 - 24-비트 깊이버퍼, 스텐실 버퍼로 8비트를 예약

D3DFMT_D24X8 - 24-비트 깊이버퍼

D3DFMT_D2X4s4 - 24-비트 깊이버퍼, 스텐실 버퍼로 4비트를 예약

D3DFMT_D16 - 16-비트 깊이버퍼

스텐실 : 스텐실은 일부 필셀이 그려지는 것을 막는 기법(평면 그림자)


버텍스 프로세싱

버텍스 프로세싱은 소프트웨어, 하드웨어 두 가지방법이 있다.

소프트웨어 버텍스 프로세싱은 언제나 지원되며 항상 이용가능, 하드웨어 버텍스 프로세싱은 그래픽 카드가 지원 하는 경우에만 이용가능.

소프트웨어에 비해 전용 하드웨어의 성능이 우수하므로 하드웨어로 이용하는 것이 유리하며 하드웨어로 버텍스를 처리하면 CPU를 다른 계산에 할당할 수 있다.

- 그래픽 카드가 하드웨어 버텍스 프로세싱을 지원 한다는 것은 그래픽 카드가 변환과 조명 계산을 하드웨어적으로 처리할 수 있다는 의미이다.



Direct3D 초기화하기


프레임웍

프레임웍이란? 우리가 애플리케이션을 작성할 때 이용할 일반적인 구조를 말하는 거이다.

우리가 작성할 모든예제에는 메시지 프로시저와 WinMain을 제외하고 다음과 같은 세 가지의 공통적인 함수를 포함한다.

  • bool Setup() - 자원의 할당이나 장치 특성의 확인, 애플리케이션 상태의 설정 등과 같이 예제를 실행하기 위한 사전 준비 작업이 이 함수에서 수행된다.
  • void Cleanup() - Setup 함수에서 할당된 자원을 해제하는 작업을 수행한다.
  • bool Display(float timeDelta) - 이 함수는 모든 드로잉 코드를 구현하며, 물체의 위치를 수정하는 등의 매 프레임마다 일어나야 하는 작업을 수행한다. timeDelta 인자는 각 프레임의 경과 시간이며, 초당 프레임과의 애니메이션 동기화에 이용된다.


Init 결과 화면







반응형