
## Unity: Parallax Occlusion Mapping
* **목표:** 지형에 추가적인 깊이와 디테일을 더하기 위해 Parallax Occlusion Mapping을 Unity에서 사용하는 방법 알아보기
* **주요 기능:**
* 기존 지형 셰이더 시리즈의 일부 (이전 비디오: 경사면 지형 재질 투영, 지형 타일링 아티팩트 제거, 렌더링 비용 절감)
* **Parallax Occlusion Mapping 구현:**
* 새로운 지형 재질 레이어 생성
* 기존 "Simple Layer" 서브그래프 복제 및 "Parallax Occlusion Layer"로 이름 변경
* **Parallax Occlusion Mapping 노드 추가:**
* **입력:**
* `Incoming Height Map Texture`: 일반, Occlusion, Height 맵 (Height는 Alpha 채널에 저장)
* `Height Map Sampler`: Sampler State 노드 연결 (고품질: trilinear, 16x anisotropic / 최적화: linear, anisotropic filtering 없음)
* `Amplitude`: 높이 값 (Blackboard에 `max parallax height` float 변수 생성, 기본값 6)
* `Steps`: Parallax Occlusion Mapping의 비용을 결정하는 가장 중요한 값
* **최적화:** 카메라 거리 및 시야각에 따라 Steps 수를 동적으로 조절
* **거리 기반 마스크:** 카메라 거리에 따라 Steps 수 조절 (0.09 곱하기, saturate, 0.45 제곱, 마스크 반전)
* **각도 기반 마스크:** 지형 노멀 벡터와 뷰 벡터의 dot product 활용 (saturate, 1-x, 제곱)
* **최대 Steps:** Blackboard에 `max parallax steps` float 변수 생성 (기본값 128), 각도 및 거리 마스크와 곱하고 ceil 노드로 올림
* `UVs`: Tiling and Offset 노드 출력 연결
* **출력:** 텍스처 샘플링을 위한 UV 좌표 생성
* **텍스처 샘플링:** Parallax Occlusion Mapping 노드에서 생성된 UV를 사용하여 텍스처 샘플링
* **지형 셰이더 통합:**
* 새로운 "Parallax Occlusion Layer"를 지형 셰이더의 4번 레이어로 교체
* `max parallax height` 및 `max parallax steps` 파라미터 연결
* `parallax steps` 파라미터 생성 및 조절하여 성능 및 품질 균형 확인 (예: 16, 256, 512)
* **성능 최적화:**
* **Steps 수 조절:** 카메라 거리 및 각도에 따라 Steps 수 동적으로 조절
* **레이어별 적용:** 모든 지형 레이어에 Parallax Occlusion Mapping을 적용하지 않고, 깊이 있는 Height Map을 가진 표면에만 사용 (예: Cobblestones vs. Mossy Grass)
* **셰이더 최적화:** 레이어별로 필요한 속성만 포함하는 서브그래프 사용
---
## Unreal Engine: Nanite Displacement
* **목표:** 지형에 추가적인 깊이와 디테일을 더하기 위해 Nanite Displacement를 Unreal Engine에서 사용하는 방법 알아보기
* **주요 개념:**
* 지형을 수백만 개의 작은 삼각형으로 분할하고 Height 데이터를 사용하여 변위(Displacement) 생성
* Parallax Occlusion Mapping과 달리 기하학(Geometry)을 직접 생성
* **Nanite 활성화:**
* **Project Settings:**
* **Engine -> Rendering:**
* `Shader Model`을 **SM6**로 설정 (SM5는 Nanite 미지원)
* `Default RHI`를 **DirectX 12**로 설정
* **고성능 하드웨어 전용:** PlayStation 5 수준의 콘솔 및 고사양 PC에 적합 (모바일 게임에는 권장하지 않음)
* **지형 재질 설정:**
* **Terrain Material:**
* `Landscape Layer Blend` 노드에서 모든 레이어의 `Blend Type`을 **Height**로 설정
* `Get Material Attributes` 노드에 **Displacement** 항목 추가 (Height 데이터를 전달하기 위해)
* **Layer Material (예: Cobblestones, Moss):**
* Color, Roughness, Normal, Occlusion, Height 텍스처 샘플링
* Height 데이터를 **Displacement** 및 **Height Output**으로 전달
* **Root Node:**
* `Enable Tessellation` 체크 (Nanite 활성화를 위해)
* Height Map에서 블렌딩된 **Displacement** 데이터를 Root Node에 연결
* **Magnitude:** 변위 강도 조절 (기본값 4는 너무 높음, 0.25 권장)
* **Center:** 0.5로 설정하여 Height Map 값이 0.5 이상은 위로, 이하는 아래로 변위
* **Nanite Displacement 적용:**
* **Terrain Actor:**
* `Enable Nanite` 체크
* `Build Data` 클릭하여 Nanite 삼각형 생성 (시간 소요)
* **결과 확인:**
* Nanite Displacement를 통해 지형에 상세한 모양과 깊이 추가
* **Nanite Visualization -> Triangles:** 개별 삼각형 확인 (매우 많은 수)
* **최적화 권장 사항:**
* **Height Map 조정:** 셰이더 내에서 실시간으로 Height Map 조정 파라미터 추가 대신, Substance Designer 등 외부 툴을 사용하여 Height Map 텍스처 자체를 미리 조정 (성능 향상)
* **Nanite Displacement 효율성:** Unreal Engine 4의 Tessellation 및 Displacement보다 더 효율적이고 저렴할 것으로 예상 (고성능 플랫폼의 경우)
---
### 요약 표
| 기능 | Unity | Unreal Engine |
| :---------------------- | :------------------------- | :------------------------ |
| **주요 기술** | Parallax Occlusion Mapping | Nanite Displacement |
| **깊이/디테일 추가** | Ray Tracing 기반 | Geometry Displacement |
| **최적화** | Steps 수 동적 조절, 레이어별 적용 | Nanite, 텍스처 사전 조정 |
| **하드웨어 요구 사항** | 상대적으로 낮음 | 고성능 하드웨어 전용 |
| **구현 복잡성** | 노드 기반, 비교적 간단 | 프로젝트 설정, 재질 설정 |
| **성능 고려 사항** | Steps 수, 적용 레이어 | Nanite 활성화, Magnitude |
| **결과물** | 2D 텍스처를 이용한 3D 효과 | 실제 지오메트리 변위 |