Unity/Unity Study

[USD SDK] 유니티에서 USD 사용하기 (feat. Nvidia Omniverse)

pnltoen 2023. 8. 9.
반응형

USD SDK

Unity Technologies


 

서론

 

Pixar에서 만든 Universal Scene Descrption 즉 USD 포맷을 유니티에서 사용할 수 있는 방법에 대해 포스팅하고자 합니다.

 

Pixar Animation Studios

What is USD? Developed by Pixar, Universal Scene Description (USD) is the first open-source software that can robustly and scalably interchange 3D scenes that may be composed of many different assets, sources, and animations, while fostering highly collabo

www.pixar.com

해당 포맷에 대한 설명을 간단하게 하자면, 단순히 Mesh, Hiearachy만 포함된 기존 CAD (fbx, step, stp, obj, sldprt 등등)의 파일과는 달리 컴포넌트, 애니메이션, 라이팅, 카메라 등등 씬 전체를 삽입할 수 있는 포맷입니다. 개인적으로 Nvidia의 Omvnierse가 USD 관련해서 많은 내용이 구현되어 있습니다. Delta 개념 및 Layer 참조하는 것에 혁신을 느낌...

 

Pixar's Universal Scene Descrption for Unity out in Prevew

 

Pixar's Universal Scene Description for Unity out in Preview | Unity Blog

The USD distribution ships with skeletal deformation support in the form of vertex skinning via UsdSkel. When an asset has a UsdSkel skeleton rig, it will be imported into Unity automatically as a SkinnedMeshRenderer. Similarly, when exporting a model that

blog.unity.com

 

이전에 Omniverse를 하면서 USD format에 관한 Omniverse의 시각은 많이 보았지만 유니티에서의 시각은 어떠할까? 찾아보았다. 결과적으로 최신 자료는 찾지 못해서 해당 아티클에 있는 내용을 비교 분석해보았다.

(중요 X) 기존 Generic Formats과 차별점이 없는 부분

 

Materials & Shading, Vertex Skinning, Streaming Playback Camera, Light의 경우 기존 FBX, OBJ에서도 지원하고 있다.

 

USD Variants

 

Pixar의 기술문서를 보았을 때 USD Variants라는 표현 보다는 Layer를 이용한 Author Variants라고 표현하는 것이 정확한 것 같다. 즉 기존 VCS, GIt 처럼 여러 버전의 씬 환경을 구현할 수 있다. 유니티에서는 Component 형식으로 구현이 되어 있다.

 

이해를 돕기 위해 Omniverse의 Isaac Sim에 서도 보면 다음과 같다. Root Layer에서 각각 연결이 되어 있는 모습.

 

 

USD Payloads

 

유니티에서는 씬 안의 오브젝트에 있는 체크박스를 통해 active 여부를 조정할 수 있다. 하지만 실제 비활성화를 통해 오브젝트가 눈에 보이지 않아도 씬 안에는 존재하고 render를 하지 않는 상태로 메모리 측면에서는 자원이 낭비되게 된다. 하지만 USD의 Payloads 기능을 사용하면 불필요한 메모리 소모 없이 씬 내에 오브젝트를 관리할 수 있다.

 

Pixar의 공식 자료에서 memory efficiency와 같은 이야기가 많았는데 별도의 참고할 만한 레퍼런스는 찾지 못했다. 아무래도 각 Scene에 어떤 오브젝트를 unload 하는지에 따라 달라지기 때문에 정확한 레퍼런스를 찾기는 어려울 것 같다.

 

 

Attribute Inspector

 

유니티에 있는 Transform에서 업데이트 된 내용이다. 옴니버스에서는 vertex 및 triangles 값에 대한 수정도 가능하다. 유니티에서는 read-only로 설정되어 있음.

 

개인적으로 Attribute Inspector를 통하면 별도의 컴포넌트 없이 Mesh에 대한 정보 및 값 수정을 할 수 있어서 자주 사용했다.

 

 

본문

해당 패키지는 USD Unity SDK에서 다운로드 받으실 수 있습니다.

 

