
# Horizon Zero Dawn: 식물(Vegetation) 제작 기술
## 1. 서론
* **개발 기간:** 7년 (God는 7일, 일요일 휴식)
* **개발사:** Guerrilla Games
* **주요 내용:** Horizon Zero Dawn의 식물 제작 과정에서 겪었던 기술적, 예술적 도전 과제 및 해결 방안
## 2. Decima 엔진 및 렌더링
* **개발:** 자체 개발 Decima 엔진 사용
* **아티스트의 셰이더 제작:** Maya 기반, 커스텀 셰이더 노드 활용 (테크팀의 감독 하)
* 성능 프로파일링은 아티스트 책임
* 셰이더, 애셋, 성능에 대한 높은 소유권 확보
* **렌더링 목표:** 30fps, 1080p (PS4), 4K (Pro)
## 3. Horizon Zero Dawn의 세계관 및 초기 테스트
* **영감:** BBC 자연 다큐멘터리
* **초기 프로토타이핑:** 2011년 초 소규모 팀 구성
* **Killzone Shadow Fall의 테스트베드:**
* **'Behind Enemy Lines' 레벨:** Horizon의 식물 제작 테스트 진행
* **문제점 발견:**
* 식물 애셋은 정적이지 않고 시뮬레이션 레이어가 필요하여 외주 및 유지보수가 어려움
* Killzone 방식의 식물 제작은 Horizon의 오픈 월드에 부적합 (폴리곤, 셰이더, 텍스처 예산 재고 필요)
* **배치 시스템 (Placement System) 초기 구현:** Horizon 월드 제작에 필수적임을 확인
## 4. 식물 움직임 (Foliage Movement)
### 4.1. 전역 바람 힘 필드 (Global Wind Force Field)
* **목표:** 날씨 시스템과 연동, 게임 플레이 중심, 제어 가능한 움직임 구현
* **기능:**
* 컴퓨트 셰이더를 사용하여 매 프레임마다 바람 영향 시뮬레이션
* 3D 텍스처 업데이트 (셰이더 샘플링용)
* **최적화:**
* 플레이어/카메라에 연동하여 플레이어 근처에서 최고 해상도 유지
* 거리별로 3D 텍스처 샘플링 해상도 점진적 감소
### 4.2. 스프링 설정 (Spring Settings)
* **4가지 범주:** 3가지 애셋 유형 및 1가지 특수용 (배너/천막)으로 구분
* **구현:** 추가 셰이더 로직 없이 다양한 움직임 설정 가능
### 4.3. 셰이더 (Shaders)
* **사용 셰이더:** 2가지 (기본 셰이더, 잔디용 특화 셰이더)
* **나무 및 식물 셰이더:**
* **CPU GEMS 3 참고:** 버텍스 컬러에 스키닝 근사치 저장 (2011년부터 변경되지 않은 핵심 기술)
* **3단계 LOD (Level of Detail) 움직임:**
1. **대규모 움직임:** 전체 애셋의 굽힘 (애셋 높이 기반)
2. **중규모 움직임:** 가지 움직임 (트렁크로부터의 거리 기반)
3. **소규모 움직임:** 잎 또는 얇은 부분 움직임
* **레드 채널:** 가지로부터의 거리 저장
* **그린 채널:** 애니메이션 시간 오프셋 (타임 오프셋)
* **알파 채널:** 사전 계산된 앰비언트 오클루전 (AO)
* **셰이더 변수 (오렌지색 표시):**
* **강성 (Rigidity):** 애셋별 흔들림 강도 조절
* **가지 제어 (Bend, Sway, Lift):** 바람 방향, 수직 방향, 상하 움직임 조절
* **미세 움직임 (Micro Motion):** 3D 노이즈 텍스처를 이용한 잎 움직임
* **식물 셰이더:**
* 나무 셰이더와 동일하나, 셰이더에서 전체 굽힘(bend)을 제어하여 성능 향상
* **Ramp Function:** 바람 영향력 조절 (예: 낮은 바람에도 잎이 먼저 움직이도록)
## 5. 잔디 (Grass)
* **초기 목표:**
* 기하학적 구조 (Alpha Plane 지양)
* 캐릭터 상호작용 (발, 손으로 밟거나 치우는 등)
* **문제점:** 초기 렌더링 시 프레임 전체 소모
* **최적화 결과:**
* 최소 삼각형 수 사용
* 전용 잔디 셰이더
* 텍스처의 창의적 활용
* **LOD 셰이더:**
* **High/Low 셰이더:** LOD별 기능 적용 (예: 원거리에서 애니메이션 미적용)
* **버텍스 프로그램:**
* 힘 필드에서 바람 샘플링, 잔디 높이를 이용한 기본 움직임
* **추가 움직임:**
* **대규모:** 주기 함수 조합 (Figure-eight 형태)
* **소규모:** 주기 함수를 이용한 법선 방향 변위
* **상호작용:**
* 카메라 방향으로 메쉬 평면 기울이기 (카드처럼 보이지 않도록)
* 지형 높이 맵 기반 버텍스 변위 (클리핑 및 부유 현상 방지)
* **거리별 최적화:** 애니메이션 및 메쉬 크기 축소
## 6. 셰이딩 (Shading)
* **투명도 (Transparency):**
* Alpha Test는 비용이 많이 드는 작업
* **해결 방안:** 2단계 렌더링
1. **Depth-Only Pass:** Alpha Test를 통한 깊이 정보만 렌더링 (저비용 셰이더)
2. **Geometry Pass:** Depth Compare를 통한 일반 렌더링 (고비용 셰이더, Depth Test로 가속)
* **성능 향상:** Depth-Only Pass 적용 시 렌더링 시간 약 21% → 10% 감소
* **Alpha 텍스처:**
* **초기:** Sign Distance Alpha Texture (셰이더에서 크기 조절, 동적 눈 효과)
* **최적화:**
* 셰이더에서 Alpha 조절 기능 제거
* **커스텀 MIP Chain 생성:**
* Alpha 이미지 커버리지 계산 및 MIP Chain 생성
* 오프라인 도구를 사용하여 각 MIP 샘플링, 바이리니어 업샘플링, 히스토그램 분석
* 커버리지 0.5에 해당하는 값으로 MIP 스케일링
* **결과:** 셰이더 작업 → 텍스처 샘플링으로 변경 (성능 향상)
* **캐시 효율성:** Alpha를 작게 만들어 캐시에 맞도록 최적화 (특히 잔디)
* **G-Buffer:**
* **Normals:**
* **일반 기하학:** 양면 렌더링 (법선 반전)
* **Alpha Plane/Triangle:** 뷰 공간 법선의 절대값 사용 (카메라 반대 방향 법선 방지)
* **ISO Surface:** 법선 생성
* **Albedo:**
* **Colorization:** 텍스처 배열 사용 (생태계별 색상 텍스처)
* **World Data:** 회색조 텍스처 (경사, 수변 라인 등)
* **Artist Control:** 8가지 밴드 선택 가능
* **샘플링:** 나무/식물 (객체당 1회), 잔디 (버텍스당)
* **셰이더:** Albedo + Colorization + Mask Texture
* **Roughness & Reflectance:**
* 텍스처 샘플, 버텍스 알파의 AO, 고정된 Reflectance 값 (Dielectric)
* Roughness: 아티스트 조절 가능 (Translucency 텍스처 활용)
* **Translucency:**
* **Surface Thickness:** 흡수량, 산란 각도 (G-Buffer에 Translucency Amount, Diffusion으로 인코딩)
* **Scattering Boost:** 시각적으로 더 초현실적인 효과 연출
## 7. 식물 제작 파이프라인 (Vegetation Pipeline)
* **초기:** Killzone 방식 모델링 (High LOD 중심) → E3 2015 최적화 필요성 대두
* **개선된 파이프라인:**
1. **Lowest LOD 우선 제작:**
* SpeedTree 활용 (3면체 또는 4면체)
* 텍스처 및 실루엣 스케치
* 성능, 실루엣, 밀도 검토 및 수정
2. **High Resolution Component 제작:**
* Maya + SpeedTree 활용
* 텍스처 레이아웃 일치 확인
3. **Texture Baking:**
* High Resolution 모델 기반 텍스처 베이킹 (UV 공간 맞춤)
4. **LOD Chain 구축:**
* SpeedTree에서 Lowest LOD (LOD3) 모델에 High Resolution 텍스처 적용
* LOD2, LOD1 순서로 디테일 추가
* SpeedTree 6 사용 (Bones, AO Export)
5. **Houdini Process:**
* FBX에서 skeletal/skinning 데이터 추출 → 버텍스 컬러로 변환
6. **Maya Export:**
* 에셋 설정 및 게임 내보내기
* **LOD Chain 예시:**
* LOD4, LOD5: 빌보드 (Billboards) 사용 (크로스 플레인)
* **Shadow Casting:**
* **최적화:** 시각적 LOD와 별도로 Shadow Casting Mesh 분리 (2개 vs 6개)
* Shadow Caster는 Alpha Test, 애니메이션 미적용 (최소 비용)
## 8. 그림자 (Shadow Casting)
* **4개의 캐스케이드:**
* **캐스케이드 0 (Compartment):** Aloy 및 장비만 렌더링 (고품질 그림자)
* **캐스케이드 0, 1 (Standard):** 일반 그림자 맵
* **Distance Cascade:** 높이 필드 시스템 사용
* **LOD Popping 방지:**
* **거리 기반 LOD 선택 방식 변경:**
* 고정 거리 기반으로 LOD 선택 (예: 5m, 25m)
* 캐스케이드 간 부드러운 전환으로 LOD 팝핑 현상 제거
* **비용 증가:** 약간의 렌더링 비용 증가 vs 팝핑 문제 해결
## 9. 추천 사항
* Depth-Only Pass 활용
* 커스텀 MIP Chain 생성
* LOD Up/Down 최적화
* Shadow Caster를 시각적 메시와 분리
* YAP의 배치 시스템 활용
* **사내 개발:** 반복적 개선 및 성능 최적화 용이