11 C
Seoul
Monday, February 24, 2020
Home Blog 유니티 2019.3 출시, 포팅 시작

[URP 포팅] 유니티 2019.3 출시, 포팅 시작

며칠 전에 유니티 2019.3 정식 버전이 출시되었습니다. 현재 진행중인 프로젝트를 Universal Render Pipeline(이하 URP)으로 포팅하려고 기다리고 있었는데 Release Candidate만 계속 나오더니 드디어 정식 버전이 나왔습니다. URP로의 포팅은 렌더링 엔진을 완전히 갈아타는 일이기 때문에 기존에 사용하던 애셋과 셰이더가 동작하지 않는 경우가 많아서 기술적으로도 할 일이 많고, 아티스트 입장에서는 렌더링 결과물의 차이를 좁히기 위해서 재작업을 해야 할 것도 많습니다. 한 마디로 프로젝트에 있어서는 큰 리스크가 될 수 있는 작업이기 때문에, 2019.3 정식 버전이 출시되자 마자 바로 포팅을 시작하기로 했습니다. 작업을 진행하면서 혼잣말처럼 메모해 둔 것을 옮긴 것이라 격식도 없고 두서도 없습니다. 😁 

(진행중인 프로젝트는 유니티 2019.2에서 내장 렌더링 시스템을 사용중입니다.)


드디어 유니티 2019.3이 출시되었다. 포팅 시작!

브랜치를 하나 만들어서 2019.3에서 로딩을 하니 컴파일 에러가 난다. 없어진 클래스들이 있다. GUITexture, GUIText가 없어져서 UI.Image, UI.Text로 바꾸라는 에러 메시지가 나온다. 단순하게 Replace All을 해보니 GUITexture.texture는 있지만 UI.Image.texture는 없어서 에러가 난다. 두 클래스는 이름만 바뀐 것이 아니라 개념이나 사용법이 바뀐 것이라서 거기에 맞춰서 작업을 좀 해줘야 한다. 실제로는 쓰지 않는 코드라서 지웠다.

위에 이슈 말고는 2019.2에서 돌아가던 코드를 2019.3으로 열었을 때 문제가 생기는 부분은 없다. 대충 플레이 테스트해보니 동작에도 문제는 없는 것 같다. 2019.3으로 여는 것만 해도 문제가 많을 줄 알았는데, 정말 다행이다. 😍 (Asset Database v2로 업글하는 옵션을 선택해서인지 처음 임포트 시간은 무지하게 오래 걸렸음)

자, 이제 URP 적용을 시작해보자.Package Manager에서 URP 설치부터 고고.

URP만 설치해도 기존 애셋들을 다시 임포트한다. 뭘 하는 걸까. 실제로 파일상의 변경사항은 없다. 안그래도 프로젝트의 셰이더 키워드가 많았는데, URP 설치와 함께 글로벌 키워드가 256개가 넘어서 엄청나게 많은 에러가 나온다.

할 일 추가 : 셰이더 키워드 줄이기

그 다음에 Render Pipeline 애셋을 하나 만들어서 설정.. (하는 순간 모든 것이 깨져버리겠지 ㅠ)

자동으로 Renderer 애셋이 만들어지고 설정된다.

이제 Graphics 설정에 가서 방금 만든 애셋을 드래그한다.

화면이 다 날라갔다. 온통 보라색.. 😱

이제부터 하나하나 URP 용 셰이더로 바꿔줘야 하는데, 처음 할 일은 구매한 애셋중에서 URP 지원 업데이트가 있는지 찾아보는 것. 터레인용 셰이더 구매한 것이 있는데 다행히 HDRP, LWRP를 지원한다. LWRP용 셰이더로 교체해도 에러가 나는데, include 하는 경로에 패키지 이름이 LWRP로 되어 있기 때문. URP 용으로 만들려면 lightweight 부분을 universal로 바꿔주면 된다.

// #include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

일단 보이는 것은 모두 Replace All 해보자. 음, 드디어 지형은 보이는군.

다음으로는 배경 프랍용으로 산 셰이더다. LWRP 용을 지원한다고 해서 업데이트해보니 LWRP용 unitypackage 파일이 포함되어 있다. 임포트 해보니 LWRP용 셰이더가 들어있고, 재질들은 업데이트된다. 보라색을 없애면서 보니 배경 프랍용으로 Standard 셰이더를 쓴 것도 있고 구매한 셰이더를 쓴 것도 있다. URP 포팅은 어디서 어떤 셰이더를 사용하고 있는지 파악할 수 있는 좋은 기회인 것 같다. 포팅을 진행하면서 현재 셰이더 사용 현황을 정리하면 좋겠다.

할 일 추가 : 배경 프랍용 셰이더 정리

배경 풀에 사용하던 셰이더도 비슷한 방법으로 정리 완료. 일단 배경은 포팅 완료.

다음은 카메라에 붙은 포스트 프로세싱. 얘네는 하나도 동작을 안한다. URP에서 포스트 프로세싱 방식이 완전히 바뀌었다. 카메라에 스크립트를 붙여서 OnRenderImage()에서 Graphics.Blit()을 호출하던 방식은 동작하지 않는다. Render Feature 같은 것을 구현해서 URP 렌더러에 끼워 넣어야 한다. 우선 애셋 제작자의 페이지를 찾아가 보자.

