Unity URP) URP Sample로 기능 살펴보기
URP(Universal Render Pipeline)
Unity에서 지원하는 스크립터블 렌더링 파이프라인(SRP) 중 하나로, 고성능 그래픽과 광범위한 플랫폼 호환성을 제공하기 위해 설계되었다.
URP는 모바일, PC, 콘솔 등 다양한 디바이스에서 효율적으로 작동하도록 최적화되어 있으며, 개발자가 더 빠르고 쉽게 화려한 게임을 만들 수 있도록 돕는다.
URP의 주요 특징
성능 최적화: URP는 다양한 플랫폼에서 높은 성능을 유지하도록 설계되었다.
쉬운 설정과 사용: 사용자 친화적인 인터페이스와 설정을 통해 개발자가 더 쉽게 접근할 수 있다.
그래픽 품질: URP는 뛰어난 그래픽 품질을 제공하며, 라이트웨이트(Rendering Pipeline)에서 발전한 기술을 기반으로 한다.
확장성과 유연성: 개발자는 자신의 프로젝트 요구사항에 맞게 URP를 커스텀할 수 있다.
URP Sample 살펴보기
URP 패키지 샘플 | Universal RP | 14.0.9
URP 패키지 샘플 URP 패키지 샘플은 유니버설 렌더 파이프라인(URP)용 [패키지 샘플]입니다. 여기에는 예제 셰이더, C# 스크립트, 그리고 빌드하는 데 사용하거나 기능 사용법을 배우거나 애플리케
docs.unity3d.com
URP Sample은 Unity에서 제공하는 URP의 기능을 살펴보고 테스트하기 위한 패키지 샘플이다.
샘플을 구동시키기 위해서는 Unity에서 URP 모드로 프로젝트를 생성해야 하며, Package Manager에서 Universal RP - Samples 탭에서 URP Package Samples를 Import 해야한다.
본 글에서 사용한 버전은 다음과 같다.
Unity: 2022.3.22f1 LTS
Uiversal RP: 14.0.10
Camera Stacking
여러 개의 카메라를 레이어링하여 별도의 출력을 할 수 있다.
카메라의 Render Type으로 메인과 서브 카메라를 지정해준다.
메인 카메라는 Base, 서브 카메라는 Overlay로 지정한다.
서브 카메라를 메인 카메라의 Stack에 등록한다.
이렇게 별도의 카메라를 두면 FPS 게임에서 발생할 수 있는 Object Clipping 현상을 방지할 수 있다.
카메라 스태킹을 적용했을 때
카메라 스태킹을 적용하지 않았을 때
카메라 스태킹은 기본적으로 카메라를 여러 대 두는 것이다.
따라서 다음과 같이 하나의 화면을 분할하여 각각의 화면에 PP나 기타 셰이더를 먹일 수 있다.
카메라 스태킹을 통해 분리된 공간을 하나의 화면에 그릴 수 있다.
다음은 다른 공간에 배치된 두 카메라를 합쳐 구 형태의 구름을 지형물 바깥쪽에 그리는 과정이다.
메인 카메라는 오른쪽 아래 난간이 있는 넓은 공간에 있다.
Skybox 카메라
지형물 카메라
결과물
Decal
특정 Material(재질)을 다른 오브젝트에 투사하는 기능이다.
URP에서 제공하는 데칼은 Shadow Map보다 하드웨어 부담이 적다고 한다.
Cylinder 밑에 배치된 그림자는 임의의 Shader가 입혀진 Material이 적용된 오브젝트이다.
여기에 Decal Projector 컴포넌트를 추가해야 비로소 다른 물체에 투영된다.
Scene 뷰에서는 저렇게 투영 방향이 화살표로 보인다.
Shader Graph로 노이즈가 들어간 간단한 Material을 만들고 여러개의 Decal Projection 오브젝트를 배치한 모습이다.
Decal Projection으로 Spot Light를 만들 수 있다.
이 때의 Spot Light를 Proxy Light 라고 한다.
Decal Projection은 단지 Material을 투사할 뿐이다.
따라서 빛에 의해 그림자가 가려진다거나 하는 디테일한 쉐이딩은 어렵다.
그러면 Decal Projection으로 빛과 그림자를 표현하면 뭐가 달라질까?
오브젝트에 직접 빛과 그림자를 렌더링 할 경우 Depth Prepass 단계 전에 4개의 SRP Batch 호출이 발생한다.
반면 Decal Projection으로 빛과 그림자를 표현하면 대신 Draw Mesh 호출로 나타난다.
Lens Flare
렌즈 플레어는 렌즈 시스템(카메라에도 있고 우리 눈에도 있다)에서 빛이 산란되고 반사되어 새로운 상이 나타나는 자연 현상이다.
메인 광원(Light 컴포넌트가 있는 오브젝트)에 Lens Flare을 추가해서 구현한다.
Lens Flare Data에 다양한 렌즈 플레어 프리셋을 넣을 수 있다.
원신에서 구현한 렌즈 플레어
Light
Reflection Probe
Reflection Probe로 주변 사물을 반사하는 구체를 만들 수 있다.
URP Asset에서 Lighting - Reflection Probes 설정을 해주어야 한다.
Unity에서 말하는 Probe란 기하학적으로 정의된 어떠한 영역이다.
Reflection Probe의 경우 주변광을 반사하는 효과를 가지는 영역이 된다.
이런식으로 영역을 정해줘야 한다.
참고로 영역의 경계에 걸쳐있는 경우 이렇게 나타난다.
구체의 셰이더에 영향을 받지만 나름 잘 나타난다.
Renderer Features
위에서 소개한 것 말고도 다양한 렌더러 기능을 URP에서 지원한다.
Ambient Occlusion(SSAO)
앰비언트 오클루전이란 광원(Ambient Light)에 특정 지점이 얼마나 노출되어 있는지를 표시하기 위한 렌더링 기법으로, 최적화된 방식으로 그림자를 구현한다.
Glitch Effect
오브젝트가 자글자글하게 나타나는 효과이다.
여기서는 특정 Layer의 오브젝트에 글리치를 먹이는 과정이다.
씬 전체에 적용할 글리치 URP 에셋을 장착한 다음 URP 에셋에 글리치 Renderer Data를 등록한다.
글리치 Renderer Data에서는 글리치 효과를 먹일 Layer를 지정해준다.
오버라이드할 Material을 지정해줄 수도 있다. (Material 자체는 글리치 효과가 없지만 렌더러에서 효과를 부여해주는 것이다.)
색깔 값이 없는 셰이더에 글리치 효과를 입히면 위와 같이 나온다.
Keep Frame
생성된 이펙트에 잔상을 남길 수 있다.
빛 번짐 효과 역시 중첩된다.
여기서는 Keep Frame 이라고 소개돼있다.
원래의 이펙트는 단순히 소용돌이 모양으로 솟는 Particle System이다.
Occlusion Effect
오브젝트의 가려진 부분을 다른 Material로 채우는 효과이다.
Depth Test를 Greater로 설정하여 뒤쪽에 있는 오브젝트를 앞에 그리되, 다른 Material로 그리도록 한다.
Depth Test가 뭔지 모르겠다면?
깊이 버퍼(depth buffer)와 스텐실 버퍼(stencil buffer)
OpenGL 공식 사이트를 통해 Depth Buffer와 Stencil Buffer에 대해 알아보자. Ray tracing의 경우 연산량이 많지만 눈으로 부터 광선이 역추적하여 픽셀에 렌더링되기 때문에 멀리있는 오브젝트가 그려지지
psgood.tistory.com
Trail + Keep Frame
Keep Frame 효과로 오브젝트의 흔적을 다른 오브젝트에 남기는 기법이다.
메인 카메라로 디스플레이를 렌더링하고 추가 카메라로 Depth Normal을 그릴 텍스처에 렌더링한다.
Sand Graph라고 하는 셰이더 그래프에서 Depth Texture를 가지고 표면에 샘플링한 다음 Vertex를 옮긴다.
URP의 정수랄까
가장 이해하기 어려우면서 또 가장 아름다운 효과다.
2개의 카메라와 2개의 렌더러, 3개의 머티리얼과 셰이더그래프, 그리고 1개의 텍스처까지.
각각의 렌더링 도구들이 얽히고 설켜 이런 작품을 만들어 낸다.
여기서 추가 카메라는 Orthographic(정사영) 방식으로 프로젝션한다.
핵심은 Renderer인데, Keep Frame 기능이 추가된 Renderer Data를 불러와야 한다. 그래야 이 카메라가 구체가 그리는 잔상을 추적할 수 있다.
TransparentFX는 Depth를 추적할 대상의 레이어가 되고, 추적의 결과를 디스플레이가 아닌 TrailMap 이라는 텍스처에 저장한다.
Depth Renderer이다.
Keep Frame에 등록된 Display Material은 Keep Frame 렌더러가 매 프레임마다 새로 잔상을 그릴 때 참고하는 Material이다.
Draw Objects는 구체에 DepthNormal이라는 Material을 덧씌워 렌더링한다.
렌더 오브젝트 렌더러 기능 | Universal RP | 14.0.9
렌더 오브젝트 렌더러 기능 URP는 DrawOpaqueObjects 및 DrawTransparentObjects 패스로 오브젝트를 그립니다. 프레임 렌더링의 다른 지점에 오브젝트를 그리거나 렌더링 데이터(예: 뎁스, 스텐실 등)를 다른
docs.unity3d.com
Trail Effect Render는 디스플레이를 그리는 렌더러이고 Depth History Renderer는 TrailMap 텍스처를 그리는 렌더러이다.
따라서 디스플레이를 그리는 렌더러를 Default로 설정해준다.
Sand Graph 셰이더 그래프의 모습이다.
Input으로 받는 TrailTexture가 바로 아까 추가 카메라의 추적 결과가 저장된 Depth Texture이다.
Normal Reconstruct Z 노드가 Depth Texture를 가지고 실제 Sand의 Vertex를 수정한다.
Sand Material에 잔상이 남은 모습
Shader
Lit 셰이더가 적용된 Material의 Property를 바꾸는 것 만으로도 얼마나 다양한 표면이 형성되는지 보여준다.