Dylearn 원본과 Pixel Foliage·Camera 기능별 상세 대조
개발 기록 · 블로그 공개
원본 기록 상태 완료
원본과 현재 구현은 동일한 이식본이 아닙니다. 표현·성능 구조·추가 기능·미구현 항목과 실제 검증 수준을 소스로 구분했습니다.
작업 결과
현재 구현은 원본 잔디 시스템을 그대로 Unity에 이식한 상태가 아닙니다. 바람·접촉·단계별 시간 같은 개념을 다른 메시·셰이더로 구현하고 꽃·관목·나무용 구조를 더한 상태입니다. 원본의 외형을 만드는 일부 핵심 기능은 아직 빠져 있거나 단순화돼 있습니다. 원본과 같은 외형·더 낮은 GPU 비용을 달성했다고 검증한 상태가 아닙니다.
판정은 소스 기준입니다. ‘대응’도 같은 결과나 같은 성능을 뜻하지 않습니다. 최신 식생 개선은 컴파일·관리형 검사만 통과했으며 실제 화면 QA는 사용자 화면 조작 보류로 미실행입니다.
표현 기능
| 항목 | Dylearn 원본 | 현재 Pixel Foliage | 차이 판정 |
|---|---|---|---|
| 풀의 기본 모양 | 잔디 그림을 붙인 사각형 스프라이트1장. 알파로 윤곽을 자름 | 직접 작성한 잎3장의3D 메시. 묶음당36정점·12삼각형. 예제에 원본 잔디 그림을 쓰지 않음 | 다른 방식 |
| 카메라를 향함 | 카메라의 가로·세로·깊이 축으로 모델뷰를 구성하는 전체 billboard | 높이축을 유지하고 카메라 쪽으로 수평 회전하는 Y축 billboard 선택 | 부분 대응 |
| 큰 초록색 덩어리/얼룩 | 풀과 지면에3색·노이즈2종·임계값 설정으로 넓은 색 영역을 만듦 | 구역별 tint와 해시 기반 작은 색 변화, 공유 구름 명암 | 원본의3색 영역 방식 미구현 |
| 잔디 사이 포인트2종 | 같은 잔디 셰이더에서 확률에 따라 포인트 텍스처를 선택 | 꽃·관목 등을 별도 메시·Patch로 배치 | 다른 방식 |
| 바람 | 월드 노이즈 회전과 화면 방향의 사인 회전을 따로 조절 | 공간 노이즈·이동 파동·잔흔들림으로 정점을 이동. 뿌리/높이별 가중치 | 개념 대응, 수식 다름 |
| Fake perspective | 바람·유닛 방향에 따라 UV 폭을 왜곡해 눕거나 돌아가는 깊이감을 흉내냄 | 정점 휘어짐만 있음. 대응하는 UV 왜곡 없음 | 미구현 |
| 단계별 애니메이션 | 시간을 설정 FPS로 끊고 풀마다 phase를 달리함 | 같은 개념의 시간 양자화·phase 선택. 기본 예제는 연속,06번은 단계 비교 | 대응 구현 |
| 유닛 접촉 | 현재 캐릭터 위치를 기준으로 스프라이트를 화면 축으로 회전시킴 | 현재 위치와 주변 풀의 거리로 밀어냄. 높이·뿌리·정점 알파로 반응 차등 | 다른 방식 |
| 유닛 통과 후 잔류 | 확인한 코드에는 과거 위치를 저장·감쇠시키는 기록이 없음 | 기본1.4초 흔적을 감쇠시키며 복원. 과거 위치 기록 최대64개 | 현재 쪽 추가 |
| Toon 명암 | Godot 조명·빛 감쇠와 그림자를 받는 light() 안에서 단계 경계를 부드럽게 섞음 | 자체 lightDirection/lightColor와3단계 기본 명암·부드러운 경계 | 단순화된 대응 |
| 구름 명암 | 표면 높이에서 광원 방향으로 구름 높이 평면에 투영, 노이즈2개 결합 | 월드XZ의2D 노이즈를 이동시켜 밝기에 곱함 | 높이·광원 투영 미구현 |
| 실제 씬 광원/그림자 연동 | DirectionalLight 방향을 공유값으로 전송, Grass/Floor가 빛 감쇠 사용 | World에 수동 광원값. 현재 색 계산은 실제 씬 shadow attenuation을 읽지 않음 | 원본과 동등하지 않음 |
| 셰이더 디버그 화면 | 바람 노이즈·접촉 방향을 색으로 표시하는 토글 | 선택 Gizmo만 있고 같은 셰이더 디버그 모드는 없음 | 미구현 |
렌더링·갱신·제품 도구
| 항목 | 원본 | 현재 구현 | 의미 |
|---|---|---|---|
| 저해상도 장면 | 640×360 SubViewport를3배 확대해1920×1080 표시 | Pixel Camera 프리셋 높이270. Built-in은 원본 화면을 줄이거나 별도 저해상도 캡처를 추가 | 역할은 Camera지만 실행 경로 다름 |
| 대량 배치 | MultiMesh에40000개 저장·30000개 표시 | RenderMeshInstanced로최대256개씩 제출. 대표 정원 잔디12000묶음 | 인스턴스 수만으로 경량화 비교 불가 |
| 캐릭터 위치 갱신 | 기본10Hz, 배열 최대64캐릭터 | 기본10Hz 공유 수집. 구역별 현재/잔류 접촉 중 가까운 최대16개 전달 | CPU 수집 빈도 대응, 범위 다름 |
| 안정화/추가 렌더 | 제공 씬의 저해상도 SubViewport 구조 | 안정화 프리셋은 추가 장면 캡처. Lightweight 프리셋은 기존 Automatic 조건에서 원본 화면 재사용 | 후자는 중복 캡처를 피하나 최초 렌더를 없애지 않음 |
| 범용 식생 설정 | 확인한 제공 범위는 잔디와 포인트 스프라이트 중심 | Grass/Flower/Shrub/Tree Profile, World, Patch, 개별 Renderer | 현재 쪽 확장 |
| 표면 배치/제품 UI | Godot 씬·재질·스크립트 설정 중심 | 명시적 콜라이더 표면 Bake·Undo 코드, 공통 TurnRoom 창/Inspector·9언어·선택 연동 | 현재 쪽 제품화 기능, 현재 UI 실검증 대기 |
변경 내용
적용 내용
그래서 화면이 왜 다를 수 있나요?
차이는 밀도 숫자 하나가 아닙니다. 원본은 그림이 들어간 평면·카메라 전체 billboard·큰3색 영역·UV 가짜 원근·조명/구름 투영을 결합합니다. 현재 예제는 작은3D 잎·Y축 billboard·단순 색 변화·정점 휘어짐·자체 명암을 사용합니다. 이 방식 차이는 소스로 확인됐지만 각 요소가 최종 영상 차이에 기여하는 정도는 동일 조건의 분리 렌더로 아직 측정하지 않았습니다.
직전 개선에서는 잎의 폭·높이를 넓히고 대표 정원의 묶음을7000에서12000으로 늘렸습니다. 묶음당 정점은36개를 유지했지만 장면의 잔디 메시 총량은 증가합니다. 따라서 이 수정 자체를 전체 GPU 경량화로 설명하면 잘못입니다. 꽃·관목·나무 구조의 추가도 원본 잔디 표현을 재현했다는 근거는 아닙니다.
낮은 FPS가 줄여 주는 것은 무엇인가요?
- 시간 양자화: 움직임을 끊어 보이게 합니다. 현재 두 셰이더 모두 매 렌더에서 수식을 실행하므로 이것만으로 GPU 계산 생략을 주장할 수 없습니다.
- 위치 수집10Hz: 캐릭터 위치를 읽어 접촉 데이터를 갱신하는 CPU 작업의 횟수를 줄입니다. 현재 처리 클래스의600요청 모의 검사에서10Hz 수집100회·무제한600회를 확인했습니다. 전체 프레임 성능 측정은 아닙니다.
- 낮은 렌더 해상도: 원본의640×360과1920×1080은 픽셀 수가9배 다릅니다. 실제 속도가9배라는 뜻은 아닙니다. Unity Built-in의 사후 축소/재캡처를 이 원본 구조와 같은 최적화라고 부를 수 없습니다.
Pixel Camera와 무엇을 나누나요?
- Pixel Camera: 저해상도 화면, 확대, 픽셀 격자, 색/윤곽 처리. 원본의 SubViewport/표시 역할과 연결됩니다.
- Pixel Foliage: 풀/꽃/관목/나무의 배치·형상·바람·접촉·복원. 카메라를 꺼도 이 동작은 별도로 존재합니다.
- Pixora: 이미지 작성/내보내기. 현재 식생 어댑터는 내보낸 Texture2D로 새 재질을 만드는 연결이며 실시간 문서 동기화가 아닙니다.
원본 재현을 목표로 할 경우의 우선순위
제안 순서는 원본 같은 스프라이트 카드 경로·3색 영역 → UV fake perspective와 billboard 정렬 → 광원/높이 투영 구름과 그림자 → 동일 조건 영상/성능 측정입니다. 아직 실행한 작업이 아니라 차이를 줄이기 위한 제안입니다. 기존 꽃·나무용 메시 경로와 선택할 수 있게 하는 구성이 적합하다는 판단입니다.
기본 예제와 지원 가능한 입력은 구분합니다
현재 셰이더에도 BaseMap 텍스처·알파 잘라내기와 외부 메시 입력 코드는 있습니다. 따라서 사용자가 UV가 있는 카드 메시·텍스처를 지정하는 경로 자체가 전혀 없는 것은 아닙니다. 다만 제공한 기본 잔디 예제는36정점의3D 잎이며, 원본 같은 스프라이트 카드 예제·아트·전체 billboard/UV 가짜 원근 조합을 완성·검증한 상태는 아닙니다. 위 제안의 카드 경로는 이 원본형 제공 구성을 뜻합니다.
앞선 대조표 버전을 보존하고 이 구분을 보충했습니다.
검증
원본 근거 · 커밋7486b9b
현재 근거 · 제품 소스fb79b35f 기준
C1 FoliageCommon.hlsl:30~35 Y billboard,42~43 시간,47~52 바람,54~67 접촉,70~79 자체 명암·XZ 구름·해시 색 변화. C2 PixelFoliage.shader는 ShadowCaster 패스가 있으나 색 출력은 C1 PFShade만 사용하며 실제 shadow attenuation을 읽지 않습니다. 패스 이름만으로 그림자 수신이 된다고 판단하지 않았습니다.
C3 FoliageWorld.cs와 C4 FoliageContactHistory.cs의10Hz/잔류 감쇠·64기록, C5 FoliagePatch.cs의256개 제출, C6 PixelCameraEffect.cs:81~124의OnRenderImage 이후 원본 축소/추가 캡처 조건, C7 공통 Inspector 상속, C8 메시·예제 생성, C9 명시적 표면 Bake를 대조했습니다. 추가로 현재 MeadowGrass.asset의36정점/36인덱스를 직접 확인했습니다.
이전 검증은6개 어셈블리 정적 컴파일·20,619개 관리형 단언과 셰이더 정적 검사입니다. 최신 개선의 실제 씬/9언어 UI/성능 검증은 미실행입니다. 이번 회차는 소스 분석이므로 Unity/화면을 새로 조작하지 않았습니다.
앞서 촬영한 Unity 기준 Camera 전후 GIF와 보고서는 잔디 개선 전 화면입니다. 원본 Godot와 최신 Unity 개선판의 동등 조건 영상 비교 자료는 아닙니다.
남은 사항
이번 기능 대조 검토는 소스·설정·기존 검증 근거로 완료했습니다. 원본과 최신 구현의 시각적 유사도·동일 하드웨어 성능 우열은 미확인입니다. 화면 조작 금지를 유지하며 기존 제품 메뉴얼의 실제 화면 QA도 보류 상태를 유지합니다.
이전 설명의 ‘혼합 toon/월드 구름/카메라 향하기’는 기능 계열만 같다는 뜻이었으며 원본과 같은 계산이라는 뜻은 아닙니다. 이번 표에서 단순화/부분 대응으로 바로잡았습니다.