아.. 애셋 내렸다. ㅠ 이제 팔지도 않는다.

URP에서는 Post Processing Stack(이하 PPS)을 내장했다. 볼륨 기반으로 설정할 수 있는 부분도 좋아서 내장 PPS를 쓰고 싶지만, Bloom의 경우에 Temporal Filtering이 안되서 깜빡깜빡 거리는 부분과 모바일에 맞게 성능과 품질을 트레이드오프하는 옵션이 없는 점 등이 맘에 걸린다. Lenz Dirt 옵션이나 LUT로 색상 조절하는 부분은 괜찮아 보이고, Depth of Field는 품질은 괜찮아 보이는데 성능이 괜찮을지 테스트가 필요하다. 포커스 거리를 수치로만 입력할 수 있고 Transform을 트래킹 하는 기능이 없어서 따로 코딩을 해줘야 한다. Radial Blur와 지금 사용 중인 몇 가지 화면 효과가 구현되지 않는 것도 문제. 그러나 우선은 대안이 없으니 PPS를 써서 가능한 한 맞춰보자.

PPS를 적용하기 전에 아래 블로그 글을 다시 읽으면서 복습을 해보자.

읽다 보니 업그레이드 가이드가 있었다.

역시 글을 읽으니 배우는 것이 있네. Quality Settings에도 URP Asset을 드래그해야 한다. 확실히 URP Asset 쪽으로 많은 설정이 넘어간 것 같다.

업그레이드 전에 할 일이 있는데, Assembly Definition을 쓰고 있다면 GUID 기반으로 바꿔야 한다고 한다.

할 일 추가: Assembly Definition -> GUID 기반으로.

셰이더를 URP 용으로 바꿀 때는 태그도 바꿔줘야 한다. 현재도 별칭으로 인식해서 돌아가기는 하지만 바꾸는 것이 좋다고 한다. 셰이더나 C# 코드에서 아래와 같이 변환해준다.

  • Lightweight2D → Universal2D
  • LightweightForward → UniversalForward
  • LightweightPipeline → UniversalPipeline
  • UsePass “Lightweight Render Pipeline/…” → UsePass “Universal Render Pipeline/…”
  • “UnityEditor.Rendering.LWRP.xxx” → “UnityEditor.Rendering.Universal.xxx”
  • #include “Packages/com.unity.render-pipelines.lightweight/xxx” → #include “Packages/com.unity.render-pipelines.universal/xxx”

이제 포스트 프로세싱 옮길 차례. Create > Volume Profile 메뉴로 새 프로파일을 만들고, 씬에 있는 아무 GameObject나 (나는 카메라에 붙였음) Volume 컴포넌트를 붙인다. 이름을 잘 골라야한다. Postprocessing Volume 같은 것은 URP용이 아니다. 그냥 수식어 없는 Volume Profile을 만들고, 그냥 Volume 컴퍼넌트를 붙이자.

Bloom, Lens Dirt, Color Lookup, Tonemapping(ACES), Depth of Field, Motion Blur 등을 세팅해줬다. Radial Blur는 어떻게 할지 찾아봐야겠다.

할 일 추가: Radial Blur 찾아보기

구매해서 사용 중인 포스트 프로세싱 이펙트 애셋이 있어서 알아보니 URP에 내장된 PPS는 아직 커스텀 이펙트를 구현해서 넣을 수 없다고 한다. 유니티에서는 기능을 준비 중이라고 하고, 애셋 제작자도 방법이 생기면 지원해준다고 한다. 우선은 좀 기다려봐야겠다.

작업을 하다 보니 배경 중간중간에 보라색 덩어리들이 보인다. Standard 셰이더를 쓰는 녀석들이 아직 남아있다. 일단은 Lit 세이더로 통일. 성능을 생각하면 Simple Lit을 쓰고 싶은데 Smoothness 조절이 맵으로 밖에 안되서 아티스트분들이 유니티에서 간단하게 조절하기도 어렵고 불필요하게 맵이 추가될 수도 있을 것 같다. 좀 알아보니 Lit은 Physically-Based Rendering(이하 PBR) 셰이더이고, Simple Lit은 PBR이 아니다. Lit은 안타깝게도 Detail Normal이 없다. 나중에 배경 전용 셰이더를 하나 만들어야 할 것 같다. 역시나, 셰이더를 정리할 수 있는 좋은 기회다.

이제 NGUI를 포팅하려고 하는데, 의외로 NGUI 자체는 잘 나오는데 URP가 카메라의 중첩을 지원하지 않는다! 🙅‍♂️인게임용 3D 카메라가 그린 프레임 버퍼 위에 NGUI 카메라로 UI를 얹어서 그리는 것이 안 된다는 얘기 ㅠ

일단 오늘은 여기까지..

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Stay connected

58FansLike
56FollowersFollow
156FollowersFollow
128FollowersFollow

Recipe of the day