🍟 Direct3D 장치 초기화 과정 및 용어 정리
1. 서술자(descriptor) 객체
서술자는 자원 자료를 지정하는 수단일 뿐만 아니라 자원을 gpu에 서술하는 수단이기도 하다. 서술자는 direct3d에게 자원의 사용법을(자원을 파이프라인의 어떤 단계에 묶어야 하는지) 말해준다. Dirext3D 응용 프로그램은 자원을 직접 파이프라인에 묶지 않는다. 대신, 그리기 호출이 참조할 서술자들을 지정함으로써 자원을 파이프라인에 묶는다.
2. 서술자 종류(형식)
- CBV 서술자 : constant buffer(상수 버퍼)를 서술한다.
- SRV 서술자 : shader resource(셰이더 자원)을 서술한다.
- UAV 서술자 : unordered access view(순서 없는 접근)을 서술한다.
- 표본추출기 서술자 : sampler(표본추출기)자원을 서술한다. ( 텍스처 적용에 쓰인다. )
- RTV 서술자 : render target(렌더 대상) 자원을 서술한다.
- DSV 서술자 : depth/stencil (깊이/스텐실) 자원을 서술한다.
3. 서술자 힙(descriptor heap) 서술자들의 배열.
파이프라인의 여러 단계마다 개별적인 서술자가 필요하다. 서술자들은 응용 프로그램의 초기화 시점에 생성해야 한다.
4. 교환 사슬과 페이지 전환
Double Buffering(이중 버퍼링) : 두 개의 버퍼(front, back)를 사용하는 방법
전면 버퍼와 후면 버퍼는 하나의 교환 사슬을 형성한다. Direct3D에서 교환 사슬을 대표하는 인터페이스는 IDXGUSwapChain이다.
5. 깊이 버퍼
depth buffer(깊이 버퍼)는 이미지 자료를 담지 않는 텍스처의 한 예이다. depth buffer는 각 픽셀의 깊이 정보를 담는다. 픽셀의 깊이는 0.0 에서 1.0까지의 값.
- 0.0은 view frustum(시야 절두체)안에서 관찰자에 최대한 가까운 물체.
- 1.0은 view frustu에서 관찰자와 최대한 먼 물체
🍔 그래픽 프로그래밍의 CPU와 GPU의 상호작용
그림을 그리기 위한 CPU에서 부터 GPU로 명령이 이루어지는 순서
1. CPU는 그리기 명령들이 담긴 명령 목록(command List)을 Direct3D API를 통해서 대기열에 제출한다.
ex) RSSetViewports(), ClearRenderTargetView ..
2. 명령들을 대기열에 제출하기 해서는 ID3D12CommandQueue::ExecuteCommandList()함수를 호출한다.
3. ID3D12CommandList::Reset()메서드를 호출하면 새로운 명령들을 기록하는 데 재사용 할 수 있다.
추가 설명 및 주요 내용
* Direct3D 12에서 명령 대기열을 대표하는 인터페이스는 ID3D12CommandQueue이다.
* ID3D12GraphicsCommandList 인터페이스에는 명령들을 명령 목록에 추가하는 여러 메서드가 있다.
* 명령 기록이 끝난 후( ID3D12GraphicsCommandList::Close()) 이 후에 명령 대기열에 리스트를 제출 해야 한다.
* 명령 목록에는 ID3D12CommandAllocator 형식의 메모리 할당자가 하나 연관된다. 명령목록에 추가된 명령들은 이 할당자의 메모리에 저장된다.
* GPU가 명령 할당자에 담긴 모든 명령을 실행했음이 확실해지기 전까지는 명령 할당자를 재설정하지 말아야 한다.
* CPU와 GPU 동기화를 위한 수단으로 ID3D12Fence 인터페이스를 사용한다.
'🎯 game engine > ◽ directX12' 카테고리의 다른 글
[DirectX12] 큐브맵 만들기 / StructuredBuffer (0) | 2024.11.26 |
---|---|
[DirectX12] 스텐실(stencil) 거울 만들기 (0) | 2024.11.07 |
[DirectX12] 조명의 종류 (0) | 2023.12.19 |
[DirectX12] 조명 연산을 위한 법선 벡터, 법선 벡터의 변환 (0) | 2023.12.14 |
[DirectX12] 원기둥의 정점 찍기/렌더링 과정 이해하기 (1) | 2023.12.12 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!