[DirectX12] #Part 2 - Direct 3D 기초
"DirectX12를 이용한 3D 게임 프로그래밍 입문" 서적의 Part 2, "Direct3D의 기초"에 해당하는 내용입니다.
현재, 게임 개발에 입문하여 기초지식을 습득하여 기록하기 위함이며, 개념 이해와 예제코드 작성을 진행.
2.4 교환 사슬 (Swap Chain)
에니메이션 구현 중 프레임과 프레임 사이에 끊김 현상을 방지하기위해, 이중 버퍼링(Double Buffering)을 사용합니다. 먼저, 한 프레임 전체를 화면 바깥의 텍스처, 즉 후면 버퍼에 그립니다. 그리고, 후면 버퍼에 저장된 하나의 프레임을 화면에 제시함으로써, 사용자에게 오직 완성된 프레임만 보여주어, 끊김 현상을 방지할 수 있습니다. 이때, 우리는 2개의 텍스처가 필요합니다. 전면 버퍼(화면에 제시되는 이미지 자료가 있는 텍스처) 그리고 화면 바깥의 후면 버퍼. 이렇게 2개의 텍스처를 사용하는 방법을 "이중 버퍼링"이라고 부릅니다. 추가적으로, 전면 버퍼와 후면버퍼는 하나의 교환 사슬(Swap Chain)을 형성하여, 각각의 포인터들을 맞바꾸어, 화면 제시 연산이 진행됩니다. 교환 사슬을 대표하는 인터페이스는 "IDXGISwapChain"으로 전면 버퍼 텍스처와 후면 버퍼 텍스처를 담고 있고, IDXGISwapChain::ResizeBuffers(버퍼 크기 변경) 메소드와 IDXGISwapChain::Present(화면 제시) 메소드를 제공합니다.
2.5 깊이 버퍼링(Depth Buffering)
깊이 버퍼는 각 픽셀의(이미지 텍스처의 자료 원소) 깊이 정보를 담고 있습니다. 따라서, 깊이 버퍼는 픽셀들과 1:1 매칭을 이루고 있습니다. 픽셀 깊이 버퍼의 값은 최소0.0에서 1.0까지의 값을 갖고, 시야 절두체 안에서 관찰자와 물체간의 먼 정도를 의미합니다. 예를 들면, 깊이 버퍼 값으로 0.0을 갖는 텍스처는 관찰자의 시야 절두체 안에서 제일 가까운 물체에 해당되고, 1.0을 갖는 텍스처는 가장 멀다고 할 수 있습니다. 위 그림을 보면, P1(구체의 픽셀), P2(원뿔의 픽셀), 그리고 P3(원기둥의 픽셀)은 시야창의 한 픽셀 "P"를 두고 경쟁합니다. 가장 가까운 픽셀이 그 외의 픽셀들을 가리므로, P1이 화면에 그려져야 제대로 된 결과로 보여집니다. P1이 그려지는 과정을 살펴보겠습니다. 여기서 우리는 원기둥, 구체, 그리고 원뿔 순으로 렌더링 된다고 가정해봅시다!
d = 화면에 나타날 픽셀의 깊이 버퍼의 값
P = 화면에 나타날 픽셀
1. P의 d = 1.0, P = P;
2. d3 < d = 1.0 , 따라서, d = d3로 udpate!
/*
먼저, P3(원기둥)가 렌더링 된다고 가정하자.
현재 깊이 버퍼의 값은 d = 1.0이며, 이는 d3(P3 의 깊이 버퍼 값) 보다 큽니다.
따라서, d = d3 로 업데이트 됩니다. P 또한 P3로 갱신됩니다.
*/
3. d1 < d = d3 , 따라서, d = d1, P = P1으로 update!
/*
다음으로, P1(구체)가 렌더링 됩니다.
현재 깊이 버퍼의 값은 d = d3, 그리고 P = P3 입니다.
d1은 당연하게도 현재 d 값보다 작기때문에, d = d1 으로 다시 갱신됩니다.
P 또한 P1으로 갱신되죠.
*/
4. d2 > d = d1, 따라서, 최종 d = d1 , P = P1
/*
마지막으로 P2(원뿔)가 렌더링 됩니다.
현재 깊이 버퍼의 값은 d = d1, 그리고 P = P1 입니다.
d2 > d = d1 , 따라서 갱신은 일어나지 않습니다.
*/
가장 작은 깊이 값, 즉 가장 가가운 거리로 측정되는 깊이 값을 후면 버퍼에 저장합니다. 결과적으로 구체가 관찰자의 시야 절두체 안의 픽셀 P에 렌더링 됩니다!
'게임개발 > DirectX12' 카테고리의 다른 글
[DirectX12]#Part2 - Direct3D의 기초_DXGI (0) | 2021.12.28 |
---|---|
[DirectX12]#Part2 - Direct3D의 기초_엘리어싱과 다중표본화 (0) | 2021.12.27 |
[DirectX12]#Part2 - Direct3D의 기초_자원과 서술자 (0) | 2021.12.27 |
[DirectX12]#Part2 - Direct3D의 기초_텍스처 (0) | 2021.12.23 |
[DirectX12]#Part2 - Direct3D의 기초_COM (0) | 2021.12.23 |