장면(Scene)은 물체나 모델의 모음이다. 물체는 삼각형 메쉬의 묘사로 이루어지는데, 메쉬의 삼각형은 우리가 모델링하는 물체의 기본적인 구성 성분이 되며, 우리는 메쉬 삼각형을 참조하는 용어로 다각형(polygon), 기본형(primitive), 그리고 메쉬 기하물체를 상호 교환적으로 이용한다. 다각형에서 두개의 변이 만나는 지점을 버텍스(vertex)라 한다.
-1 버텍스(vertex) 포맷
Direct3D에서 버텍스는 수학적 정의 외에도 부가적인 특성으로 이루어진다. 하나의 버텍스는 법선 특성 외에도 색상 특성을 가질수 있다. 즉, Direct3D는 버텍스 포멧을 구성할 수 있는 유연성을 제공한다.
-2 삼각형(Triangle)
삼각형은 3D 물체의 기본 구성 요소로서, 물체를 구성하기 위해서는 물체의 모양과 외형을 묘사하는 삼각형 리스트를 만들어야 한다. 삼각형 리스트는 우리가 그리고자하는 각각의 삼각형에 대한 데이터를 포함하는데, 예를 들어, 사각형을 만들기 위해서는 두 개의 삼각형으로 나누고 각각의 삼각형을 구성하는 버텍스를 지정해야한다.
-3 인덱스(Index)
3D 물체를 구성하는 삼각형들은 동일한 버텍스들을 공유하는 경우가 많다. 모델의 복잡성과 세밀함이 증가할수록 중복되는 버텍스의 수 역시 증가한다. 이를 해결하기 위해 인덱스 개념을 이용하는데, 먼저 버텍스 리스트와 인덱스 리스트를 구성하고, 버텍스 리스트는 모든 버텍스들을 모함하며, 인덱스 리스트는 삼각형을 구성하기 위한 버텍스리스트로의 인덱스 값을 포함한다.
2. 가상 카메라
카메라(Camera)는 관찰자가 볼 수 있는 세계의 부분을 지정하는 것으로, 2D 이미지를 생성하기 위해 세계의 어떤 부분이 필요한지를 결정하며, 세계 내에 위치하며 보여질 공간의 부피를 정의한다. 이 공간의 부피를 절두체(Frustum)이라 한다.
절두체는 시야각과 가까운 평면, 먼 평면에 의해 정의된다.
이 공간에 포함되지 않는 물체들은 보여지지 않으며 이후 처리에서 제외되어야 한다. 이와 같은 데이터의 제외 처리를 클리핑(Clipping)이라 부른다.
Direct 3D는 3D 가속 하드웨어를 이용해 3D 세계를 표현 할 수 있도록 해주는 저수준 그래픽 API.
그래픽 장치(3D 하드웨어)를 연결하는 중개자.
· Direct3D
어플리케이션 또는 프로그래머에게 공개하는 인터페이스와 함수들로 구성되어 있다. 이들 인터페이스와 함수는 현재 버전의 Direct3D가 지원하는 모든 기능을 나타낸다.
· HAL
Direct3D와 그래픽 장치 사이에 하드웨어 추상 층(HAL: Hardware Abstraction Layer)이라는 중간 단계가 존재한다. 시장에 존재하는 그래픽 카드의 종류는 매우 다양하며 각각의 카드들은 다양한 방법으로 작동하기 때문에, Direct3D가 직접 그래픽 장치를 제어하기 불가능하다. 제조사에서 HAL을 구현하고, Direct3D가 HAL을 통해서 특정 작업을 요청하면 동작 방식이 다른 모든 그래픽 장치를 Direct3D의 동일한 명령으로 해당 작업을 수행한다.
2. COM(컴포넌트 객체 모델: Component Object Model)
컴포넌트 객체 모델(COM)은 DirectX를 프로그래밍 언어에 독립적으로 만들어주고 하위 호환성을 갖출 수 있게 하는 기술. COM 객체를 인터페이스로 부르며, C++ 클래스와 비슷하게 이용.
다른 COM 인터페이스의 매서드나 특수한 함수를 통해 COM 인터페이스의 포인터를 얻는다는 것이며, C++ new 키워드로 COM 인터페이스를 만드는 것이 아니다.
인터페이스를 이용하는 작업이 모두 종료되면, 인터페이스의 Release 메서드를 호출 할 것. COM 객체는 자신의 메모리 관리를 스스로 수행한다.
3. 기본적인 그래픽 개념과 Direct3D 형에 대한 이해
-1 표면(Surface)
표면은 Direct3D가 주로 2D 이미지 데이터를 보관하는 데 이용하는 픽셀의 행렬이다.
-2 멀티 샘플링
멀티 샘플링(Multisampling)은 픽셀 매트릭스로 이미지를 표현할 때 나타나는 거친 이미지를 부드럽게 만드는 기술
-3 픽셀 포맷
표면이나 텍스처를 만들기 위해서는 Direct3D 자원의 픽셀 포맷을 지정해야한다. 픽셀 포멧은 D3DFORMAT 열거형 멤버로 지정되며, 자주 이용하는 포멧은 다음과 같다
D3DFMT_R8G8B8 - 24bit 픽셀 포멧을 지정한다.
D3DFMT_X8R8G8B8 - 32bit 픽셀 포맷을 지정한다. 가장 왼쪽의 8bit는 이용하지 않는다.
D3DFMT_A8R8G8B8 - 32bit 픽셀 포맷을 지정한다. 가장 왼쪽의 8bit는 알파값을 지정한다.
D3DFMT_A16R16G16B16F - 64bit 부동소수점 픽셀 포맷을 지정한다. 가장 왼쪽의 16bit는 알파값을 지정한다
D3DFMT_A32R32G32B32F - 128bit 부동소수점 픽셀 포맷을 지정한다. 가장 왼쪽의 32bit는 알파값을 지정한다.
-4 메모리 풀
표면이나 그 밖의 다양한 Direct3D 자원들은 여러 가지 종류의 메모리 풀에 보관할 수 있다.
D3DPOOL_DEFAULT - 디폴트 메모리 풀은 자원 타입과 이용 방식에 가장 적합한 자원들을 메모리에 보관하도록 Direct3D에 요청한다. 여기서 말하는 자원이랑 비디오 메모리나 AGP 메모리, 혹은 시스템 메모리 등을 말하는 것이고, 디폴트 풀 내의 자원은 반드시 IDirect3DDevice9::Reset 호출 이전에 해제 되어야 하며, reset 호출 이후에 다시 초기화되어야 한다.
D3DPOOL_MANAGED - 관리 풀에 보관된 자원은 Direct3D에 의해 관리된다(즉, 필요에 따라 자동으로 비디오 메모리나 AGP 메모리로 옮겨진다). 부가적으로 자원의 백업 복사본이 시스템 메모리 내에 보관되는데, 어플리케이션이 자원에 접근하고 수정할 때는 시스템 복사본을 이용하여, Direct3D는 필요에 따라 자동으로 이를 비디오 메모리에 갱신한다.
D3DPOOL_SYSTEMMEM - 시스템 메모리 내에 보관될 자원을 지정한다.
D3DPOOL_SCRATCH - 시스템 메모리 내에 보관될 자원을 지정한다. 앞의 D3DPOOL_SYSTEMMEM과 달리 이 풀의 자원은 그래픽 장치의 제한을 따라서는 안 된다. 따라서 장치는 이 풀 내의 자원에 직접 접근할 수 없지만, 자원을 두 풀 사이에 서로 복사하는 것은 가능하다.
-5 스왑 체인과 페이지 플리핑
Direct3D는 보통 두 개나 세 개의 표면을 하나의 컬렉션으로 관리하는데, 이를 스왑 체인이라 부른다. 스왑 체인은 IDirect3DSwapChain9 인터페이스를 통해 이용할 수 있다.
스왑 체인 과 페이지 플리핑 기술은 프레임 간의 부드러운 애니메이션을 제공하기 위한 것이다. 다음은 두 개의 표면 간의 스왑 체인을 보여주고 있다.
전면 버퍼 슬롯의 표면은 현재 모니터에 디스플레이되는 이미지와 대응된다. 모니터도 전면 버퍼의 이미지를 즉시 디스플레이 할 수 있는 것은 아니며, 주사율에 따라 약간의 시간이 필요하다. 60Hz의 주사율을 가진 모니터면 1/60초 정도의 시간이 필요하다. 어플리케이션의 프레임율과 모니터의 주사율이 동기화 되지 않는 경우가 흔한데, 이를 해결 하기 위해 화면 밖의 표면(후면 버퍼)에 렌더링을 수행하고, 전면 버퍼의 디스플레이가 완료되면 스왑 체인의 끝으로 돌아가 후면 버퍼를 전면 버퍼로 전환하는 방법을 이용한다.
렌더링 코드의 구조는 다음과 같다.
후면 버퍼를 렌더링한다.
후면 버퍼를 시연한다.
1번으로 돌아간다.
-6 깊이 버퍼
깊이 버퍼(depth buffer)는 이미지 데이터가 아닌 특정 픽셀의 깊이 정보를 포함하는 표면을 말하며, 깊이 버퍼 내에는 최종 렌더링된 이미지의 각 픽셀에 해당하는 항목들을 포함한다. Direct3D는 물체의 픽셀이 다른 픽셀을 가리는지 여부를 판단하기 위해 깊이 버퍼링 혹은 z-버퍼링을 이용한다.
깊이 버퍼링은 각 픽셀의 깊이 값을 계산하고 깊이 테스를 수행한다. 카메라와 가까운 픽셀이 뒤쪽의 픽셀을 가리는 간단한 원리다.
-7 버텍스 프로세싱
버텍스는 3D 기하물체를 구성하는 기본 단위로, 소프트웨어(software vertex processing)나 하드웨어(hardware vertex processing)의 두 가지 방법으로 처리할 수 있다.