공부/Graphics, DirectX, 포트폴리오 구조

DirectX 용어 정리

sudo 2021. 11. 27. 23:00

DirectX 수업을 들으면서 개인적으로 헷갈리거나 추상적으로 느껴지는 용어들을 정리해두려고 한다

 

* 검색해가면서 공부한 정보들을 모은거라 틀린 부분이 있을 수 있습니다 *

 

엔진 - 게임 제작에 필요한 라이브러리를 모아놓은 것

 

드라이버 - 렌더링에 필요한 GPU에게 명령을 내릴 수 있게 만든 객체

 

SDK(Sofeware Development Kit) - 개발자들이 개발하는데 사용하는 도구. 컴파일러, 디버거, 문서, 라이브러리, API 등이 포함될 수 있다

 

뷰포트 - 간단하게 말하면 윈도우에 보여질 영역을 의미한다. DirectX에서는 뷰포트에 화면을 출력하고, 뷰포트를 윈도우 클라이언트 영역에 맞춰서 윈도우에 보여질 수 있게 한다고 한다

 

페이지 플리핑 - 백버퍼와 화면 버퍼를 스왑해주는 기법. 예를 들어 백버퍼를 A, 화면 버퍼를 B라고 하면 처음엔 화면 버퍼가 B지만 페이지 플리핑이 일어나면 A는 백버퍼->화면 버퍼가 되고, B는 화면 버퍼 -> 백버퍼가 된다.

-> WINAPI의 더블 버퍼링처럼 복사를 하지 않으므로 더블 버퍼링 기법 보다 빠르다.

 

깊이 버퍼 - 백버퍼와 동일한 크기를 가진, 깊이 값을 가진 버퍼이다. 값이 1이라는 것은 가장 멀리 있는 것을 의미하고, 0은 가장 가까이 있는 것을 의미한다. 원래 깊이 버퍼는 모든 값을 1이 초기화 되어 있다. 깊이 버퍼를 통해서 출력되는 순서와 상관없이 화면에서 가려질 부분과 보여질 부분을 각 픽셀마다 선별해서 출력할 수 있다. 예를 들어서 아래 그림처럼 낙타에 병사의 일부가 가려져 있는 상황으로 가정해보자

병사의 모든 깊이 버퍼는 0.5, 낙타는 0.3이라고 가정을 하자. 먼저 낙타를 화면에 그리려고 하니 낙타의 모든 깊이 버퍼값이 0.5이므로 현재 깊이 버퍼 값인 1보다 전부 작으므로 가려지는 부분 없이 모두 화면에 그릴 수 있다. 그러고 나서 병사 이미지를 출력하려고 깊이 값을 확인하니 이미 낙타가 그려진 부분은 깊이 값이 0.3이라 병사의 깊이 값보다 작아서 그 부분은 그리지 않고 낙타가 그려지지 않아서 여전히 깊이 값이 1인 부분에만 병사를 그리게 될 것이다.

 

리소스(Resource) - GPU가 어떤 일을 하기 위해선 셰이더 프로그램이 필요한데, 셰이더로 넘겨주는 데이터를 리소스라고 한다. 즉, GPU가 사용하는 데이터를 의미한다. 모든 리소스는 크게 텍스쳐와 버퍼 두가지로 구분될 수 있다. 텍스쳐는 이미지 데이터를 의미하며, 버퍼는 이미지가 아닌 데이터를 의미한다.

 

리소스 뷰(Resource View) - 리소스를 렌더링 파이프라인에 바인딩해줄 수 있는 객체이다. 리소스를 어떻게 사용할 것(= 바라 볼 것인지, View)인지에 대한 정의를 해줄 수 있다. 리소스 뷰 없이 파이프라인에 바인딩 해줄 수 있는 리소스가 있는데 그건 정점 버퍼, 인덱스 버퍼, 상수 버퍼, 스트림 출력 버퍼이다.

 

리소스 뷰를 통해 리소스를 바라보는 시각(View)를 달리 할 수 있어서 하나의 자원에 대해 다른 해석을 할 수 있다(같은 데이터를 여러 타입으로 캐스팅하는 것 처럼) -> 하나의 리소스에 대해 여러 리소스 뷰를 설정해서 여러 파이프라인에 같은 리소스를 바인딩 할 수 있다.

 

