DirecX12 | Lecture 9. Index Buffer (인프런)
DirectX12 강의 9. Index Buffer를 정리한 글입니다.
DirecX12 | Lecture 9. Index Buffer (인프런)
강의 정보 🎓
- 강의명: [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈 - Part2: 게임 수학과 DirectX12] (https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-2)
- 플랫폼: 인프런
- 현재 섹션: Lecture 9 – Index Buffer
- 주요 내용: DirectX 12 정점 데이터의 중복을 줄이고, 더 효율적인 렌더링을 위해 Index Buffer를 도입하였다.
1. 사각형 렌더링을 위한 정점 구성
- 기존 삼각형에서 사각형 하나로 구성 변경
- Game에서 정점을 6개로 늘리거나, 인덱스를 이용해 4개의 정점으로 구성 가능하다.
2. Index Buffer의 필요성
- 정점 버퍼만 사용할 경우 중복되는 정점이 발생한다.
- 메쉬 수가 늘어나면 큰 문제가 된다.
- 동일한 정점을 재사용할 수 있도록 Index Buffer도입
3. Mesh 클래스 확장
std::vector<uint32>
인덱스 데이터를 받아들이는 Init 함수를 수정한다.- 내부를
CreateVertexBuffer()
,CreateIndexBuffer()
로 분리 구성한다. IASetIndexBuffer()
,DrawIndexedInstanced()
를Render()
함수에 추가해야한다.
4. Vertex & Index 예제 코드
정점 버퍼만 사용하는 경우
1
2
std::vector<Vertex> vertices(6);
// 중복된 정점 포함
인덱스 버퍼를 사용하는 경우
1
2
3
4
5
std::vector<Vertex> vertices(4);
std::vector<uint32> indexes = {
0, 1, 2,
0, 2, 3
};
이슈 및 트러블슈팅
CreateVertexBuffer()
,CreateIndexBuffer()
각각 CommandList Reset/Close이 불필요하게 두번 수행하게 된다.Init()
에서 CommandList Reset/Close를 수행하도록 수정 -> 렌더링이 되지 않는 문제가 발생하였다.CreateVertexBuffer()
,CreateIndexBuffer()
를 빠져나오면 업로드 버퍼 내용이 사라지게된다.
해결 방법
uploadBuffer
는 GPU 작업 완료 시점까지 멤버 변수로 보관한다.- 작업 종료 후 명시적으로
uploadBuffer.Reset()
호출하여 버퍼를 해제시켜 줘야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Mesh::Init(...) {
...
commandAllocator->Reset();
commandList->Reset(...);
CreateVertexBuffer(...);
CreateIndexBuffer(...);
commandList->Close();
commandQueue->ExecuteCommandLists(...);
Engine::GetInstance().GetCommandQueueLayer()->WaitForGpuComplete();
// GPU 작업 끝났으므로 업로드 버퍼 해제
mVertexUploadBuffer.Reset();
mIndexUploadBuffer.Reset();
}
프로젝트 상태 💾
요약 및 느낀점 📝
- Index Buffer를 도입해 중복 정점 제거, 효율적 데이터를 위한 발판을 마련하였다.
- Init 함수 분리, 업로드 버퍼 보존 등의 Mesh 구조를 개선하였다.
느낀점 💡 업로드 버퍼와 같은 함수 로컬 변수를 놓쳐서 문제가 발생했는데 이를 놓치지 않도록 주의할 필요가 있다.
추가로 수행할 작업 📒
- 싱글톤 구조에 대한 접근 영역을 정하였고 이에 따른 수정이 필요한 상태이다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.