본문으로 바로가기

[DX12] 4.1 기본 지식

category Computer Science/DirectX 2024. 3. 17. 20:01

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)): 후면버퍼와 전면 버퍼를 교체하는 과정. 버퍼 내용을 바꾸는 것이 아니라 포인터만 교체.

Swap Chain
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 게임 프로그래밍 입문>