본문 바로가기

Unity/Articles

Unity: 작업중인 프로젝트를 URP로 전환하기 전 확인할 사항

이 게시글은 2021. 5월 경 작성되었습니다. 
다소 상황이 달라졌을 수 있어, URP 디퍼드 렌더링 등 최신 업데이트 된 소식을 꼭 찾아서 확인하세요. 

유니버설 렌더 파이프라인이 뭐길래?

 

Universal Render Pipeline은 기존 LWRP에서 이름이 바뀐 템플릿입니다. High-Definition의 반대편에서 Light-Weight라는 타이틀 아래 개발이 시작되었지만 이런저런 과정을 거쳐 최종적으로 Universal 한 플랫폼에서 동작한다는 의미로 굳어졌습니다.

 

Light 함보다는 Universal 함에 포커스를 맞추고 개발하겠다는 포부를 밝힌 것인데요, 일부 사용자는 이 렌더러가 결코 Light-Weight 하지 않았기에 이름을 바꿀 수밖에 없었던 게 아닌가 의문을 제기하기도 합니다. 사실 개발 초기단계에서 보여준 퍼포먼스에서는 기대만큼 좋은 결과물을 보여주지 못한 것이 사실이기도 합니다.

 

URP Demo - Boat Attack

 

사실상 '경량화'는 메인 피쳐가 아닌 옵션이 되었고, 특수한 상황에서 Built-in 렌더러보다 좋은 성능을 보여주니 결국 필요에 따라 채택할 수 있는 선택지가 되었습니다. 이 일부 '특수한' 상황에 중점을 두어 기존 프로젝트를 업그레이드 해 퍼포먼스 이점을 노릴 수 없을까 고민하시는 분들이 종종 계시는데요, 사실 이미 많은 부분 개발이 완료되었거나 라이브 서비스 중인 프로젝트를 포팅하는 것은 그렇게 간단한 일이 아닐 수도 있습니다. 

 

예를 들면, 외곽선(Outline) 효과나 카메라 스태킹, 데칼 렌더링을 위한 추가 패스, 포스트 프로세싱 외 특별한 효과를 위한 Image Effect 등 원하는 연출을 위해 다양한 방법으로 비주얼을 구현하셨을 겁니다. 위 효과들은 여느 게임에서나 쉽게 사용하는 이펙트들의 일부이며 구현 방법에 따라 부분적으로 URP로 전환이 어려울 수 있습니다. 

 

유니버설 렌더 파이프라인에서는 기본적으로 포워드 렌더러(Forward Renderer)를 사용하는데요, 이는 여러 개의 라이트들을 하나의 패스에서 그려 라이트 당 추가 드로우 콜을 필요로 하지 않습니다. 다시 말해서, Built-In 포워드 렌더러는 여러 개의 라이트를 여러 패스로 그리지만 URP의 포워드 렌더러는 싱글 패스로 그리게 됩니다. 이는 비약적으로 렌더링에 걸리는 밀리초(ms)를 단축시켜 프레임의 상승을 도모할 수 있는 주요한 기능 중 하나입니다. 

 

그러나 아직까지 디퍼드 렌더러에 대한 구현이 되어있지 않기 때문에 디퍼드로 그려야 하는 방식의 데칼, 아웃라인 기능들은 포워드에서 대안으로 사용할 수 있는 방식으로 재 구현해야 합니다. 만약 직접 구현하여 사용하고 있었다면 URP의 제한된 환경에도 Compatible 한 지 미리 확인해보아야 하며, 제네릭 한 포팅 과정이 복잡해지는 경우 성공적으로 포팅할 수 있을지도 고려해야 합니다. 에셋 구매해서 사용하는 경우 역시 URP에서 기능을 완전히 지원하는지 미리 확인해보아야 합니다.

 

카메라 스태킹을 지원한지도 오래되지 않았습니다. 일부 낮은 버전의 유니버설 렌더 파이프라인에서는 1개의 카메라만을 허용하고 있어, URP 7.2.1 이상 버전을 사용해야만 합니다. 1개의 메인 카메라와 그 위에 여러 개의 오버레이 카메라로 구성되는 방식을 취하고 있습니다. 이런 식으로 여러 카메라를 사용하는 경우 퍼포먼스상 불이익을 볼 수 있다는 것도 고려해야 합니다.

 

프로젝트 업그레이드 전 확인 사항

1. 직접 작성하여 사용중인 커스텀 셰이더가 있는지 확인

프로젝트 뷰에서 t:Shader 를 이용해 프로젝트에 포함된 모든 셰이더를 검색합니다.

