Dx11

[DirectX11] DirectX11초기화

겜도리도리 2023. 5. 31. 15:02
반응형

개요

DirectX11을 Visual Studio에서 초기화하는 방법에 대해 서술한다.

이 내용은 DirectX11을 이용한 3D게임 프로그래밍 입문의 내용을 읽고 정리했습니다.

초기화 해줘야 하는 것들

1. ID3D11Device, ID3D11DeviceContext : D3D11CreateDevice 함수를 사용해 생성

2. 스왑 체인의 특성을 서술하는 DXGI_SWAP_CHAIN_DESC 구조체 채우기

3. IDXGIFactory를 사용해 IDXGISwapChain 인스턴스 생성

4. 스왑 체인의 백 버퍼에 대한 렌더 타겟 뷰 생성

5. 깊이/스텐실 버퍼와 여기에 연결되는 깊이/스텐실 버퍼 뷰 생성

6. 렌더 타켓 뷰와 깊이/스텐실 뷰를 DirectX3D가 사용할 수 있도록 렌더링 파이프라인의 OutputMerge 단계에 묶음

7. 뷰포트 설정

 

1. ID3D11Device 생성

ID3D11Device는 기능 지원 점검과 자원 할당에 사용된다.

ID3D11DeviceContext는 렌더 대상을 설정하고, 자원을 그래픽 파이프 라인에 묶고, GPU가 수행할 렌더링 명령을 지시하는데 사용된다.

D3D11CreateDevice는 Device와 DeviceContext를 생성하는 함수이다.

 

pAdapter : 널 값을 사용하면 기본 디스플레이 어댑터를 사용한다.

DriverType : 일반적으로는 D3D_DRIVER_TYPE_HARDWARE를 사용한다. 

Softeware : 소프트웨어 구동기를 지정하는데, 하드웨어를 사용하므로 널 값을 사용한다.

Flags : 추가적인 장치 생성 플래그를 지정한다. D3D11_CREATE_DEVICE_DEBUG(디버그 모드 빌드에서 디버그 계층 활성화)와 D3D11_CREATE_DEVICE_SINGLETHREADED(멀티 스레드 환경에서 호출되지 않을 때 성능 향상) 등이 있다.

pFeatureLevels : 기능 점검 순서 배열을 받는다. 널 값을 지정하면 지원되는 최고 수준 기능이 선택된다.

FeatureLevels : pFeatureLevels의 원소 개수를 넣어주면 된다. 널 값을 지정하면 매개변수는 0으로 지정하면 된다.

SDKVersion : 항상 D3D11_SDK_VERSION을 지정한다.

ppDeivce : 생성한 Device를 돌려준다.

pFreatureLevel : pFeatureLevels가 널이였다면 지원되는 가장 높은 기능 수준, 아니라면 pFeatureLevels에서 처음으로 지원되는 기능을 돌려준다.

ppImmediateContext : 생성한 DeviceContext를 돌려준다.

 

2. DXGI_SWAP_CHAIN_DESC 구조체 채우기

Swap Chain을 생성하기 위해서는 DXGI_SWAP_CHAIN_DESC 구조체를 채워야 한다.

 

BufferDesc : 생성하는 백 버퍼의 속성을 서술한다.

SampleDesc : 다중표본화를 위해 추출할 표본 개수와 품질 수준을 서술한다.

BufferUsage : 버퍼의 용도를 서술한다. 백 버퍼에 렌더링할 것이므로, DXGI_USAGE_RENDER_TARGET_OUTPUT으로 지정한다.

BufferCount : 백 버퍼 개수를 설정한다. 일반적으로는 1개 사용하지만, 2개 사용할 수도 있다. (삼중 버퍼링)

OutputWindow : 렌더링 결과를 표시할 창의 핸들

Windowed : 창 모드를 원하면 true, 전체화면 모드는 false

SwapEffect : 교환 효과를 서술한다.DXGI_SWAP_EFFECT_DISCARD를 지정하면 가장 효율적인 방법을 선택한다.

Flags : 추가적인 플래그이다. DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH를 지정하면, 전체화면 모드로 전환할 때 현재 백 버퍼 설정에 가장 부합하는 디스플레이 모드가 자동 선택된다. 지정하지 않으면 현재 데스크탑 디스플레이 모드가 사용된다.

 

3. IDXGIFactory를 사용해 IDXGISwapChain 인스턴스 생성

구조체를 만든 후에는, IDXGIFactory 인스턴스를 사용해 CreateSwapChain 함수를 호출해서 IDXGISwapChain을 생성해야 한다. 오류를 피하려면 장치 생성에 쓰인 IDXGIFactory 인스턴스를 사용해야 하는데, 다음과 같은 질의를 거쳐야 한다.

 

4. 렌더 타겟 뷰(Render Target View) 생성

자원을 파이프 라인의 단계에 직접 묶지 않고, 자원에 대한 뷰를 생성하고 이 뷰를 파이프라인 단계에 묶어야 한다.

따라서 백 버퍼를 파이프 라인의 Ouput Merge 단계에 묶으려면 백 버퍼에 대한 렌더 타겟 뷰를 생성해야 한다.

 

