해당 주제를 스터디하게 된 배경
처음 XR, AR을 접하게 되었을 때 해보았던 간단한 예제로, AR 포탈로 접하며 AR을 시작하게 되었습니다.
이때 포탈을 구현할 때 Shader 코드를 활용하여 Stencil을 적용하여 오브젝트의 투명을 보정하였고, 시간이 흘러 새로운 프로젝트에서 포탈을 구현하게 될 일이 생겨 이에 대한 레퍼런스를 찾아보니 RF 를활용하여, 구현하는 예제를 확인할 수 있었습니다. 그리하여 RF에 대해 공부해 보고자 해당 주제를 정하게 되었습니다.
RF(Renderer Feature)란?
Renderer Feature로 URP Renderer에 추가적인 Render Pass를 추가하여 새롭게 렌더링을 지원하는 방식 입니다.
아래에서 URP Renderer와 Render Pass에 대해 조금 더 상세하게 다루어 보도록 하겠습니다.
URP Renderer
한 카메라가 장면을 화면으로 바꿀 때 어떤 Render Pass를 어떤 순서로 실행할지를 정의 및 기능 설정을 한
Renderer Asset입니다.
이미지와 같이 RenderPass, PostProcessing, Shadows 등 URP에서 렌더링을 할 Render Pass의 옵션이나 기능을 설정하고, 이를 저장하는 Asset이라고 이해하면 좋습니다.
Render Pass란?
이때 Render Pass 란 TransparentObject, OpaqueObject, Shadow 등을 한 번에 렌더링 하는 것이 아닌 같은 타입의 그래픽스를 어떤 시점에 Command Buffer로 생성하여 GPU에 보내는 과정을 의미합니다. 아래와 같은 URP에서는 RenderPass Event를 가집니다.
이미지와 같은 RenderPassEvent를 가지며 해당 시점마다 Command Buffer를 생성하여 GPU에게 작업을 전달합니다.
이때 해당 시점에 추가적인 Renderer Feature를 정의하여 특이한 렌더링을 적용할 수 있습니다. 아래와 같이 Renderer Feature가 삽입된다고 이해하면 좋을 것 같습니다.
URP Asset (전역 품질) ─┬─┐
│ Renderer Asset (= 카메라용 파이프라인)
│ ├── Built-in Render Pass ① Depth Prepass
│ ├── Built-in Render Pass ② Shadow Caster
│ ├── Built-in Render Pass ③ Opaque Objects
│ ├── …
│ └── **Custom Render Pass** (Renderer Feature가 삽입)
└─┘
추가할 수 있는 Renderer Feature는 아래와 같습니다. 그중 오늘은 Render Objects를 추가하는 기능을 적용해 보겠습니다.
적용해 볼 기능
1. 어떤 오브젝트가 화면(카메라) 기준으로 다른 오브젝트에 폐색(가려진) 경우에 해당 오브젝트의 실루엣을 보여주는 기능
2. Portal 기능 화면에 해당 오브젝트가 보이지 않지만 특정 영역을 통해서 바라본 경우에만 보이는 기능
위 두 가지 기능에 대해서 한번 적용해 보고 정리해보려고 합니다.
가려진 오브젝트에 대한 처리
- 오브젝트 생성 및 오브젝트의 Layer 지정
- 오브젝트 Material 지정 및 Render Objects 설정
- Override Material 설정
여기서 제일 중요한 RenderObjects에 대해서 알아보도록 하겠습니다.
- Name : 해당 Render Objects의 이름 지정 (식별용)
- Event : 어느 시점에 RenderPass를 추가할지 위에 있는 이미지 참조
- Filters : 어떤 타입의 오브젝트에 적용할지에 대한 설정 (Opaque, Transparent), 특정 Layers
- Overrides : 추가 Rendering 선택, Shader or Material
- Pass Index : 해당 RenderPass의 Index > 같은 RenderPass 내에서의 우선순위
- Depth : Depth에 대한 설정 체크
- True : 다른 오브젝트에 가려진 경우에 머테리얼 Overrides
- Depth Test : Depth 차이가 어느 경우에 Overrides를 진행할지 선택 (Disable, Never, Equals, Less Equals, Greater) 등등 옵션을 선택 가능.
- True : 다른 오브젝트에 가려진 경우에 머테리얼 Overrides
이렇게 진행하였을 때 문제점은 같은 Layer 끼리는 Depth에 대한 추가 Render 처리를 하고 싶지 않은 경우가 있는데 아래와 같은 이슈가 발생합니다.
이미지와 같이, Layer가 같을 때 오브젝트가 분리되어 있다면 추가적인 RenderPass가 적용되어 의도하지 않는 Overrides가 일어날 수 있습니다. 이를 해결하기 위해서는 아래와 같은 방식을 추가적으로 진행하면 됩니다.
- Universal Renderer Data Filtering 설정
- Opaque Layer Mask, Transparent Layer Mask 설정 (레이어 지정 해제)
- 해제하게 되면 기본적으로 해당 타입의 오브젝트의 Layer는 렌더링을 하지 않습니다.
- Render Objects 추가하여 Shadow 옵션을 적용한 이후에 Rendering을 해제한 오브젝트를 추가 렌더링을 진행합니다.
위와 같은 변화를 확인해 볼 수 있습니다. 실제 내가 정의한 Render Pass가 어느 시점에 Rendering 되고 있는지 확인하며 디버깅할 수있습니다.
다음 글에서는 두 번째로 적용하려고 하였던 Portal 기능에 대한 설정 및 적용을 진행해 보면서 정리해 보도록 하겠습니다.
'Unity' 카테고리의 다른 글
Renderer Feature - 3(선택적 글로우/하이라이트) (1) | 2025.06.24 |
---|---|
Unity_RF(Renderer Feature) - 2 (0) | 2025.05.23 |
Unity Git hub Acitons - 4 (Game-ci/unity-builder) (1) | 2025.03.13 |
Unity Git hub Acitons - 3 (Unity 연동) (0) | 2025.03.01 |
Unity Git hub Acitons - 2 (Workflow 작성) (0) | 2025.02.25 |