GitHub - Unity-Technologies/usd-unity-sdk: Integration of Pixar's Universal Scene Description into Unity

Integration of Pixar's Universal Scene Description into Unity - GitHub - Unity-Technologies/usd-unity-sdk: Integration of Pixar's Universal Scene Description into Unity

github.com

 

제약 사항 확인

 

가장 중요하다고 생각하는 부분입니다. Known Limitation 부분을 보시면 잘 정리되어 있습니다.

 

 

Blend Shapes와 Custom prims가 지원되지 않는 것을 보니 대략적으로 느낌이 오네요. 수정된 vertex의 반영은 안되는 것 같습니다.

 

설치 및 사용

현재 보정이 없고 사실적인 Linear workflow만 지원합니다. 따라서 Edit - Project Settings - Player에서 Linear로 설정을 변경합니다.

 

 

Skinned Mesh의 경우 뼈대 제한 개수가 있습니다. 해당 설정의 제한을 풀어주기 위해 Edit- Project Settings - Quality 에서 Skin Weibghts를 Unlimited로 변경합니다.

 

설치 방법은 패키지매니저에 "https://github.com/Unity-Technologies/usd-unity-sdk.git?path=package/com.unity.formats.usd" 를 git으로 다운 받으면 됩니다.

 

 

(중요) 샘플 이슈

 

아티클에서 Flim-tv-toolbox에서 usd Sample을 찾을 수 있다고 이야기 했지만 실제 확인해보니 usd 파일은 없고 scene으로 저장된 것을 확인할 수 있다.

 

따라서 실제 샘플이 아니기 때문에 별도로 샘플을 구해보고자 했다. 샘플의 경우 기존 Omniverse Neuclus 쪽으로 연동을 시켜놓았는데 현재는 관련된 문서가 사라진 것 같다. 

 

특징 분석

 

지금부터 USD의 특징을 되돌아보자. USD는 참조형식으로 기본 크기 자체는 크지 않다. 작년에 진행한 Crane의 경우 8kb의 크기가 나온다.

 

 

따라서 열어보면 35000개의 삼각형을 갖고 있지만 USD 파일 자체는 매우 가벼운 것을 알 수 있다. 물론 여기에 텍스쳐나 이미지 쉐이더가 추가되면 당연히 크기는 더욱 커짐. 

 

Isaac Sim의 Warehouse 또한 확인해보았다. 이 경우 유니티 상에서는 다음과 같이 출력이 된다. 

 

 

한눈에 봐도 메테리얼, 텍스쳐, 쉐이더 부분은 유니티와 옴니버스가 다르기 때문에 연동이 되지 않는 것을 볼 수 있다. 사실 이 경우에는 USD 파일 자체를 갖고 오는 것이 아니라 Omniverse의 Unity Connector를 사용하는 것이 맞다. 하지만 Joint(=Articulation) 및 Shader, HDRI는 아직 100% 지원을 하지 않기 때문에 100%의 연동은 되지 않는 것으로 이해하는 것이 좋다.

 

실제 Omniverse에서 열었을 때는 다음과 같다.

 

 

개인적으로 되게 흥미롭게 본 부분이 Optimze 부분이다. 

 

 

옴니버스는 Scene Optimizer 라는 것을 제공하는데 실제 같은 USD를 불러와도 31239492개의 삼각형을 그리는 것을 확인할 수 있다. 반면 유니티의 경우 429000000 보다 많은 삼각형을 그리는데 이는 몇몇 참조되는 오브젝트와 메테리얼이 빠져있다는 점을 가정했을 때는 상당히 많은 수치이다. 

 

시작하는 단계에서 그래픽 최적화에 관심이 없어도 에디터 단에서 많은 부분을 해준다는 점이 흥미로웠음. 나중에 날 잡고 똑같이 불러온 후 최적화를 진행했을 때 어느정도의 31239492개보다 줄일 수 있는지 또는 줄일 수 없는지 테스트 해보면 재밌을 것 같다는 생각이 들었다.

반응형

댓글