DirectXAPI
렌더링을 하기위해서는 먼저 DirectX의 API중에서 Device와 DeviceContext 그리고 SwapChin을 생성해주어야한다.
Device는 그래픽 카드를 추상화한 객체이다. 이는 오브젝트의 할당 및 해제, 렌더링, 그래픽 드라이버 및 하드웨어와의 통신을 담당한다. Direct3D 11은 디바이스라는 개념이 2가지로 분리하는데, 하나는 생성을 담당하는 Device Object이고, 다른 하나는 Device Object에서 생성한것들을 설정하거나 제어하는 Device Context Object이다. 이 두 오브젝트를 이용하여 렌더링을 하게 되는데, 만약 후면버퍼를 설정하지 않는다면 WindowAPI때 처럼 렌더링 잔상이 남게 될 것이다. Swapchain은 후면 버퍼를 관리하고 렌더링 관련하여 컨트롤할 수 있도록 도와준다. 내부적으로 2개 이상의 버퍼를 캡슐화하며, 이 버퍼들은 장면을 그리기 위한 공간이기도 하고, 화면에 보여질 버퍼이기도 하다. 기본적으로 프론트 버퍼(Front buffer)와 백 버퍼(Back buffer) 2개의 버퍼로 구성되며, 기본적으로 더블 버퍼링의 개념이 베이스다.
Device
각 애플리케이션에는 디바이스가 하나 이상 있어야 하며, D3D11CreateDevice 또는 D3D11CreateDeviceAndSwapChain을 통해 생성할수 있다. 각 디바이스는 원하는 기능을 DeviceContext를 통해 사용할 수 있다.
DeviceContext
디바이스가 사용되는 상황 또는 설정이 포함되며, 디바이스가 소유한 리소스를 사용하여 파이프라인 상태를 설정하고 렌더링 명령을 생성하는 데 사용된다.
SwapChain
다중 버퍼에 관한것을 담당하며, SwapChain의 Present함수는 WindowAPI의 BitBly과 유사한 기능인 고속 후면버퍼 복사를 수행한다.
Direct3D 11의 디바이스 소개 - Win32 apps
Direct3D 11 개체 모델은 리소스 만들기 및 렌더링 기능을 디바이스 및 하나 이상의 컨텍스트로 구분합니다. 이 분리는 다중 스레딩을 용이하게 하도록 설계되었습니다.
learn.microsoft.com
스왑 체인이란? (Direct3D 9) - Win32 apps
스왑 체인은 사용자에게 프레임을 표시하는 데 사용되는 버퍼의 컬렉션입니다.
learn.microsoft.com
DXGI 대칭 이동 모델 - Win32 apps
Windows 8 DXGI 1.2에서 대칭 이동 프레젠테이션 모델 및 관련 현재 통계에 대한 지원을 추가합니다.
learn.microsoft.com
Device의 구성
앞서 언급하였듯이, Device는 렌더링에 필요한 것들을 생성하는것을 담당한다. 그 요소들을 도식화하면 아래와 같다.
CreateGeoMetry: IA단계에서 필요한 정보들을 생성하는 단계이다.
CreateInputLayOut:VSBlob의 정보로 Shader의 데이터를 분류하는 단계이다.
CreateVertexShader:VSBlob을 통해 쉐이더 객체를 생성하고 쉐이더파일의 Vertex데이터를 VS에 설정한다.
※Blob이란? Blob은 컴파일된 쉐이더 바이너리 데이터를 의미한다.
CreateRasterizerState:Rasterizer단계에서 보간에 필요한 것들을 설정하는 단계이다. 기본적으로 FillMode/CullMode/FrontCounterClockwise가 있다.
CreatePixelShader:VS와 마찬가지로 PSBlob을 통해 쉐이더 객체를 생성하고 Pixel데이터를 PS에 설정한다.
CreateShaderResourceView:리소스를 불러오는 단계이며, 흔히 말하는 Texture가 이 단계에 속한다.
CreateConstatntBuffer: 게임에서 물체는 항상 고정되어 있지 않지만 VertexBuffer는 설정을 한 후에 수정이 불가하다. 그렇다고 VertexBuffer를 새로 생성 한다면 이미 만들어 진것을 반복해서 생성 하게 되는 메모리낭비가 발생 하기 때문에 VS단계에서 ConstantBuffer를 만들어주는것이다. 즉,GeoMetry자체는 고정되어 있지만, 렌더링되는 쉐이더는 ConstantBuffer에 의해 원하는 위치로 이동한다는 뜻이다. 이 단계에서는 그러한 ConstantBuffer를 설정하는 단계이다.
DeviceContext의 구성
DeviceContext는 Device에서 생성한 것들을 설정 및 제어하는 것을 담당한다. Context는 두 단계에서 역할을 수행하는데 Tick마다 갱신되는 Update에서는 SwapChain을 이용하여 화면에 결과물을 그려주는 역할을 하게 되고 Render부분에서는 지난 포스팅에서 보였던 RenderingPipeLine을 따라 물체를 렌더링하는 역할을 맡게 된다.
Update
Map과 UnMap을 통해 GPU의 갱신을 막은 다음 데이터를 복사하고 다시 GPU 엑세스를 사용하는 방식으로 데이터를 갱신한다. 이때 생성했던 ConstantBuffer를 Map 안에 넣는것을 통해 랜더링 결과를 움직일수 있다.
Render
Render의 과정은 RenderBegin-Render-RenderEnd가 있다. RenderBegin에서는 Render에서 필요한 것들을 바인딩하거나 초기화하는 단계이며, Render단계에서는 RenderingPipeLine의 과정을 수행한다. 마지막으로 RenderEnd에서는 SwapChain을 이용하여 후면버퍼를 고속으로 복사하는 기능을 수행한다.
Render Begin/End
RenderBegin에서는 RenderTarget의 설정과 바인딩과 Viewport설정을 담당한다.RenderEnd에서는 후면버퍼를 고속복사하여 화면을 교체해주는 작업을 수행한다.
※RenderTarget:그리기 위한 리소스를 만들고 실제 그리기 작업을 수행하는것을 의미한다.
※RenderTargetView:그래픽 파이프라인 내의 반사 텍스처 또는 다른 목적으로 렌더링될 수 있는 복잡한 장면을 사용하거나 렌더링하기 전에 화면에 추가 픽셀 셰이더 효과를 추가할 수 있다.
Render
Render단계에서는 RenderingPipeLine을 통해 Device에서 생성했던 것들을 그려주는 역할을 수행한다. 본래라면 더 많은 과정을 거쳐야 되지만 본 포스팅에서는 IA->VS->RS->PS->OM단계를 다루며 지난 포스팅의 설명을 참고 하는 것이 좋다.
DX)1.렌더링 파이프라인
DirectX DirectX는 Window환경에서 GPU와 같은 H/W를 제어할수 있도록 제공하는 API이다. 이러한 GPU를 사용하려는 목적은 렌더링과 같이 연산량이 많으나 단순한 연산일 경우 CPU는 연산뿐만 아니라 다양
pjnull.tistory.com
'게임엔진 > DirectX' 카테고리의 다른 글
DX) 6. Tessellation (0) | 2023.06.01 |
---|---|
DX) 4. IA(InputAssembler) (0) | 2023.03.03 |
DX)3.Device (0) | 2023.03.03 |
DX)1.렌더링 파이프라인 (0) | 2023.02.11 |
DirectX) 프로젝트 설정 (0) | 2022.02.26 |
댓글