Programming/D3D12

[책공부] Dynamic Indexing / FPS Camera + chap 15 연습 문제

Dorasima 2024. 2. 19. 21:42

(사실 이해했는지 모르겠다. 어렴풋이 느껴질 뿐... 그래도 그 느낌을 정리한다.)

 

1. Dynamic Indexing

- hlsl 5.1에서 새로 생긴 기능이다. Texture 들을 배열로 Shader에서 정의할 수 있고, 그것을 인덱싱 할 수 있다. 

- Texture2D texArr[4] : register(t0); 이렇게 선언한다면, t0 ~ t3 레지스터를 차지한다.

 

- Structrued Buffer도 마찬가지로 Indexing을 할 수 있다. Upload Heap으로 올리고 App과 Shader가 같은 Struct를 사용하고 있다면 정상적으로 작동한다. t 레지스터를 사용한다. 그래서 space를 이용해서 texture array와 겹치지 않는 레지스터 번호를 가지게 하였다. 

 

2. App에서 해줘야 하는 것

- 앱에서 쉐이더에 Resource를 넣어주는 방법은 Shader Resource View Heap을 만들고, 그것을 Root Signature의 Table을 알맞게 정의한 다음 SetGraphicsRootDescriptorTable로 Heap Handle만 넘겨주면 된다.

 

- shader의 레지스터 번호와, space 키워드가 App에서 넘겨주는 Resource와 일치하도록 Root Signature를 잘 설정해 주어야 한다.

 

3. 언급할 만한  예제에서 사용한 방법(구조)

- 원래는 Material 이든, Texture든 각각 View Heap을 만들어서, Object 마다 heap handle offset을 구해서, Pipeline에 bind를 해줬어야 했는데,

- 이렇게 인덱싱을 쉐이더에서 할 수 있다면, 프레임마다 Texture Arrray나 Structured Buffer를 통째로 넘겨준 다음에, Object Constant Buffer에서는 App에서 정해준 index만 가지고 Shader에서 Resource를 찾아서 렌더링을 할 수 있다.

 

4. 연습 문제

(클릭하면 커집니다.)

 

연습 문제 1

- 내적으로 구하라는데, 뭔소린지... 그냥 넘어간다.

 

연습 문제 2

- Roll 하기

- 코드는 다음과 같다.

-  문제점은 AddYaw 함수가 월드 y 벡터를 기준으로 회전을 걸어서, 비행기와 같은 움직임을 주고 싶으면 로컬 y로 회전을 하도록 수정해야 의도했던, 결과가 나올 것이다.

 

연습 문제 3

- Vertex 구조체에 Index를 담아서 넘겨주는 방법을 연습한다.

- View Heap이나 Root Signature나 PSO는 예제와 같다.

- RenderItem 구조체 필드값에서 필요 없는 것이 늘었다.

 

5. 메모용

- 만약 Index가 제대로 넘어가지 않는다면, 아래와 같은 문제가 생긴다.

더보기

 D3D12 ERROR: ID3D12Device::RemoveDevice: Device removal has been triggered for the following reason (DXGI_ERROR_DEVICE_HUNG: The Device took an unreasonable amount of time to execute its commands, or the hardware crashed/hung. As a result, the TDR (Timeout Detection and Recovery) mechanism has been triggered. The current Device Context was executing commands when the hang occurred. The application may want to respawn and fallback to less aggressive use of the display hardware). [ EXECUTION ERROR #232: DEVICE_REMOVAL_PROCESS_AT_FAULT]
예외 발생(0x00007FFE0DB4CF19, 12_FPSCamera.exe): Microsoft C++ 예외: DxException, 메모리 위치 0x000000DFAC7CE650.

-

 

 

더보기

책 : DirectX 12를 이용한 3D 게임 프로그래밍 입문