셰이더가 있다면, 작성한 팀원이 아직 있는지 URP를 위한 셰이더 그래프 또는 hlsl로 포팅이 가능한지 확인합니다.

URP 포워드 렌더러 방식으로 구현 가능한지 검증합니다.

 

2. 셰이더 에셋을 사용하는 경우

검색된 셰이더 중 직접 작성하지 않고 구매한 에셋인 경우 유니버설 렌더 파이프라인의 지원 여부를 확인합니다.

에셋스토어 페이지나 개발자에게 이메일로 확인할 수 있습니다. 가끔 따로 출시하여 추가 비용을 지불해야 하는 경우도 있습니다. 만약 지원 계획이 없다면 유니버설 렌더 파이프라인에서 지원되는 대체 에셋을 찾거나 포팅이 가능한지 확인합니다.

 

3. 모든 씬에서 카메라가 몇 개 사용되는지 확인

카메라가 여러 개 존재하는 것은 문제가 되지 않으나, 스태킹 하여 카메라 위에 또 카메라를 그리려는 경우 문제가 생길 수 있습니다. 오버레이 카메라로 변경할 수 있지만, 셰이더와 연계하여 추가적인 기능이 있다면 어려울 수 있습니다. 하이어라키에서 t:Camera 와 같은 방식으로 검색할 수 있습니다.

 

4. 포스트 프로세싱, 이미지 이펙트 확인

포스트 프로세싱 스택 V2에서 사용되고 있는 효과 중 커스텀 이펙트가 있는지 확인합니다. URP에서는 포스트 프로세싱 관련 코드들이 렌더러에 박혀있습니다. 렌더 피쳐를 통해 새로운 효과를 주입할 수 있으나 마찬가지로 포팅 과정을 거쳐야 하므로 가능 여부를 미리 확인해야 합니다. 무턱대고 렌더러에 기능을 쑤셔박기도 부담스러울 수 있습니다. SRP 배처를 깨트릴 수도 있고, 렌더러를 완전히 파악하지 않은 채로 작업하면 예상치 못한 퍼포먼스 저하를 불러올 수도 있기 때문입니다. 스크립트에서 작업하는 Image Effect도 확인합니다.

 

5. OnRenderObject, OnPreRender, GL 등 유니티 이벤트 확인 및 렌더링 관련 함수

렌더링에 관여하는 스크립트가 있는지 확인해야합니다. URP에서는 Update나 OnRenderObject에서 Graphics.DrawMeshInstancedIndirect와 같은 그리기 메서드의 호출을 허용하지 않기 때문입니다. 다른 확인 사항과 비슷하게 URP 기능 렌더 피쳐로 넣거나 렌더러를 수정해 구현할 수 있을지 확인 과정을 거쳐야 합니다.

 

 

마치며

왜 유니버설 렌더 파이프라인으로 프로젝트를 진행하고 싶으신가요?

 

명확한 타깃 피쳐가 있어야 합니다.

 

어떤 효과를 보기 위해 빌트인 대신 URP를 선택하는지에 대한 근거가 명확해야 하며, 기능 구현에 대한 시간 투자와 인력 할당이 필수적입니다. 단순히 '새로 나온 기능이고 다른 프로젝트에서 종종 채택한다'거나 '싱글패스니까 항상 빠르겠지' 같은 안일한 접근으로는 열심히 작업하다 말고 도로 Built-in으로 유턴하는 경우가 생길지도 모릅니다. 유니버설 렌더 파이프라인은 Built-in 렌더러보다 빨라질 여지가 존재할 뿐 모든 경우에 대해 유리하지 않음을 인지해야 합니다.

 

 

참고 사이트

 

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@12.0/manual/index.html

 

Universal Render Pipeline overview | Universal RP | 12.0.0

Universal Render Pipeline overview The Universal Render Pipeline (URP) is a prebuilt Scriptable Render Pipeline, made by Unity. URP provides artist-friendly workflows that let you quickly and easily create optimized graphics across a range of platforms, fr

docs.unity3d.com

https://blogs.unity3d.com/kr/2019/09/20/how-the-lightweight-render-pipeline-is-evolving/

 

How the Lightweight Render Pipeline is evolvingURP - 경량 렌더 파이프라인의 진화軽量レンダーパイプライン

We have renamed the Lightweight Render Pipeline in 2019.3. It’s now the Universal Render Pipeline, a powerful solution that delivers beautiful graphics and performance while scaling to a wide range of platforms. The Universal Render Pipeline supports the

blogs.unity3d.com