
# Sign Distance Fields (SDF) 기반 게임 엔진 개발
## 개요
* **개발자**: Mike
* **주요 기술**: Sign Distance Fields (SDF)
* **목표**: 게임 플레이 중에도 높은 충실도로 월드 지오메트리 수정이 가능한 엔진 구축
---
## 엔진 기능 및 특징
* **월드 지오메트리 수정**:
* **높은 충실도**: 게임 월드가 비교적 정적인 다른 게임과 달리, 세부적인 지오메트리 변경 지원
* **물질 추가/제거**: 부드럽거나 날카로운 경계로 물질 추가 및 제거 가능
* **비파괴적 변경**:
* 구멍 이동
* 터널 생성 및 통과 후 사라짐
* 이러한 비파괴적 변경은 흥미로운 게임플레이 메커니즘을 가능하게 함
---
## 기반 기술: Sign Distance Fields (SDF)
* **SDF의 장점**:
* **간단한 기하학적 부울 연산**: Union, Subtraction, Intersection 등
* **부드러운 연산**: 형태 간 자연스러운 블렌딩 및 날카로운 모서리 제거
* **참고 자료**:
* Sebastian Log의 영상 (SDF 정의 및 Ray Marching 렌더링)
* ShaderToy 및 Inigo Kiles 웹사이트 (SDF 관련 기법)
---
## SDF 렌더링 최적화
### 1. 문제점
* **Ray Marching 성능 저하**: 복잡한 수학 함수를 픽셀당 여러 번 평가하여 성능 저하 발생
* **고성능 동적 수정**: 높은 충실도로 동적으로 수정 가능한 월드를 높은 성능으로 표현하는 것의 복잡성
### 2. 영감 및 목표
* **Dreams (PlayStation 4)**: SDF를 이용한 월드 및 3D 객체 표현, 자체적으로 조각 가능
* *목표는 Dreams 재구현이 아니며, 솔로 개발자로서 불가능함*
* **엔진 목표**: Dreams와 달리 모든 월드 지오메트리가 동적으로 수정 가능하도록 구현
### 3. 렌더링 속도 향상 기법
* **SDF 편집 (SDF Edits)**:
* **개념**: 모양, 위치, 회전, 스케일 정보를 포함하며 부울 연산을 통해 월드에 적용
* **예시**: 특정 위치에서 월드를 잘라내는 구 모양
* **거리 함수 평가 비용**: 복잡한 장면의 거리 함수 평가 비용이 높음
* **Culling**: 특정 지점에서 평가해야 할 SDF 편집 수를 줄임 (하지만 복잡한 장면에선 성능 한계 발생)
* **캐싱 (Caching)**:
* **원리**: 장면의 거리 함수를 처음부터 반복해서 평가하는 대신, 그리드 상의 모든 지점에서 한 번만 평가하고 캐시된 값을 재사용
* **2D 예시**:
* 원과 사각형 SDF를 부드럽게 블렌딩
* 마우스 이동 시 거리 함수 연속 평가
* 장면 위에 그리드를 오버레이하고 각 그리드 지점의 거리 함수 평가 및 시각화
* **그리드 지점 수 < 화면 픽셀 수**
* **근사 거리 계산**:
* 점을 포함하는 셀 결정
* 셀의 그리드 지점 4개 거리 값 수집
* **Bilinear Interpolation**을 이용한 최종 거리 추정 (GPU 텍스처 패치 한 번으로 가능)
* **정확도**: 그리드 셀의 세분화 정도에 따라 정확도 달라짐 (코너에서 부정확성 발생)
* **Font Rendering**: 20년 이상 텍스트 렌더링에 사용된 기법 (Valve 2007 논문)
### 4. 3D 렌더링 및 캐싱
* **2D Wobbling 현상 3D 적용**: 큐브 드래그 시 그리드 해상도가 낮을 경우 발생하는 흔들림
* **NVIDIA 논문**: 3D 그리드에서의 삼중선형 보간 (Trilinear Interpolation)을 통한 복잡한 3D 표면 재구성
* 곡면 및 복잡한 위상 구조 표현 가능
* **메모리 제약**:
* **문제점**: 큰 장면에서 그리드 거리 캐싱 및 저장 비용 높음
* **최적화**: 1바이트 저장 (최소 필수 거리 제한)
* **계산**: 1024^3 그리드 해상도에서 1GB 메모리 소요
* **희소 캐싱 (Sparse Caching)**:
* **원리**: 표면을 포함하는 셀 (양수 및 음수 거리 값 갖는 그리드 포인트)에 대해서만 거리 캐싱
* **데이터 구조**: **Brick Map**
* 벽돌 (Bricks): 원본 캐시 거리 그리드의 작고 정사각형/입방체 영역
* 벽돌 포인터의 밀집 그리드
* GPU에서 효율적 작동
* **Dreams에서 영감**: 8x8x8 크기의 벽돌 사용
### 5. 동적 지오메트리 수정과 메시 생성
* **Mesh Generation (Marching Cubes, Dual Contouring)**:
* **장점**: 렌더링 비용 저렴
* **단점**: 동일한 충실도에서 메시 생성 비용 높음
* **개발자 선택**: 높은 충실도 동적 월드를 위해 재계산 최적화 선택
* **SDF 표면 렌더링**: 캐시된 거리 그리드로부터 표면 재구성 가능
* **복잡한 표면**: 낮은 그리드 해상도로도 복잡한 표면 표현 가능
---
## 대규모 월드 구현
* **메모리 부족 문제**: 희소 벽돌 할당으로 메모리 사용량 줄였지만, 오픈 월드에는 여전히 부족
* **Level of Detail (LOD)**:
* **개념**: 플레이어로부터 멀리 떨어진 지오메트리를 낮은 충실도로 표현
* **엔진 적용**: 플레이어로부터 멀수록 SDF 평가 빈도 감소
* **Geometry Clip Maps**:
* **원리**: 중첩된 그리드 사용, 각 그리드는 이전 레벨의 두 배 크기
* **특징**:
* 플레이어 중심
* 플레이어 이동 시 함께 이동
* 플레이어로부터 멀수록 더 거친 해상도로 SDF 평가
* 캐시된 벽돌의 화면 상 크기 일정 유지
* **메모리 절감 효과**:
* 2.5km 거리에서 200조 개 이상 필요 → Clip Map 적용 시 2천만 개 (1천만 배 감소)
---
## 월드 지오메트리 업데이트
* **점진적 재계산**: 변경된 월드 영역만 점진적으로 재구성
* **SDF 편집 추적**:
* **Bounding Volume Hierarchy (BVH)**: CPU와 GPU 간 공유되는 Axis-Aligned Bounding Boxes (AABB) 트리 사용
* **기능**:
* Ray Cast에 유용
* 특정 공간 영역에 영향을 미치는 SDF 편집 식별
* SDF 평가 작업량 감소
* SDF 편집 변경 시 재평가 필요한 거리 벽돌 결정
* **벽돌 재구축 디버그**: 프레임당 재생성되는 벽돌 시각화
* 대부분의 월드는 프레임 간 재사용됨
* **기술적 한계**: 현재 일부 상호작용에 대해 수학적으로 완벽하지는 않지만 잘 작동함
---
## 물리 엔진
* **선택**: Jolt (Horizon Forbidden West, Death Stranding 2 등에서 사용)
* **충돌 감지**:
* **직접 SDF 사용**: 가능하지만 복잡하며 Jolt에서 지원하지 않음
* **메시 생성**: SDF에서 삼각형 메쉬 생성 후 Jolt에 입력 (렌더링용은 아님)
* **Marching Cubes**: 간단하고 병렬화 용이
* **CPU 멀티스레딩**: 낮은 지연 시간 업데이트를 위해 CPU에서 병렬 생성
* **동적 물리 바디**: SDF 편집을 동적 물리 바디로 설정 가능
* **지형**:
* **3D 지형**: 높이 필드가 아닌 완전한 3D
* **점진적 생성**: 노이즈 옥타브 활용 (Inigo Kiles 기법에서 영감)
* **SDF 편집과의 상호작용**: 모든 SDF 편집이 지형과 상호작용
---
## 게임플레이 예시
* **무한한 SDF 편집**:
* **원인**: 공간적으로 변경된 영역만 점진적으로 재계산
* **결과**: 수 킬로미터 깊이까지 파고들기 가능
* **비파괴적 편집**:
* **터널 총 (Tunnel Gun)**: 캡슐 빼기 연산으로 플레이어 시점에 고정
* 물리 충돌 메쉬도 동적으로 업데이트됨
* **터널 생성 및 제거**: 게임플레이 실험 중
* **구멍 이동**: 다른 객체나 적을 포획하는 데 사용 (Donut County 영향)
* **체적 재료 스탬핑**:
* 광맥 채굴 등을 위한 지하 재료 스탬핑
* **가법적 편집**:
* **벽 쌓기**: 큐브로 벽 만들기
* **표면 그리기**: 표면에 그림 그리기
* **SDF 모델링 도구**:
* 높은 충실도로 모델링 가능 (SirPotatoFace 예시)
---
## 디버그 시각화
* **용도**: 디버깅 및 시스템 이해에 매우 유용
* **활용**: 모든 디버그 시각화 동시 활성화
---
## 향후 계획
* **게임 개발**: 현재 엔진을 기반으로 게임 개발 중
* 상세한 계획 수립 중, 아직 해결해야 할 부분 많음
* 디자인 진행 상황 공유 예정