Skip to content

Latest commit

 

History

History
79 lines (44 loc) · 6.46 KB

01-DirectX_11_Init.md

File metadata and controls

79 lines (44 loc) · 6.46 KB

DirectX 11 Init

Direct3D는 응용 프로그램이 3차원 그래픽 가속 기능을 이용해서 3차원 세계를 렌더링할수 있게 하는 저수준 API(Application Programming Interface)입니다. Direct3D는 그래픽 하드웨어를 제어할 수 있는 소프트웨어 인터페이스를 제공합니다. 응용 프로그램과 그래픽 하드웨어 사이에 Direct3D라는 간접층이 존재하는 덕분에 으용 프로그램 개발자는 3차원 그래픽 하드웨어가 Direct3D 11 대응 장치이기만 하다면 하드웨어 구체적인 세부사항을 거적할 필요가 없다.

이제부터는 DirectX 11을 사용하기 위해 Direct3D를 초기화 하는 구체적인 방법을 살펴봅니다.


Direct3D 초기화 과정은 크게 다음과 같이 8단계들로 구성됩니다.

  1. D3D11CreateDevice 함수를 이용해서 장치, 즉 ID3D11Device 인터페이스와 장치 컨텍스트, 즉 ID3DeviceContext 인터 페이스를 생성한다.
  2. ID3D11Device::CheckMultisampleQualityLevels 메서드를 이용해서 MSAA(멀티 샘플링) 수준 지원 여부를 점검.
  3. 생성할 스왑 체인(swap chain)을 서술하는 DXGI_SWAP_CHAIN_DESC 구조체를 채운다.
  4. 생성한 장치를 질의해 IDXGIFactory 인터페이스를 얻어와 CreateSwapChain 메서드를 통해 IDXGISwapChain 인스턴스를 생성한다.
  5. 스왑 체인의 후면 버퍼에 대한 렌더 타겟 뷰를 생성한다.
  6. 깊이/스텐실 버퍼와 그에 연결되는 깊이/스텐실 뷰를 생성한다.
  7. 렌더 타겟뷰와 깊이/스텐실 뷰를 Direct3D가 사용할 수 있도록 렌더링 파이프라인의 출력 병합기 단계에 묶는다.
  8. 뷰포트를 설정한다.

1. 장치와 장치 컨텍스트 생성

Direct3D 초기화의 시작은 Direct3D 11 장치(ID3D11Device)와 그 컨텍스트(ID3D11DeviceContext)를 생성하는 것입니다. 이 두 인터페이스는 Direct3D의 주된 인터페이스로, 물리적인 그래픽 장치 하드웨어에 대한 소프트웨어 제어기라고 생각하면 됩니다. 즉, 응용 프로그램은 이 인터페이스들을 통해서 하드웨어에게 할 일(GPU 메모리에 자원 할당, 후면 버퍼 지우기, 자원을 여러 파이프라인의 단계에 묶기, 기하구조 그리기 등)을 지시합니다.

  • ID3D11Device 인터페이스는 기능 지원 점검과 자원 할당(버퍼, 텍스처등)에 쓰입니다.
  • ID3D11DeviceContext 인터페이스는 렌더 대상을 설정하고, 자원을 그래픽 파이프 라인에 묶고, GPU가 수행할 렌더링 명령들을 지시하는 데 쓰입니다.

2. MSAA 품질 수준 지원 점검

모니터의 픽셀들이 무한히 작지는 않기 떄문에, 선을 픽셀들의 배열로 근사할 때 생기는 '계단 현상'이라고도 하는 앨리어싱(aliasing)효과가 나타납니다. 다행히 엘리어싱 제거(antialiasing)를 기법들이 존재하며, 그중 하나가 다중표본화(multisampling)입니다. 다행히 Direct3D는 다중표본화 기법을 지원합니다.

장치를 생성했으니, 이제 하드웨어가 멀티 샘플링을 위한 품질 수준을 지원하는지 점검할 수 있습니다.


