새소식

인기 검색어

귀령단/개발노트

22년 11월 4일 개발노트

  • -

도입부 배경 열심히 제작 중.

동시에 어느정도의 최적화도 진행 중이다.

Youtube에는 정말 주옥같은 정보들이 많다.

물론, 그 정보들을 잘 활용할 줄 아는 것은, 필요한 것만 가져다 쓰는 것은 분명 쓰는 사람의 능력이다.

 

이번에는 정보글 위주로 남겨야할 내용들이 많은데

우선은 환경구성에 관한 글부터 남겨보고자 한다.

 

- 언리얼 5 언저리로 넘어오면서 추가된 기능이 Sky Atmosphere과 Volumetric Cloud.

- 실로 어마어마한 기능이다. Sun light와 연동시켜주면 Sun light의 위치에 따라 대기가 알맞게 변화하고

- 이는 실제로 Skylight로 캡쳐가 가능해서 Skylight로 활용할 수 있다.

- Volumetric Cloud는 이전 언리얼에서 제공하는 Fake방식이 아닌, Volumetric 방식으로서,

태양과 대기의 빛에 알맞게 반응을 한다.

- 사실 안쓸래야 안쓸 수 없는 기능인 것이다.

 

- 하지만 밤이라는 그 얘기는 달라진다.

- 우선 밤은, 언리얼에서 PBR을 적용한 상태로 적용하는 것이 쉽지 않다.

- 아니, 적용할 수는 없지만 매우매우 밋밋하다.

- 적당한 그림자가 표현되어야 비쥬얼적으로 훨씬 나아지기 때문이 아닐까? 결국 Directional Light는 조절을 해야한다.

- 하지만 이렇게 만지다보면 결국 Sky Atmosphere과 Volumetric Cloud에게도 영향을 준다. 그리고 이 두 시스템은

- 저절로 알맞는 lighting을 계산하고 Casting하게 되는데, 이는 전체적인 이미지를 Flat하게 만든다.

- 이것저것 테스트해봤는데, 이 두가지 시스템을 쓰면서 내가 원하는 느낌을 갖는 것은 어렵다고 판단

노출체크용 4가지 ball들을 잘 쓰고있습니다. 앗 여기선 플랫하게 보이는 군..

- 내가 원하는 느낌 : 그림자가 어느정도 명확하게 구별되고, Volumetric light가 달빛으로 인해 비춰지며, 파란Fog가 어울리는 밤.

 

- 결국 구식방법인 BP_Skysphere을 활용해서 밤환경을 설치했다.

- Skylight로 어느정도 Indirect light는 넣어줘야 검은 부분이 좀 살아난다. 나같은경우는 Default cube map을 살짝 넣었다.

 

어제 조심스럽게 나무 몇개를 설치해봤는데 프레임이 눈에 띄게 줄어들었다. 몇 그루 심지도 않았는데;

퍼포먼스 저하의 이유는 분명 이 Foliage 이놈들이 분명했다. 

야외 Scene이다보니 나무들을 정말 많이 배치해야하는데 벌써부터 삐걱거리면 안되지.

우선 간략하게나마 이 친구들을 최적화할 수 있는 방법들을 알아봤다.

우선 지난번 언리얼 5.1로 Nanite 테스트를 해봤는데, 어쩌면 이번 연구는 거기의 연장선일지도 모르겠다.

 

1. 그림자

- 그림자가 문제다 그림자!!

- 그림자가 왜 문제일까?

- 일단 5.0 Lumen을 활용하기 위해서 사용되는 Shadow Method는

이 Virtual Shadow Maps이다. 결국 Lumen+Nanite를 잘 활용하기 위해서는 이 시스템을 적용해야하는데..

베타버전이다. 그만큼 문제가 많다는 거겠지.

- Foliage의 그림자가 유별나게 문제가 있는 것은 바로 Foliage만의 지랄맞은 특성때문이다.

         1.)특성1. Masked Material - 그렇다. 나무는 계산하기 까다로운 알파맵을 사용한다. 

         2.)특성2. World Position Offset - 나무는 가만히 있지 않는다. 쉐이더의 명령을통해 움직인다.

- 움직인다는 것은, 그 움직이는 그림자(그것도 Masked material을 쓰는 풀잎들)를 일일히 계산을 해줘서 반영을 해줘야한다는 것이다. 생각만 해도 무겁다.

- 이러한 특성은 Visualize가 가능하다. (Visualize - virtual shadow map - cached page)

이렇게 그림자가 복잡하게 구현되는 부분은 빨갛게 나온다.

이 부분을 최소화 해주면, 프레임이 많이 올라간다.

 

2. 그렇다면 어떻게 그림자를 최적화 합니까?

- 방법이 여러 가지가 있다.

- 우선 Virtual Shadow map을 안쓰고 이전 shadowmask 방식을 써도 된다.

- 하지만 나는 Lumen과 Nanite를 계속 쓸 것이기 때문에 VSM을 써야함.

-  LOD를 활용할 수 있다. 특정 LOD 단계에서 Shadow를 Cast하지 않게 설정을 해주는 방법이 있다.

저걸 해제해주세요.

- 나는 바닥의 풀은 그림자가 그닥 필요하지 않다고 판단이되어, LOD2부터는 그림자를 꺼주었다.

- 하지만 제일 문제되는 것은 결국 나무들인데.

- 이에 관해 좀더 찾아보던중, 개발자들도 고민을 다들 하는 모양인지 상당히 흥미로운 접근법을 알아냈다.

 

- 두가지 버전의 Foliage를 조합하는 방식인데, 한번 테스트해볼 수 있을 것 같다.

- 한 가지 버전은 Shadow Cast하지 않는다. 하지만 움직인다. 

- 두 번째 버전은 같은 나무인데, 움직이지 않는다. 하지만 Shadow는 Cast 한다. (저렴한 버전의 Shadow)

- 이 두가지 버전을 합쳐준다. 두번째 버전은 그림자만 Cast하고 메시자체는 보여주지 않는다.

- 어려운 이론은 아니다. 다만, 5.1부터 지원을하고 사실 Nanite를 사용하면 더 효과가 좋을 것 같아서

- 일단은 오피셜 언리얼 5.1 버전이 릴리즈 될 때 까지 기다릴 예정.

 

- 이외에, 최적화에 도움이 될 만한 관련 Command를 활용해봤다. 프레임이 한 20정도 향상됬다. voila!

- 프레임이 향상된 반면에, 비쥬얼적 결과는 큰 타격이 없었다.

- Level blueprint를 통해 저렇게 커맨드를 연결해놓은 이유는, 플레이할때 저 커맨드가 실행되어야하기 때문이다.

(엔진 껏다키면 초기화됌)

 

- 이 외에는 단순한 최적화 기법으로도 알고있는 fog를 활용하여 멀리있는 친구들을 Culling 시켜버리거나. 뭐 그런 방법들이다.

- 100프레임을 목표로 계속 최적화 해볼 예정.

 

- Landscape또한 5.1부터 Nanite를 지원하고, 특히 HLOD를 활용하면 그 퍼포먼스를 향상시킬 수 있을 듯하다.

- 하지만 이 또한 5.1부터 지원을 한다고 하니. 일단 대기한다.

 

휴.. 값진 시간이였습니다.

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.