GetBuffer 함수를 호출해서 SwapChain을 가리키는 포인터를 얻는다.

GetBuffer 함수는 다음과 같은 매개변수를 받는다.

 

Buffer : 백 버퍼의 인덱스를 지정한다. 백 버퍼를 하나만 사용하는 경우 0을 지정하면 된다.

riid : 버퍼의 인터페이스 형식을 지정한다. 일반적으로는 ID3D11Texture2D가 쓰인다.

ppSurface : 백 버퍼를 가리키는 포인터를 돌려준다.

 

렌더 타겟 뷰를 생성하려면 CreateRenderTargetView를 사용한다.

 

pResource : 렌더 타겟으로 사용할 자원이므로 백 버퍼를 넣어준다.

pDesce : 자원에 담긴 원소들의 자료 형식을 서술한다. 형식을 완전히 지정했다면 널 값을 넣어줄 수 있다.

ppRTView : 생성한 렌더 타겟 뷰를 돌려준다.

 

5. 깊이/스텐실 버퍼 및 깊이/스텐실 버퍼 뷰 생성

깊이 버퍼는 깊이 정보를 담는 2차원 텍스처이다. 2차원 텍스처를 생성할 때는 생성할 텍스처를 서술하는 D3D11_TEXTURE2D_DESC 구조체를 채우고 CreateTextrue2D 함수를 호출해야 한다.

D3D11_TREXTURE2D_DESC 구조체의 정의는 다음과 같다.

 

Width / Height : 텍스처의 너비 / 높이

MipLevels : 밉맵 수준의 개수, 깊이 스텐실 버퍼를 위한 텍스처에서는 하나만 있으면 됨

ArraySize : 텍스처 배열의 텍스처 개수, 깊이 스텐실 버퍼의 경우에는 하나만 있으면 됨

Format : 텍셀 형식

SampleDesc : 다중 표본 개수 및 품질 개수 결정, 렌더 타겟에 쓰인 설정과 같아야 함.

Usage : 텍스처의 용도, 일반적으로 D3D11_USAGE_DEFAULT를 사용한다.

BindFlags : 자원에 어떤 식으로 묶을 것인지를 결정한다. 깊이 스텐실 버퍼의 경우 D3D11_BIND_DEPTH_STENCIL 플래그를 지정한다.

CPUAccessFlags : CPU가 자원에 접근하는 방식을 결정한다. 깊이 스텐실 버퍼는 GPU에서만 읽고 쓰므로 CPU에서는 전혀 접근할 필요가 없다. 0을 지정한다.

MiscFlags : 기타 플래그, 깊이 스텐실 버퍼에서는 적용되지 않으므로 0을 지정한다.

 

구조체를 채운 뒤에는 CreateTexture2D함수와 CreateDepthStencilView 함수를 호출해 준다.

CreateTexture2D의 두번째 매개변수에는 텍스처에 채울 초기 자료를 가리키는 포인터를 넣어주는데, 깊이 스텐실 버퍼에서는 따로 자료를 채울 필요가 없으므로 nullptr을 기록한다.

 

CreateDepthStencilView 함수의 두 번째 매개변수에는 D3D11_DEPTH_STENCIL_VIEW_DESC 구조체를 가리키는 포인터를 넣어주는데, 형식을 완전히 지정해서 자원을 생성했다면 널 값을 지정해도 된다.

 

6. OutputMerge 단계에 묶기

앞서 생성한 뷰 들을 OutputMerge 단계에 묶어줘야 한다. OMSetRenderTagets 함수를 사용한다.

OMSetRenderTagets에 사용되는 매개변수는 다음과 같다.

 

NumViews : 묶고자 하는 렌더 대상의 개수를 지정한다.

ppRenderTagetVies : 렌더 타겟 뷰를 가리키는 포인터들을 담은 배열의 첫 원소를 가리키는 포인터이다.

pDepthStencilView : 파이프 라인에 묶을 깊이 스텐실 뷰를 가리킨다.

 

7. 뷰포트 설정

장면을 그려 넣고자 하는 백 버퍼의 직사각형 부분을 뷰포트라고 한다.

D3D11_VIEWPORT는 뷰포트를 서술하는 데 쓰이는 구조체이다.

 

TopLeftX, TopLeftY, Width, Height : 뷰포트 직사각형의 위치와 크기이다.

MinDepth / MaxDepth : 깊이 버퍼 값의 최소 / 최댓값이다. Direct3D가 사용하는 버퍼 값의 범위는 0부터 1까지이므로, 일반적으로는 이 값을 사용한다.

 

Direct3D에게 뷰포트를 알려줄 때는 RSSetViewports 함수를 사용한다.

 

NumViewports : 묶을 뷰포트 개수이다.

pViewports : 뷰포트를 가리키는 포인터이다.

 

 

반응형

'Dx11' 카테고리의 다른 글

[DirectX11] Index 버퍼 생성하기  (0) 2023.06.20
[DirectX11] Vertex 버퍼 생성하기  (0) 2023.06.09