일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Effective C#
- c#
- 속성
- 유니티
- shader
- 프로퍼티
- tutorial
- Final IK
- 깃허브
- 메모리
- 유니티 그래픽 최적화
- unity
- 파이널 IK
- github
- 쉐이더
- 애니메이션
- 리팩토링
- 최적화
- NavMesh
- 리깅
- 에러
- 쓰는 법
- error
- 튜토리얼
- 사용법
- 2판
- 유니티 그래픽스 최적화 스타트업
- 익명 타입
- 애님
- 오류
- Today
- Total
참치김밥은 최고의 한식이다
[유니티] Unity로 오픈월드를 만드는 과정과 기능 개발 (2) 본문
본 포스팅은 아래 글로부터 이어집니다!!
https://plzlotto1st.tistory.com/85
이번 포스팅에서는 오픈 월드 개발 시 기술적 문제와 해결 방법에 대해 작성한다.
먼저, 기술적 문제부터!!
Texture 문제 (4km x 4km 예시) :
: 오픈 월드는 매우 크기 때문에, Terrain에 텍스처를 넣을 때, 1픽셀 당 씬 상에서 0.5m ~ x m를 커버하여 텍스처 압축 시 게임 상에서 퀄리티가 아주 안 좋아진다고 한다.
Height map도 문제가 생긴다. Height map에선 1픽셀 당 0.5m 정도를 커버하게 되는데, 캐릭터의 신장은 약 1~1.5m이다. 따라서, 캐릭터 시점에서 보게 되면 맵의 정밀도가 떨어질 수 밖에 없다고 한다.
해결 방법 :
유니티의 Big Terrain System을 이용한다!
LOD 문제 :
일반적인 LOD라면, 아주 멀리 있는 오브젝트여도 하나씩 LOD 처리가 들어간다고 한다.
오픈 월드는 매우 넓기 때문에, 저 멀리 있는 오브젝트 1000개에 대해서 일일이 LOD가 들어간다면 매우 비효율적일 것이다.
해결방법 :
HLOD 기법을 사용하여 거리에 따라 오브젝트들의 Mesh를 Combine하여 하나의 Mesh로 그룹화하여 해당 Mesh에 대해 LOD를 처리한다고 한다.
예를 들어서, 10km 거리에 1000개의 static 오브젝트가 있다고 하자.
일반적인 LOD라면, 저 멀리 있더라도 총 1000번의 LOD 처리가 이루어진다.
하지만, 1000개의 오브젝트의 Mesh를 모두 Combine하여 하나의 Mesh로 만들고, 이 Mesh에 대해서만 LOD 처리를 한다면? 1번의 LOD 처리만 이루어지면 된다.
이 과정을 거리마다 수행하는 것이 HLOD 방법이라고 한다.
+) HLOD의 장단점?
장점 :
- Static Batching에 비해 메모리 절약 (Streaming하기 좋아짐)
- 로딩 빨라짐
- 성능 좋아짐
단점 :
- Baking이 필요함
- Packaging 사이즈 증가
Shadowmap 사용 문제 :
오픈 월드는 맵이 너어무 커서, Shadowmap을 굽는 데에도 너무 오래 걸리고, 저장 공간도 낭비라고 한다.
해결 방법 :
원신에서는 Cascaded Shadow Map을 8개 사용하고, 하드 쉐도우에 Poisson 노이즈를 추가하여 그림자 퀄리티를 높였다고 한다. 프아송 노이즈는 쉐도우 밴딩 문제를 최소화하기 위해 사용했다.
덕분에 800미터 밖의 오브젝트에도 그림자를 구현하였다고 한다.
Cascaded Shadow Map이 정확히 뭔지 궁금해서 또 찾아보았다,, ⬇️⬇️⬇️
Cascaded Shadow Map (CSM) 이란??
아래는 기존의 Shadow Map 방식이다.
그리고 아래는 Cascaded Shadow Map 방식이다.
무슨 차이가 있을까?? 잘 보자
기존 방식에서는 모두 같은 크기의 픽셀로 나눠지는 한 편,
Cascaded 에서는 뷰 프러스텀으로부터의 거리에 따라 다른 크기의 픽셀로 맵을 나눈다.
이렇게 보면 Cascaded는 쉐도우 맵을 나누는구나 싶지만, 실제로 나눠지는 것은 뷰 프러스텀이다.
위 그림과 같이, Cascade 횟수를 정하고, 그 횟수만큼 프러스텀을 쪼갠다.
(즉, 원신은 이 Cascade 횟수를 8로 했다는 뜻으로 이해했다.)
출처 :
https://blog.naver.com/PostView.nhn?blogId=pencube1214&logNo=221849084039
'Unity' 카테고리의 다른 글
[유니티] a failure occurred while executing com.android.build.gradle.tasks.processlibrarymanifest 오류 해결 (0) | 2024.03.28 |
---|---|
[Unity] UniRx 개념 및 사용법 정리 (1) (0) | 2024.03.15 |
[유니티] Unity로 오픈월드를 만드는 과정과 기능 개발 (1) (0) | 2024.02.22 |
[개발 지식 + 유니티] Socket.IO 와 BestHTTP 란??? (0) | 2024.02.22 |
[유니티] 텍셀과 픽셀의 차이? (0) | 2024.02.20 |