본문 바로가기
[Unity]

[Unity] 3ds Max로 오브젝트 병합하기

by 김기승 2021. 6. 22.

Unity 개발을 하다 보면, 개발자들이 고난을 겪는 작업은 최적화 작업일 것이다. 특히, 모바일 기기는 최적화가 제대로 이루어지지 않으면 흔히 프레임 드롭, 발열과 같은 문제가 발생한다. 최적화는 Sprite Atlas, TMP, Light Map, Scripting, Low Poly, Batching 등 많은 부분에서 이루어진다. 이러한 최적화가 이루어지면 메모리를 절약할 수 있고, 드로우 콜이나 연산 처리가 신속해진다. 이 포스트에서는 드로우 콜을 줄이는 방법 중 하나에 대해 다루려 한다.

 

드로우 콜은 CPU가 GPU에게 오브젝트를 그리라고 요청하는 횟수를 의미한다. 쉽게 말해 오브젝트 개수가 많고, 머터리얼의 개수가 많으면 느려진다는 것이다.

 

만약, 여러 오브젝트와 머터리얼이 하나로 병합된다면 드로우 콜은 크게 감소할 것이다. 이를 예제를 통해 확인해보자.


ⓛ FBX 추출

본 예제에서는 https://assetstore.unity.com/packages/3d/environments/historic/lowpoly-medieval-buildings-58289 를 참고했다.

본 에셋을 온전히 배치했을 때는 272의 드로우 콜이 매 프레임마다 생성되는 것을 볼 수 있다.

※ 공유 머터리얼이 많기 때문에 GPU Intancing 하면 드로우 콜 소폭 감소

이 에셋을 자세히 살펴보면 오브젝트와 머터리얼의 개수가 상당하다.

본 에셋을 FBX 확장자로 Export 할 수 있는 패키지를 설치한다.

※ FBX Exporter 패키지를 사용하면 에셋들의 위치를 그대로 유지하면서 추출 가능

FBX로 추출할 오브젝트를 선택하고 'Export To FBX...'를 클릭한다.

위와 같이 입력해주고 Export 버튼을 클릭한다.

추출 경로인 Assets 폴더에 FBX 파일이 생성되었다.


② 오브젝트 병합

추출한 FBX 파일을 3ds Max에 불러온다.

피봇이 될 오브젝트를 선택하고 Editable Poly로 변환해준다.

Editable Poly의 Edit Geometry에서 Attach 옆에 있는 Attach List 아이콘을 클릭해준다.

피봇 오브젝트에 부착할 오브젝트들을 모두 선택하고, Attach 버튼을 클릭한다.

그러면 다음과 같이 하나의 오브젝트로 묶이게 된다.

여기까지의 결과를 추출(MedievalBuildings_Merge.fbx)해서, 유니티에서 확인해보면,

드로우 콜이 75까지 떨어지는 것을 볼 수 있다.


③ 텍스처 아틀라스

오브젝트만 병합되어도 엄청난 드로우 콜의 감소를 확인할 수 있지만, 한 오브젝트에 여러 머터리얼이 사용되기 때문에 머터리얼을 통합하는 과정 또한 드로우 콜에 도움이 된다.

 

머터리얼은 각 오브젝트에 대한 텍스처를 포함하고 있는데, 이 텍스처들을 하나의 텍스처로 묶는 것(아틀라스)이 핵심이다. 텍스처는 오브젝트가 정의한 UV에 따라 펼쳐진다. 그러나, 현재는 하나의 오브젝트로 병합하는 과정에서 UV가 겹쳐져 있기 때문에 3ds Max에서 UV를 펼쳐주어야 한다.

병합한 오브젝트에 'Unwrap UVW' Modifier를 추가해준다.

Unwrap UVW를 선택하고 Open UV Editor를 클릭한다.

Tools → Pack UVs... 를 클릭하면 시간이 어느 정도 소요된 뒤,

자동으로 UV가 펼쳐진다.

이때, 숫자 0번을 눌러 텍스처를 생성하는 Render To Texture 탭을 열 수 있다. 위 과정을 거쳐 원하는 경로에 아틀라스 텍스처를 생성한다.

① 위와 유사하게 설정하되, 생성 경로와 이름은 자유롭게 설정

② 이미 UV를 펼쳤기 때문에 User Automatic Unwrap은 반드시 해제 (안 하면 Unwrap UVW가 중복됨)

③ Element 이름은 Diffuse Map으로 설정

④ 맵 해상도는 높을수록 좋음

Desktop에 아틀라스 텍스처가 생성되었다.

이제 마지막으로 아틀라스 텍스처를 적용시키고, 추출하기만 하면 된다. M키를 눌러 Material Editor를 연다.

Slot 1번 머터리얼에 추출한 아틀라스 텍스처를 Diffuse Map으로 설정한다.

드래그 앤 드롭으로 머터리얼을 적용한다.

아틀라스 텍스처를 적용한 오브젝트를 FBX 파일(MedievalBuildings_Atlas.fbx)로 추출한다.

오브젝트와 머터리얼을 하나로 통합한 결과 드로우 콜이 9로 떨어졌다.


토론

일단, 이러한 방법을 찾게 된 계기는 유니티에서 자체적으로 Dynamic Batching을 지원하지만, 오브젝트의 폴리곤 개수가 어느 정도 넘어가면 작동하지 않는 것이 문제였다. 그렇다고, 위의 방법이 무조건적으로 좋다고는 할 수 없다.

 

가까이서 오브젝트를 살펴보자.

원본
오브젝트 병합
오브젝트 병합 & 아틀라스 텍스처

멀리서 보았을 때는 큰 차이를 못 느끼겠지만, 가까이서 보면 퀄리티가 낮아지는 것을 확인할 수 있다. 어느 정도, Diffuse Map의 해상도를 높여 보완할 수 있겠지만, 근본적인 문제는 해결할 수 없다.

 

즉, 품질이 중요시 되지 않는 곳에서는 사용해도 좋을 것이다. 생각나는 것으로는 작은 물체나 멀리 있는 물체, 또는 LOD에도 적용할 수 있을 것이다.

 

주의해야 할 점은 오브젝트를 병합하는 과정에서 너무 크게 묶어버리면, 카메라가 단 하나의 오브젝트만 바라봐도 묶여있는 오브젝트들을 렌더링 하므로 합리적으로 묶는 것이 중요할 것이다.

 

이만 글을 마친다.

댓글