일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- working set
- URP
- Private Bytes
- 게임 수학
- VR
- Virtual Byte
- 가상 바이트
- AppSW
- URP로 변경
- Toon Shader
- 개인 바이트
- 3d
- ColorGradingLutPass
- 벡터
- Specular
- Three(Two) Tone Shading
- 프로그래밍 기초
- Cell Look
- 메모리 누수
- Cell Shader
- OculusMotionVectorPass
- C언어
- ASW(Application SpaceWarp)
- Cartoon Rendering
- Windows Build
- 작업 집합
- Rim Light
- Today
- Total
WinCNT
Direct3D 11의 초기화하기 전에 알아야 할 기본 지식 본문
Direct3D 11의 초기화하기 전에 알아야 할 기본 지식
WinCNT_SSS 2022. 3. 10. 18:59참고 서적) DirectX 11을 이용한 3D 게임 프로그래밍 입문
화면에 뭔가 오브젝트를 띄우려면 기본적으로 알아야 할 것이 많다
(이 글의 내용 외에도 Shader, Effect, HLSL 등이 있다)
DirectX
원래는 게임을 위한 모든 것을 모아두었던 것
Input, Sound 등등
DirectX9 - 과거에 쓰였으나 현재는 거의 사용되지 않는 라이브러리
DirectX11 - 오랜 기간 쓰였고, 현재도 사용 중인 라이브러리
DirectX12 - 앞으로 많이 쓰이게 될 것으로 보이는 라이브러리
Direct3D 초기화 공정 전에 미리 알아야 할 것
Direct3D
Direct3D는 어플리케이션이 3차원 그래픽 가속 기능을 이용해서
3차원 그래픽를 렌더링할 수 있게 하는 저수준 API(application programming interface)이다
(물론 어플리케이션 개발자에게 저수준 API라는 이야기임)
본질적으로 Direct3D는 그래픽 하드웨어를 제어할 수 있는 소프트웨어 인터페이스를 제공한다
어플리케이션과 그래픽 하드웨어 사이에 Direct3D라는 간접층이 존재
그 덕분에 어플리케이션 개발자는 3차원 그래픽 하드웨어가 Direct3D 11 대응 장치(Direct3D 11 capable device)라면
하드웨어의 구체적인 세부사항을 걱정할 필요가 없다
Direct3D 11 대응 그래픽 장치는 반드시 Direct3D 11 능력 집합(capability set) 전체를 지원해야 한다
COM
키워드 - Rendering Pipeline, Resources, Bind, View
COM(Component Object Model)은 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 기술이다
COM 객체는 인터페이스라고도, C++ 클래스라고도 여겨지기도 한다
즉, 어플리케이션 프로그래머에게는 세부 내용이 보이지 않는다
프로그래머에게 필요한 건 특별한 함수들, 혹은 다른 COM 인터페이스의 메서드를 이용해서
COM 인터페이스로의 포인터를 얻는 방법뿐이다.
COM 인터페이스는 C++의 new 키워드로 생성하지 않으며, delete로도 삭제하지 않는다
모든 COM 인터페이스는 IUnknown이라는 COM 인터페이스의 기능을 상속받는데,
그 인터페이스가 Release 함수를 제공하므로 삭제할 시에는 그 인터페이스의 Release 함수를 호출해야 한다
참고로 COM 인터페이스들은 이름이 「I」로 시작한다(예: ID3D11DeviceContext 등)
텍스처 및 자료 자원 형식
키워드 - Rendering Pipeline, Resources, Bind, View
텍스처는 이미지라는 인식이 있지만 실제로는 더 범용적이다
2차원 텍스처에는 각 픽셀의 색상을 담는 2차원 배열이며,
법선 매핑에서는 색상 대신 3차원 벡터를 담기도 한다
텍스처에는 특정 Format만 담을 수 있으며, 구체적인 형식은 DXGI_FORMAT이라는 열거형으로 지정한다
Swap chain과 페이지 전환
화면의 깜박임 현상을 방지하기 위한 더블 버퍼링과 같은 맥락의 기술이다
화면에 표시되어 있는 버퍼를 전면 버퍼(Front buffer),
다음 프레임을 위한 그리기 처리를 하는 버퍼를 후면 버퍼(Back buffer)라고 한다
후면 버퍼를 전면 버퍼와 교환해서 화면에 표시하는 것을 제시(Presenting)라고 부르며
Presenting은 버퍼들의 포인터만 바꾸는 것이기 때문에 효율적인 연산이라 할 수 있다
전면 버퍼와 후면 버퍼는 하나의 Swap chain이라는 것을 형성하며,
Direct3D에서는 IDXGISwapChain이라는 인터페이스로 사용할 수 있다
예를 들어 IDXGISwapChain는 버퍼 크기 변경을 위한 함수(IDXGISwapChain::ResizeBuffers)와
버퍼의 제시를 위한 함수(IDXGISwapChain::Present)도 제공한다
깊이 버퍼링(Depth buffering, 혹은 Z-Buffering)
키워드 - AM2연, 버파1/2 이야기
한 물체의 픽셀들이 다른 물체보다 앞에 있는지를 판정하기 위해
Direct3D는 깊이 버퍼링, 혹은 Z-Buffering이라는 기법을 사용한다
(깊이 버퍼링은 그래픽 하드웨어에서 자동으로 일어나며 맞물린 물체들도 제대로 처리된다)
깊이 버퍼(depth buffer)는 이미지 자료를 담지 않는 텍스처의 한 종류이다
깊이 버퍼는 각 픽셀의 깊이 정보(0.0~1.0)를 담는다
깊이 버퍼는 후면 버퍼와 1대1 대응한다
예를 들어 후면 버퍼의 해상도가 1920 x 1080이면 깊이 버퍼도 1920 x 1080개의 원소들로 구성된다
렌더링 처리 전에 후면 버퍼는 Clear되며, 깊이 버퍼도 기본 값(일반적으로 1.0)으로 바뀐다
픽셀과 해당 깊이 값은 깊이 버퍼에 이미 들어 있던 값보다 작은 경우에만 후면 버퍼와 깊이 버퍼에 기록된다
깊이 버퍼도 하나의 텍스처이므로 특정한 자료 형식을 지정해서 생성해야 한다.
(마찬가지로 구체적인 형식은 DXGI_FORMAT 열거형의 중 일부임)
텍스처 자원 뷰
키워드 - Rendering Pipeline, Resources, Bind, View
렌더링 파이프라인에는 텍스처는 결속(Bind)할 수 있는 단계(Stage)가 여럿 있는데,
대표적으로는 텍스처를 Render Target으로 Binding하는 것과
Shader Resource로 Binding하는 두 가지의 용도가 있다
그런데 파이프라인의 단계에서 텍스처 자원이 직접 묶이는 것은 아니라
텍스처가 연관된 자원 뷰를 파이프라인 단계에서 묶는다
그러므로 Direct3D에서 텍스처를 사용하려면 텍스처의 초기화 시점에서
그 텍스처의 자원 뷰(resource view)를 생성해야 한다
이러한 추가 절차는 기본적으로 효율성을 위한 것이다
구체적으로 설명하자면 실행시점 모듈(런타임)과 구동기(드라이버)가 유효성 점검과 매핑을
뷰 생성 시점에서 수행할 수 있기 때문에, 결속(Binding) 시점에서의 형식 점검이 최소화되기 때문에 효율성이 높아진다
어떤 자원에 대해 특정 자원 뷰를 생성하려면
그 자원을 생성할 때 해당 Binding Flag를 지정해야 한다.
다중표본화의 이론(MSAA, Multisampling Anti-Aliasing)
키워드 - Aliasing, Anti-Aliasing
모니터의 픽셀은 무한히 작지 않기 때문에 계단 현단, 즉 앨리어싱(Aliasing)이라는 현상이 발생한다
이러한 Aliasing 현상을 없애기 위한 기법(Anti-Aliasing)이 존재하며,
그 중 하나가 초과표본화(슈퍼 샘플링, Supersampling)이다
초과표본화란 후면 버퍼와 깊이 버퍼를 화면 해상도의 4배(가로, 세로 두 배씩)로 잡아서 렌더링하고
이미지를 화면에 제시(Presenting)할 때 후면 버퍼를 원래 크기의 버퍼로 환원(resolving)하는 기법이다
이 환원은 하향표준화(downsampling)라고도 부르며,
4픽셀 블록의 색상을 평균을 최종 색상으로 사용한다
픽셀 처리량과 메모리 소비량이 네 배라서 비용이 크다는 단점이 있다
반면 Direct3D는 다중표본화(멀티 샘플링, multisampling)는 절충적인 기법을 제공한다
슈퍼 샘플링처럼 크기가 화면 해상도의 4배인 후면 버퍼와 깊이 버퍼를 사용하는 것은 같지만,
이미지 색상을 모든 부분픽셀마다 계산하는 것이 아니라 픽셀당 한 번만 계산하고,
그 색상과 부분픽셀들의 가시성/포괄도를 이용해서 최종 색상을 결정한다
다중표본화를 위해서는 DXGI_SAMPLE_DESC라는 구조체를 채워야 한다. 이 구조체는 다음
과 같이 두 개의 멤버(자료 필드)로 이루어져 있다.
typedef struct DXGI_SAMPLE_DESC
{
UINT Count; // 픽셀당 추출할 표본의 개수
UINT Quality; // 품질 수준(구체적인 의미는 하드웨어 제조사마다 다를 수 있음)
} DXGI_SAMPLE_DESC, *LPDXGI_SAMPLE_DESC;
// 텍스처 형식과 표본 개수의 조합에 대한 품질 수준들의 개수를 확인하는 함수
HRESULT ID3DllDevice::CheckMultisampleQualityLevels(
DXGI_FORMAT Format,
UINT SampleCount,
UINT *pNumQualityLevels
);
실제 응용에서는 다중표본화의 성능 및 메모리 비용을 합리적인 수준으로 유지하기 위해
표본을 4개나 8개만 추출하는 경우가 많다.
다중표본화를 시용하고 싶지 않으면 표본 개수를 1로,품질 수준을 0으로 설정하면 된다
기능 수준(Feature Level)
Direct3D는 기능 수준(Feature Level)이라는 개념이 존재한다
Direct3D 초기화 함수에 Feature Level 관련 배열을 설정함으로써,
사용자의 하드웨어가 특정 Feature Level를 지원하는지 확인한 후,
지원하지 않는 경우, 그보다 낮은 Feature Level로 어플리케이션을 실행하도록 컨트롤 할 수 있다
Feature Level 관련 배열은 D3D_FEATURE_LEVEL(열거형)의 배열이며,
예제는 다음과 같다
D3D_FEATURE_LEVEL featureLevels[4] =
{
D3D_FEATURE_LEVEL_11_0, // 가장 먼저 사용자의 하드웨어가 D3D 11를 지원하는지 점검
D3D_FEATURE_LEVEL_10_1, // 그 다음으로 D3D 10.1 지원 여부를 점검
D3D_FEATURE_LEVEL_10, // 그런 다음 D3D 10 지원 여부를 점검
D3D_FEATURE_LEVEL_9_3 // 마지막으로 D3D 9.3 지원 여부를 점검
};
FEATURE LEVEL featureLevels[4] =
D3D__FEATURE__LEVEL__11_o, / / 우선 D3D 11 지원 여부를 점검
D3D _FEATURE__LEVEL__10—1, / / 그 다음으로 D3D10.1 지원 여부를 점검
D3D FEATURE LEVEL _10 // 그런 다음 D3D 10 지원 여부를 점검
D3D FEATURE LEVEL 9 3 II 마지막으로 D3D 9.3 지원 여부를 점검
사용자의 하드웨어가 특정 Feature Level를 지원하지 않는다면,
그보다 더 낮은 Feature Level으로 내려가서 어플리케이션을 실행한다
D3D_FEATURE_LEVEL에 따라 셰이더가 사용할 수 있는 이펙트가 정해져 있기도 하므로
MSDN의 D3D_FEATURE_LEVEL를 확인할 것!!
(셰이더 모델5, HLSL(High-Level-Shader_Language)등등)
Initialization를 이해하기 위해 필요한 키워드들
Win32API
DXGI
Feature
Rendertarget
Swapchain
Shader - 명함을 나타내는 것(함수들의 집합)
Effect
HLSL
Vertext
Index - 버텍스들의 Number
Constant buffer - 상수 버퍼(빛의 절대적인 크기 등)
Renderstate - wireframe, 점
Resource - 자원들
Transform - 변환
WorldViewProjection - 행렬
NDC(Normalized Device Coordinate) - 화면에서 가져보는 거, 뷰포트
Clip Space
Homogeneous coordinate - 동차 좌표계
Rasterization - LineTo를 직접 구현한다는 느낌
WARP - 발전된 소프트 렌더러
nemerator, deominator 갱신 주기?
'게임 프로그래밍(학습 내용 정리) > 3D Game Programming' 카테고리의 다른 글
Primitive (0) | 2022.03.25 |
---|---|
렌더링 파이프라인 (0) | 2022.03.24 |
Transform(변환) 3 (0) | 2022.03.23 |
Transform(변환) 1 (0) | 2022.03.16 |
Direct3D 11의 초기화 (0) | 2022.03.12 |