DirectX 11 기반 커스텀 게임 엔진
Unreal Engine 아키텍처(UObject → AActor → UActorComponent)에서 영감을 받아 설계된 C++/DX11 게임 엔진입니다. 컴포넌트 패턴, 스마트 포인터 기반 리소스 관리, 단계별 조명 셰이더 시스템을 갖추고 있습니다.
- 언어: C++20
- 그래픽스 API: DirectX 11 (Feature Level 11.0)
- 수학 라이브러리: DirectXMath / SimpleMath
- 텍스처 로딩: DirectXTex
- 리소스 관리: Microsoft::WRL::ComPtr, std::shared_ptr / std::unique_ptr
- 빌드: Visual Studio 2022, Windows SDK 10.0+
GameCoding/
├── Engine/ # 엔진 코어
│ ├── Game.h/cpp # 메인 게임 루프
│ ├── GameObject.h/cpp # 액터 기반 게임 오브젝트
│ ├── Component.h/cpp # 컴포넌트 베이스 클래스
│ ├── MonoBehaviour.h/cpp # 스크립트 가능 컴포넌트
│ ├── Transform.h/cpp # 계층적 트랜스폼
│ ├── Camera.h/cpp # 카메라 컴포넌트 (View/Proj 행렬)
│ ├── Mesh.h/cpp # 메시 데이터 컴포넌트
│ ├── MeshRenderer.h/cpp # 렌더링 컴포넌트 (Technique/Pass 기반)
│ ├── Material.h/cpp # 머티리얼 (셰이더 + 텍스처 조합)
│ ├── Frustum.h/cpp # 뷰 프러스텀 컬링
│ │
│ ├── Graphics.h/cpp # DX11 디바이스, 스왑체인, DSV
│ ├── RenderManager.h/cpp # GlobalDesc / TransformDesc / Light / Material 상수버퍼 관리
│ ├── Shader.h/cpp # Technique / Pass 셰이더 파이프라인
│ ├── Pass.h/cpp # 단일 렌더 패스 (VS + PS + 상태)
│ ├── Technique.h/cpp # 셰이더 기법 묶음
│ │
│ ├── VertexBuffer.h/cpp # GPU 버텍스 버퍼
│ ├── IndexBuffer.h/cpp # GPU 인덱스 버퍼
│ ├── ConstantBuffer.h # 동적 상수 버퍼 (템플릿)
│ ├── Geometry.h # CPU 측 지오메트리 데이터 (템플릿)
│ ├── GeometryHelper.h/cpp # 지오메트리 생성 유틸리티
│ ├── VertexData.h/cpp # 버텍스 구조체 정의
│ │
│ ├── Texture.h/cpp # 텍스처 로딩 & 바인딩
│ ├── ResourceBase.h/cpp # 리소스 베이스 클래스
│ ├── ResourceManager.h/cpp # 리소스 캐싱 & 관리
│ │
│ ├── InputManager.h/cpp # 키보드/마우스 입력
│ ├── TimeManager.h/cpp # 델타타임 & FPS
│ ├── Types.h # 타입 별칭 (Vec3, Matrix 등)
│ ├── Define.h # 공통 매크로 & 전처리기
│ └── Utils.h/cpp # 유틸리티 함수
│
├── Client/ # 데모 씬 (학습/테스트용)
│ ├── 01. TriangleDemo # 기본 삼각형 렌더링
│ ├── 02. QuadDemo # 사각형 렌더링
│ ├── 03. ConstBufferDemo # 상수 버퍼 활용
│ ├── 04. CameraDemo # 카메라 이동 및 시점 제어
│ ├── 05. TextureDemo # 텍스처 매핑
│ ├── 06. SamplerDemo # 샘플러 스테이트 비교
│ ├── 07. HeightMapDemo # 하이트맵 지형
│ ├── 08. NormalDemo # 노말 벡터 시각화
│ ├── 09. MeshDemo # Mesh 컴포넌트 기반 렌더링
│ ├── 10. GlobalTestDemo # Global 셰이더 상수버퍼 테스트
│ ├── 11. DepthStencilDemo # 깊이/스텐실 테스트
│ ├── 12. AmbientDemo # 환경광 조명
│ ├── 13. DiffuseDemo # 난반사 조명
│ ├── 14. SpecularDemo # 정반사 조명
│ ├── 15. EmissiveDemo # 자체 발광
│ ├── 16. LightingDemo # 통합 조명 모델
│ ├── 17. MaterialDemo # 머티리얼 시스템
│ ├── 18. NormalMappingDemo # 노말 매핑
│ └── CameraScript.h/cpp # 1인칭 카메라 스크립트
│
├── Shaders/ # HLSL 셰이더 (.fx)
│ ├── 00. Global.fx # 전역 상수버퍼 (GlobalDesc / TransformDesc)
│ ├── 00. Light.fx # 조명 구조체 & 계산 함수
│ ├── 01~08. *.fx # 기초 셰이더 (Triangle ~ GlobalTest)
│ └── 09~13. Lighting_*.fx # 조명 단계별 셰이더 (Ambient → Lighting)
│
└── Resources/ # 텍스처, 리소스 파일
Game::Render()
├─ Graphics::RenderBegin() # RTV / DSV 클리어, 뷰포트 설정
├─ RenderManager::PushGlobalData() # 카메라 VP 행렬, 시간 등 전역 데이터 업데이트
├─ GameObject::Render()
│ └─ MeshRenderer::Render()
│ ├─ Technique → Pass 순회
│ ├─ IASetPrimitiveTopology # TRIANGLELIST (누락 시 GPU마다 다르게 동작)
│ ├─ IASetVertexBuffers / IASetIndexBuffer
│ ├─ VS / PS SetShader
│ ├─ SetConstantBuffer (GlobalDesc, TransformDesc, LightDesc, MaterialDesc)
│ ├─ SetTexture / SetSamplerState
│ └─ DrawIndexed()
└─ Graphics::RenderEnd() # SwapChain Present
| 버퍼 | 슬롯 | 내용 |
|---|---|---|
| GlobalDesc | b0 | VP 행렬, 카메라 위치, 경과 시간 |
| TransformDesc | b1 | World 행렬 |
| LightDesc | b2 | 방향, 색상, 조명 타입 |
| MaterialDesc | b3 | Ambient/Diffuse/Specular/Emissive 계수 |
- 컴포넌트 패턴:
Component베이스 클래스를 통한 확장 가능한 게임 오브젝트 - 스마트 포인터: DX11 리소스는
ComPtr, 일반 객체는shared_ptr/unique_ptr - Technique / Pass 구조: 하나의 셰이더가 여러 Pass를 가지며, MeshRenderer가 순회하며 실행
- 템플릿 버퍼:
Geometry<T>,ConstantBuffer<T>로 타입 안전 버퍼 처리 - 데이터 지역성: 오픈 월드 최적화를 위한
std::vector기반 연속 메모리
- 원인: VS에서
worldPosition을 VP 변환 이후에 저장 - 해결: W 변환 직후, VP 변환 전에 저장
output.position = mul(input.position, W);
output.worldPosition = output.position.xyz; // 반드시 여기서
output.position = mul(output.position, VP);- 원인: View 행렬의 이동 성분(
-V._41_42_43)을 그대로 사용 → 월드 좌표 아님 - 해결: View 행렬의 회전 성분(3x3)으로 역변환
float3 cameraPos = mul(float3(-V._41, -V._42, -V._43), (float3x3)V);- 원인:
IASetPrimitiveTopology호출 누락 → GPU 기본값이 POINT 또는 LINE인 경우 존재 - 해결:
MeshRenderer::Render()진입 시 항상 명시적으로 설정
DC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);- 원인: Feature Level 미명시로 DX9/10 레벨로 생성될 수 있음
- 해결: Feature Level 배열에
D3D_FEATURE_LEVEL_11_0명시
- 원인:
DepthStencilView미생성 / RTV에 DSV 미바인딩 - 해결:
Graphics초기화 시 DSV 생성 후OMSetRenderTargets에 함께 전달
main— 안정 릴리즈 브랜치 (직접 push 금지)dev— 개발 브랜치 (모든 작업은 여기서)dev → main머지는 GitHub PR을 통해서만 진행
- Visual Studio 2022
- Windows SDK 10.0+
- DirectX 11 SDK (Windows SDK 포함)
- C++20