우선 Direct X는 9버젼부터 3D를 지원하기 시작했고 현재 12버젼까지 나왔다.
즉, 9~12버젼이 3D를 다룬다 할수 있다.
Direct3D는 프로그램이 3차원 그래픽 가속 기능을 이용해서 3차원 세계를 렌더링할 수 있게 해준다.
본질적으로 Direct3D는 그래픽 하드웨어를 제어할 수 있는 소프트웨어라고 할 수 있다.
4.1.2 COM
COM (component Object Model)은 DirectX의 프로그래밍 언어 독립성과 하위호환성을 가능하게하는 기술
COM 의 객체는 인터페이스라고도 할수있다.
프로그래머가 알아야할것은 필요한 COM 인터페이스의 포인터를 특별한 함수, 또 다른 COM 인터페이스의 메서드를 이용해서 얻는 방법뿐이라는것을 명심해야한다.
COM의 인터페이스는 C++의 new 키워드로 생성하지 않는다. 또한 delete로 삭제하는것이 아닌 인터페이스의 Release의 메서드를 호출해줘서 삭제한다.
## 모든 COM인터페이스는 IUnknown이라는 기능을 상속받는다. 자신들의 고유한 방식으로 메모리 관리를 한다.
++ 모든 COM인터페이스들은 이름이 대문자I로 시작한다. 만약 다이렉트x11의 3D작업을 한다 예를 들었을때 ID3D11 이렇게 제시한다.
4.1.3 텍스처 및자료 자원 형식
2차원 텍스처는 원소들의 행렬(2차원배열)
2차원 텍스쳐의 한가지 용도로는 2차원이미지자료를 저장하고, 이때 각원소는 픽셀의 색상을 담고있다.
법선매핑기법은 각원소가 색상이 아닌 3차원 벡터를 담는다.
즉 텍스쳐는 그저 단순한 이미지 자료의 저장으로만 쓰이는것이 아닌 범용적으로 사용이 가능하다는 것이다.
1차원 텍스쳐는 원소의 1차원배열,
2차원 텍스처는 원소들의 행렬(2차원배열),
3차원텍스처는 원소들의 3차원배열을 넣을수가 있다.
GPU는 필터링 다중표본화등 특별한 연산을 적용시킬수있다.
텍스쳐의 자료형식들 예시 ex)
1. DXGI_FORMAT_R32G32B32_FLOAT:각 원소는 32비트 부동소수점 성분 세 개로 이 루어진다.
2. DXGI_FORMAT_Rl 6G16B16A16_UNORM:각 원소는 [0,1] 구간으로 사상되는 16비트 성분 네 개로 이루어진다.
3. DXGI_FORMAT_R32G32_UINT:각 원소는 32비트 부호 없는 정수 성분 두 개로 이루 어진다.
4. DXGI_FORMAT_R8G8B8A8_UNORM:각 원소는 [0,1] 구간으로 사상되는 8비트 부호 없는 성분 네 개로이루어진다. 5. DXGI_FORMAT_R8G8B8A8_SNORM:각 원소는 [-1,1] 구간으로 사상되는 8비트 부호 있는성분 네 개로이루어진다.
6. DXGI_FORMAT_R8G8B8A8_ UINT : : 각 원소는 [-128,127] 구간으로 사상되는 8비 트 부호 있는정수 성분 네 개로 이루어진다.
7. DXGI_FORMAT_R8G8B8A8_UINT:각 원소는 [0,255] 구간으로 사상되는 8비트 부호 없는 정수 성분 네 개로 이루어진다.
여기서 RGBA는 각각 RED, GREEN, BLUE, ALPHA를 뜻한다.
색상이 아닌 3차원벡터를 담을수도 있는데 이는 메모리만 확보해두고 자료의 구체적인 해석 방식은 파이프라인에 묶을때 지정한다.
4.1.4 교환 사슬과 페이지 전환
보통 애니메이션이 껌벅이는 현상을 방지하기위해서
1.후면버퍼(back buffer)는 텍스쳐를 생성시킨후 현재 모니터에 표시되는 이미지 자료를 담는 전면버퍼가되고
2.전면버퍼는 다음 텍스쳐를 생성시키는 후면버퍼가 되는 무한히 반복되는 과정을 거친다.
이 효율적인 비법을 제시(presenting)이라고 한다.
이 과정속에서 전면버퍼와 후면버퍼는하나의 교환사슬을 형성하고 이를 IDXGISWAPChain 로 호출시킬 수 있다.
이 인터페이스는 전면버퍼텍스처와 후면버퍼 텍스처를 담고 있으며, 버퍼크기를위한메서드, 버퍼의제시를위한메서드를 제공한다.
후면 버퍼는 텍스처이므로 그 원소를 텍셀texel이라고 명칭한다.
4.1.5 깊이 버퍼링
깊이 버퍼(depth buffer)는 이미지 자료를 담지않고 각 픽셀의 깊이(?)정보를 담는다. 이는0~1.0f사이의 값으로 0에 가까울수록 관찰자와 가까운 픽셀이다. 깊이버퍼의 원소와 후면버퍼의 픽셀은 일대일 대응 구조를 가지고있다.
예를들어 후면버퍼의 ij원소는 깊이버퍼의 ij번째원소에 대응된다.
더 자세하게 후면버퍼의 해상도가1280x720이라면 깊이버퍼는 1280x720개의 원소들로 구성된다.
.깊이 값을 비교했을 때 관찰자에게 가 장 가까운 픽셀이 승자가 되어서 후면 버퍼에 기록된다.
4.1.6 텍스처 자원 뷰
렌더링 파이프라인에는 텍스퍼를 묶을수있는 두가지 단계가있다.
1.텍스쳐를 렌더 대상으로 묶는경우 (Direct3D가 텍스처에 렌더링하는경우)
2. 셰이더 자원으로서 묶는것(셰이더 안에서 텍스처를 추출하는 경우)
이 두가지 경우를 사용할때 파이프라인 단계를 지정하는 결속 플래그(bind flag)를 사용한다.
4.1.7 다중표본화의 이론
모니터의 픽셀이 미세하지않기때문에 모니터화면에 임의선을 완벽하게 구현하는것은 불가능하다
이 때 계단현상이라고하는 앨리어싱이 발생한다.
이를 해결하기 위한 여러가지 기법들이 있는데
1. 초과표본화(supersampling): 화면해상도보다 4배로 푸면버퍼(2배)와 깊이버퍼(2배)를 잡는다.
3차원장면을 4배크기의 해상도에서 후면버퍼에 렌더링하고 이미지를 화면에 제시할때 후면버퍼를 원래크기의 버퍼로 바꿔넣는다 이를 하향표준화(downsampling)이라고 한다.
따라서 초과표본화는 화면해상도를 소프트웨어에서 증가하는것이라 할 수 있다.
하지만 픽셀처리량과 메모리 소비량이 네배라 최적화에는 불리하다.
2.다중표본화(multisampling) : 일부결과를 부분픽셀들사이에 공유한다.
'책 정리 > DirectX' 카테고리의 다른 글
DirectX 11을 이용한 3D 게임 프로그래밍 입문_05 렌더링파이프라인 (1) | 2024.02.27 |
---|