ComPtr란?
: C++/WinRT에서 사용하는 스마트 포인터
D3D11 프로그래밍에서는 Direct3D 11 API를 사용하기 때문에 ComPtr을 사용하면
안전하고 편리하게 COM객체를 관리할 수 있다.
DXGI(DirectX Graphic Infrastructure)란?
: Direct3D 10 이상 버전을 사용하는 애플리케이션에서 GPU를 관리하는데 필요한 기능을 제공하는 라이브러리
FAILED 매크로란?
D3D11의 장치를 생성하고 난 후에는 FAILED 매크로를 통해 제대로 만들어졌는지 확인하는 것이 좋다.
FAILED 매크로는 성공하면 0을 반환하고 실패하면 0 이외의 수를 반환한다.
관례상 성공하면 S_OK(0x00000000), 실패하면 E_FAIL(0x80004005)를 반환한다.
1. Device, Context 생성
D3D11CreateDevice 함수를 통해
Device와 DeviceContext를 생성한다.
인자로 각각의 포인터가 들어가고 성공 시 주소가 할당된다.
2. SwapChain 생성
화면에 표시될 윈도우 핸들,
창모드 표시 여부,
버퍼 갯수,
버퍼 사용목적,
버퍼 특성, 렌더링 품질 등을 설정해서 SwapChain의 특성을 설정한다.
SwapChain을 생성하려면 몇 단계의 과정을 거쳐야 한다.
1. 디바이스의 QueryInterface를 통해 IDXGIDevice를 생성한다.
- IDXGIDevice는 GPU의 전원상태, GPU 온도, 사용량 등을 얻을 수 있다.
- GPU에 연결된 모니터를 얻을 수 있고 화면 해상도를 변경하거나 모니터 밝기를 조절할 수 있다.
2. 생성된 IDXGIDevice를 통해 IDXGIAdapter를 생성한다.
- IDXGIAdapter는 시스템의 그래픽 카드의 정보를 얻을 수 있다.
- 그래픽 카드의 메모리 크기, 그래픽 카드의 버전, 그래픽 카드의 제조사 등
3. 생성된 IDXGIAdapter를 통해 IDXGIFactory를 생성한다.
- IDXGIFactory는 그래픽 장치, 출력, 스왑 체인, 선형 버퍼를 생성하는데 사용한다.
- 화면 해상도를 변경하거나 색상을 변경할 수 있다.
- DXGI 기능을 사용할 때 필수적으로 필요한 인터페이스.
4. 생성된 IDXGIFactory에서 SwapChain을 생성한다.
- SwapChain은 하나 이상의 버퍼로 구성된다.
- 각 버퍼는 화면에 표시될 이미지를 담고 있음
- 이미지를 버퍼에 렌더링한 후 화면에 표시한다.
- 더블버퍼링 기법을 사용해 화면을 부드럽게 구성한다.
__uuidof란?
- 인터페이스의 고유 식별자를 얻는데 사용한다.
- GetParent 함수는 인자로 UUID를 받아 해당 인터페이스를 생성한다.
3. RenderTarget, View 생성
SwapChain이 생성된 후에는 SwapChain이 소유한 화면 사이즈의 텍스쳐를 RenderTarget이라는 텍스쳐에 받아온 후
이 RenderTarget을 이용해 RenderTargetView를 생성한다.
View란?
- 렌더링할 때 사용할 자원(텍스쳐나 버퍼)의 영역을 지정하는 방법을 의미
- View는 자원의 창이라고 생각할 수 있고, 자원의 일부분만 GPU에 접근할 수 있도록 한다.
- Shader Resource View의 경우 텍스쳐나 버퍼를 쉐이더의 데이터 원본으로 사용할 수 있게 한다.
- RenderTargetView나 DepthStencilView는 자원을 렌더링 대상으로 사용할 수 있게 한다.
4. DepthStencilBuffer, View 생성
- 깊이, 스탠실 정보를 저장하는 특별한 리소스
- Z버퍼라고 하는 카메라에서 각 픽셀의 거리를 나타내는 값을 저장하고
다른 개체에 의해 표시되는 픽셀과 숨겨진 픽셀을 결정한다.
- 스텐실 버퍼는 마스킹 또는 스탠실 테스트와 같은 용도로 사용된다.
스텐실 테스트란?
스텐실 버퍼에 저장된 스텐실 값을 기반으로 개별 픽셀의 렌더링을 제어하는 기술
스텐실 테스트 시 GPU는 렌더링되는 픽셀과 개발자가 설정한 참조 값을 비교하여
스텐실 값이 테스트를 통과하면 픽셀을 렌더링하고 아니면 폐기한다.
3D 장면을 렌더링할 때 GPU는 스텐실 버퍼의 깊이 및 스텐실 정보를 사용하여
그려야 할 픽셀과 버려야 할 픽셀을 결정한다.
이 프로세스를 깊이 테스트 및 스텐실 테스트라고 한다.
깊이 테스트란?
픽셀의 깊이 값(Z값)과 깊이 버퍼에 이미 저장된 값을 비교하여
새 깊이 값이 카메라에 더 가까우면 그린다.
생성 방법은 RenderTarget, View와 동일하게 텍스쳐를 만들고 그 텍스쳐를 이용해 View를 만든다.
5. 화면 초기화
- 디바이스 컨텍스트를 통해 ClearRenderTargetView를 호출하고 인자로 뷰와 색상을 넣어 화면을 초기화한다.
6. 화면에 그리기
- SwapChain의 멤버 함수 Present를 통해 RenderTarget에 그려진 픽셀들을 화면에 그린다.
- 정확히는 백 버퍼를 프론트 버퍼로 교체하여 렌더링된 이미지를 화면에 표시한다.
'DirectX > [AssortRock] DirectX11 2D' 카테고리의 다른 글
230118_ConstantBuffer (0) | 2023.01.18 |
---|---|
230116_D2D 삼각형 그리기 (0) | 2023.01.16 |
230113_D2D 삼각형 그리기 예습 (0) | 2023.01.14 |
230112_D2D 렌더링 파이프라인 개요_2 (0) | 2023.01.12 |
230111_D2D 렌더링 파이프라인 개요 (0) | 2023.01.11 |
댓글