4.1 기본 지식
Direct3D 12의 개요와 중요 용어 위주로 정리
4.1.1 Direct3D 12의 개요
- Direct3D란 응용 프로그램에서 GPU(Graphics Processing Unit)을 제어하고 프로그래밍하는 데 쓰이는 저수준 그래픽 API(Application Programming Interface)이다.
- Direct3D 12는 이전 버전에 비해 CPU 부담을 줄이고 다중 스레드 지원을 개선하는 방향으로 발전
- 이전보다 추상화가 줄어들어 API를 사용하기가 어려워졌지만 성능이 개선되었다.
4.1.2 COM
- COM(Component Object Model)은 다양한 언어로 만들어진 소프트웨어 컴포넌트들이 자신의 기능을 다른 소프트웨어 컴포넌트들과 공유하고 통합할 수 있도록 하기 위해 고안된 이진 코드 레벨에서의 표준과 서비스.
- DirectX에서는 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 객체. (인터페이스라고 부르기도 함.)
- DirectX에서는 Microsoft::WRL::ComPtr이라는 COM을 감싸고 있는 스마트 포인터로 접근 및 사용한다.
4.1.3 텍스처 형식
- 텍스처는 자료 원소들의 2차원 배열.
- 텍스처는 이미지뿐만 아니라, 법선 매핑정보 등 범용적인 활용 가능.
- 텍스처는 특정 형식의 자료 원소(DXGI_FORMAT)들만 담을 수 있다. (DXGI_FORMAT의 열거형의 종류는 여기를 참고)
4.1.4 교환 사슬(Swap Chain)과 페이지 전환(Swapping)
- 교환 사슬(Swap Chain): 프레임 속도 안정화, 끊김 현상 감소 및 기타 여러 목적을 위해 그래픽 카드 및 그래픽 API에서 사용되는 일련의 프레임 버퍼.
- 전면 버퍼: 그래픽 카드의 출력으로 렌더링 되는 버퍼
- 후면 버퍼: 다음 프레임에 보일 이미지가 그려지는 버퍼
- 페이지 전환(Swapping(or Presentation)): 후면버퍼와 전면 버퍼를 교체하는 과정. 버퍼 내용을 바꾸는 것이 아니라 포인터만 교체.
By Kerdek (talk) - Own work (Original text: I (Kerdek (talk)) created this work entirely by myself.), Public Domain, Link
4.1.5 깊이 버퍼링
- 각 픽셀의 깊이 정보를 담는 텍스처. 픽셀의 깊이는 0.0 ~ 1.0 정규화된 값으로 표현.
- 깊이 버퍼링은 화가 알고리즘의 문제를 해결하기 위해서 사용되었으며 GPU의 지원을 받을 수 있다.
- 화가 알고리즘은 맞물린 형태의 물체를 처리할 수 없다.
- 화가 알고리즘은 물체들을 정렬 후 GPU에 전달해야 한다.
4.1.6 자원과 서술자
- GPU에서 사용할 리소스를 바인딩할 때 해당 리소스를 참조하는 서술자(Descriptor 또는 view라고도 함.)를 바인딩한다.
서술자를 사용하는 이유
- GPU 리소스는 렌더링 파이프라인 여러 곳에서 사용되며, 리소스의 일부만 사용될 수 있음.
- 때문에 서술자는 GPU 리소스가 어떤 렌더링 파이프라인에 어느 부분이 사용되는지 서술하고 있음.
- 무형식으로 사용되는 GPU 리소스는 서술자에서 형식을 지정할 수 있다.
서술자의 종류
- CBV: 상수 버퍼 서술
- SRV: 셰이더 자원 서술
- UAV: 순서 없는 접근 서술
- 표본추출기 서술자: Sampler 자원 서술
- RTV: 렌더 타깃 서술
- DSV: 깊이 스텐실 버퍼 서술
서술자 힙(Descriptor heap)
- 서술자들의 배열. 응용 프로그램이 사용하는 서술자들이 저장되는 곳.
- 서술자 종류마다 개별적인 서술자 힙이 필요.
- 한 종류의 서술자에 대해 여러 개의 힙을 둘 수도 있음.
4.1.7 다중표본화 이론
다중 표본화는 안티 앨리어싱 기법 중 하나로 초과표본화 보다 상대적으로 계산량이 적은 절충적인 기법.
초과표본화
- 화면 해상도보다 4배 크기로 후면버퍼에 그리고 출력 시 실제 크기로 다운샘플링 하는 방식. 다운샘플링 과정에서 4픽셀의 평균색을 계산하여 출력할 픽셀의 색상 선택.
- 후면 버퍼에 그리기 위해서 실제보다 4배 더 많은 메모리와 계산량이 요구됨.
다중 표본화
- 다중표본화는 이미지 색상을 픽셀마다 계산하고(픽셀의 중심에서) 그 색상과 부분 픽셀들의 가시성(깊이•스텐실 판정 필요)과 포괄도(부분픽셀을 다각형이 어느 정도나 덮고 있는지)를 이용해서 최종 색상을 결정.
- 메모리 사용량은 초과표본화와 마찬가지로 실제 출력보다 4배 큰 후면 버퍼를 사용.
- 모든 부분픽셀에 대한 색상을 결정하는 초과표본화 보다 실제 픽셀의 색상을 부분픽셀의 색상과 공유하는 다중 표본화의 계산량이 더 적음.
4.1.8 기능 수준(Feature Level)
- GPU가 지원하는 Feature Level을 나타내는 Enum값.
- 각 Feature Level에서 지원하는 구체적인 기능은 SDK 문서 참고.
4.1.10 DXGI(DirectX Graphics Infrastructure)
- Microsoft DXGI(DirectX Graphics Infrastructure)는 Direct3D 그래픽 런타임과 독립적일 수 있는 하위 수준 작업(커널 모드 드라이버 및 시스템 하드웨어와 통신)을 제공하는 API.
- DXGI는 여러 버전의 Direct3D에 대한 공통 프레임워크를 제공.
- ex. SwapChain, 전체 화면 모드 전환, 디스플레이 어댑터나 모니터, 지원되는 디스플레이 모드 같은 그래픽 시스템 정보 획득 가능.
4.1.11 기능 지원 점검
ID3D12Device::CheckFeatureSupport
메서드로 현재 그래픽 드라이버가 지원하는 기능을 질의할 수 있다.- 점검 가능한 기능들의 내용은 아래의 도큐먼트 참고.
https://learn.microsoft.com/ko-kr/windows/win32/api/d3d12/nf-d3d12-id3d12device-checkfeaturesupport
4.1.12 상주성
- 자원을 생성하면 자원이 GPU 메모리에 로드되고 파괴되면 언로드 된다.
- 아래의 메서드로 프로그래머가 직접 메모리를 로드•언로드를 제어할 수 있다.
HRESULT MakeResident(
UINT NumObjects,
[in] ID3D12Pageable * const *ppObjects
);
HRESULT Evict(
UINT NumObjects,
[in] ID3D12Pageable * const *ppObjects
);
출처:
한빛미디어 출판 <DirectX 12를 이용한 3D 게임 프로그래밍 입문>