3. 스왑 체인의 설정

화면이(애니메이션) 번쩍번쩍 거리는 현상을 방지하기 위해 화면의 한 프레임 전체를 화면 바깥의 텍스처에 그립니다. 그런 텍스처를 후면 버퍼(back buffer)라고 부릅니다. 주어진 한 프레임을 위해 장면 전체를 후면 버퍼에 그리고, 이것을 전면버퍼와 바꿔치기 함으로써 하나의 완전한 프레임으로서 화면에 표시합니다. 이 기법을 더블 버퍼링(double buffering)이라고 부르며, 전면 버퍼와 후면 버퍼는 하나의 스왑 체인(swap chain)을 형성합니다.

다음 단계는 스왑 체인을 생성하는 것입니다. 이를 위해서는 우선 DXGI_SWAP_CHAIN_DESC 구조체의 인스턴스를 만들어서 원하는 스왑 체인의 특성들을 설정해야 합니다.

4. 스왑 체인의 생성

스왑 체인을 설정하는 구조체를 만들었다면, 다음으로는 IDXGIFactory 인스턴스를 통해 스왑 체인 인터페이스(IDXGISwapChain)를 생성합니다.

DXGI(DirectX Graphics Interface)는 Direct3D와는 개별적인 API로, 스왑 체인 설정이나 그래픽 하드웨어 나열, 창 모드와 전체화면 모드 전환 등 그래픽 관련된 작업을 처리합니다.


5. 렌더 타겟 뷰의 생성

어떤 자원을 파이프라인의 단계에 직접 묶는 것은 아닙니다. 대신 반드시 자원에 대한 뷰를 생성하고 그 뷰를 파이프라인 단계에 묶어야 합니다.

후면 버퍼를 파이프라인의 출력 병합기(ouput merger) 단계에 묶으려면(그래야 Direct3D가 버퍼에 뭔가 그릴 수 있습니다.) 우선 후면 버퍼에 대한 렌더 타겟 뷰를 생성해야 합니다.


6. 깊이/스텐실 버퍼와 뷰 생성

한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정하기 위해, Direct3D는 깊이 버퍼링 또는 z-버퍼링이라는 기법을 사용합니다. 깊이 버퍼(depth buffer)는 이미지 자료를 담지 않는 텍스처의 한 예입니다.

깊이 버퍼는 그냥 깊이 정보를 담는(스테텐실을 사용할 경우 스텐실 정보도 담는) 2차원 텍스트입니다. 2차원 텍스ㅌ처를 생성할 때에는 생성할 텍스처를 서술하는 D3D11_TEXTURE2D_DESC 구조체를 설정하고 장치의 CreateTexture2D 메서드를 통해 생성합니다.

후면 버퍼와 마찬가지로, 깊이/스텐실 버퍼를 사용하려면 그에 대한 깊이/스텐실 뷰를 생성해야 합니다.

7. 뷰들을 출력 병합기 단계에 묶기

후면 버퍼와 깊이/스텐실 버퍼에 대한 뷰들을 생성했으니, 이 뷰들을 파이프라인의 출력 병합기 단계에 묶습니다. 이 과정을 거쳐야 비로소 자원들이 파이프라인의 렌더 대상과 깊이/스텐실 버퍼로 작용하게 됩니다.

8. 뷰포트 설정

보통은 3차원 장면을 후면 버퍼 전체에 그립니다. 그러나 원한다면 3차원 장면을 후면 버퍼의 일부를 차지하는 직사각형 역영에만 그리는 것도 가능합니다. 장면을 그려 넣고자 하는 후면 버퍼의 부분직사각형 영역을 뷰포트(viewport)라고 부릅니다.

뷰포트를 설정하는 구조체(D3D11_VIEWPORT)를 만들고, 장치의 RSSetViewports 메서드를 이용해서 Direct3D에게 뷰포트를 알려줍니다.