프로젝트 개요
DirectX 12 기반 그래픽스 개발 과정을 세 저장소를 통해 하나의 프로젝트로 정리했습니다.
DirectX12에서 저수준 렌더링 파이프라인과 GPU Displacement를 구현한 뒤, DirectX12-Character에서 렌더러를 Frame Resource·Render Item·Material 단위로 구조화했습니다. 이후 DirectX12-Engine에서는 이 기반을 확장해 Chunk 기반 Voxel World, GPU Instancing, Picking, FBX 데이터 처리까지 구현했습니다.
공통 기술 스택
- 언어: C++
- 그래픽 API: DirectX 12, DXGI, D3DCompiler
- 셰이더: HLSL, Shader Model 5.0
- 수학·플랫폼: DirectXMath, Windows 10, Win32 API
- 빌드: Visual Studio 2022, MSVC v143
- 리소스·모델: DirectXTex, DirectXTK12, Autodesk FBX SDK 2020
- 디버그 UI: Dear ImGui, Win32/DX12 Backend
1. DirectX12 — GPU Displacement와 행성 렌더링
DirectX 12 초기화부터 렌더링 파이프라인까지 직접 구축했습니다. DXGI Factory와 하드웨어 어댑터를 탐색하고 Device, Command Queue, Command Allocator, Command List, Swap Chain, RTV/DSV를 구성했습니다. Fence 기반 CPU-GPU 동기화와 Triple Buffering으로 프레임 리소스 흐름을 관리했습니다.
달의 Height Map을 GPU에서 샘플링해 표면을 변형하고, Hull Shader와 Domain Shader 기반 Tessellation으로 지형 세부도를 보강했습니다. 구면 좌표 기반 UV 계산과 Color Map·Sky Map을 적용했으며, Directional Light, Solid/Wireframe 모드, Upload Heap·Default Heap, SRV·CBV Descriptor Heap, Resource Barrier를 함께 구성했습니다.
2. DirectX12-Character — 렌더러 구조화와 FBX 메시 처리
Renderer·Window·Camera 기반 구조에 Frame Resource 패턴을 도입하고, 프레임별 Command Allocator와 Object·Material·Pass Constant Buffer를 분리했습니다. Mesh Geometry와 Render Item, Material과 Texture를 나누어 Root Signature와 Graphics Pipeline State를 조합할 수 있도록 렌더러를 구조화했습니다.
FBX SDK를 연동해 FBX 파일의 좌표계 변환, 삼각형 변환, Vertex·Index 추출, Submesh 단위 관리를 구현했습니다. DirectXTK12 DDS Texture Loader와 Dear ImGui 디버그 UI를 연결하고, Directional Light 기반 HLSL 조명과 Geometry Generator 기반 기본 메시도 구성했습니다.
3. DirectX12-Engine — Voxel World와 엔진 구조 확장
세 저장소 중 가장 확장된 형태의 프로젝트입니다. Chunk 기반 월드를 구성하고 카메라 주변 Chunk를 동적으로 생성했습니다. Simplex Noise와 Perlin Noise, Fractal Brownian Motion을 조합해 지형 높이를 계산하고, Continentalness·Erosion·Peaks & Valleys 개념을 분리했습니다. Spline Node로 Noise 값과 지형 높이를 매핑하고 Dirt·Stone·Cobblestone·Water 등의 Block Type을 관리했습니다.
Cube Mesh 하나를 여러 블록에 재사용하는 GPU Instancing을 구현했습니다. Instance Data를 Structured Buffer로 GPU에 전달하고 HLSL의 SV_InstanceID로 인스턴스별 변환과 Block Type별 텍스처를 선택했습니다. DrawIndexedInstanced로 대량 블록을 렌더링하고 Cel Shading과 Sobel 기반 외곽선 효과를 적용했습니다.
마우스 화면 좌표를 Clip Space, View Space, World Space로 변환해 Picking Ray를 생성하고, Bounding Box와 Ray 교차 검사로 가장 가까운 Block Instance를 선택했습니다. 선택된 블록은 별도 강조 표시해 월드와의 상호작용 기반을 마련했습니다.
FBX 메시의 Normal·Tangent·UV와 Bone Hierarchy, Bone Weight, Bone Offset Matrix, Animation Clip·Keyframe을 추출하고 CPU 기반 Bone Transform 계산 구조도 구성했습니다. 이 부분은 데이터 추출과 변환 기반까지 구현된 단계로, 완성된 Vertex Skinning 기능으로 과장하지 않았습니다.
전체 프로젝트에서 얻은 경험
C++과 DirectX 12를 기반으로 저수준 렌더링 파이프라인을 직접 구축했습니다. DXGI, Command Queue, Descriptor Heap, Resource Barrier, Fence를 이해하고 적용했으며, HLSL Tessellation과 GPU Displacement로 행성 표면을 렌더링했습니다. 이후 Frame Resource와 Render Item 구조로 렌더러를 확장하고, FBX 모델 로딩, 애니메이션 데이터 처리, Chunk 기반 Voxel World, GPU Instancing, Ray Picking 시스템으로 발전시켰습니다.
이 과정에서 렌더링 기능을 단순히 추가하는 것보다 리소스 수명, 프레임 동기화, 데이터 변환, 셰이더 입력 구조를 일관되게 유지하는 것이 엔진 확장성에 직접 연결된다는 점을 확인했습니다.