리소스 뷰는 총 4가지로 RenderTargetview, DepthStencilView, ShaderResourceView 그리고 unordered access view가 있다. 리소스를 직접 파이프라인에 바인딩할 수 없기에 리소스 뷰를 파이프라인에 바인딩해줘야 한다.

 

    RenderTargetView : 백버퍼에 장면을 출력하려고 할때 백버퍼를 파이프라인(정확히는 출력 병합기)에 직접 바인딩할 수 없고, 이 렌더 타겟뷰를 파이프라인에 바인딩해야한다. 말그대로 렌더링 대상을 의미하는 렌더 타겟은 백버퍼만 될 수 있는게 아니라, 텍스쳐(Render To Texture)도 될 수 있다.

 

    DepthStencilView : RenderTargetView와 마찬가지로 렌더링 파이프라인의 출력을 받을 수 있는데, 렌더 대상 뷰가 색상 값들을 담는 버퍼를 위한 것인 반면 깊이.스텐실 뷰는 깊이와 스텐실 값들을 담는다.

 

    ShaderResourceView : 파이프라인의 프로그램 가능 셰이더 단계에서 자원을 읽을 수 있도록 해준다. 프로그램 가능 셰이더 단계는 HLSL로 프로그래밍 가능한 셰이더 단계를 말하며 아래 그림에서 모서리가 둥근 직사각형의 렌더링 파이프라인 단계가 프로그래밍 가능한 셰이더 단계이다. 예를 들어 텍스쳐의 경우 DirectXTex 라이브러리의 

HRESULT CreateShaderResourceView(
    ID3D11Device* pDevice,
    const Image* srcImages, size_t nimages, const TexMetadata& metadata,
    ID3D11ShaderResourceView** ppSRV );

CreateShaderResourceView함수로 5번째 인자를 통해서 ShaderResourceView를 생성해서, 그 텍스쳐를 셰이더에서 해당 리소스를 읽고 사용하게 하고 싶다면(예를 들어 Vertex Shader에서 읽고 사용하게 하고 싶다면) 

void VSSetShaderResources(
  [in]           UINT                     StartSlot,
  [in]           UINT                     NumViews,
  [in, optional] ID3D11ShaderResourceView * const *ppShaderResourceViews
);

VS(or PS, HS, DS, GS)SetShaderResources로 세팅해줘야 한다.

https://minok-portfolio.tistory.com/4

 

 

Device초기화를 위해 필요한 작업

1. 필요한 헤더들을 include하고, 라이브러리 링크를 걸어준다

    - d3d11.h, d3dcompiler.h, d3d11.lib, dxguid.lib, d3dcompiler.lib 등

 

2. ID3D11Device, ID3D11DeviceContext, IDXGISwapChain 생성 

    2-1. D3D11CreateDeviceAndSwapChain을 이용해서 Device, Context, SwapChain모두 생성

    2-2. SwapChain이 갖고 있는 ID3D11Texture2D타입 백버퍼를 얻어온다 

    2-3. 백버퍼에 실제 렌더링할 RenderTargetView를 생성하고 바인딩한다(위에서 얻은 백버퍼는 바인딩 후 Release)

    2-4. DepthStencil Buffer를 위한 텍스쳐(ID3D11Texture2D 타입)를 만들고, 그 DepthStencilBuffer 대한                              DepthStencilBufferView를 만든다

    2-5. RSSetViewports로 레스터라이저 단계에 쓰일 뷰포트를 Set해준다

백버퍼와 렌더 타겟뷰 (출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=agebreak&logNo=60114584311)

 

Reference

https://lipcoder.tistory.com/entry/DirectX-12-%EA%B9%8A%EC%9D%B4-%EB%B2%84%ED%8D%BC%EB%A7%81

 

[DirectX 12] 기본지식 - 깊이 버퍼링(Depth Buffering)

깊이 버퍼(Depth Buffer)는 앞서 텍스처 형식에서 잠깐 다루었듯이 이미지 자료를 담지 않는 텍스처의 한 예이다. 깊이 버퍼는 각 픽셀의 깊이 정보를 담고 있다. 픽셀의 깊이는 0.0에서 1.0사이의 값

lipcoder.tistory.com

https://ssinyoung.tistory.com/37

 

DirectX 12 장치 초기화 이해하기 (5) - part 1

[ DirectX 12 장치 초기화 단계 ] 1 단계 Device(그래픽 디바이스) 생성. 2 단계 CommandQueue와 CommandList 생성. 3 단계 SwapChain 생성. 4 단계 FenceObject 생성. 5 단계 렌더타겟(RenderTarget)과 깊이/..

ssinyoung.tistory.com