Unity_URP RF(RendererFeature)
해당 주제를 스터디하게 된 배경처음 XR, AR을 접하게 되었을 때 해보았던 간단한 예제로, AR 포탈로 접하며 AR을 시작하게 되었습니다.이때 포탈을 구현할 때 Shader 코드를 활용하여 Stencil을 적용
develophyun.tistory.com
이전 글에서 URP의 Renderer Feature에 대해 알아보았는데 예제가 너무 부족한 것 같아 추가적인 예제를 작성하기 위에 글을 작성하게 되었습니다.
Render Objects의 Overrides 항목에 Depth Test의 옵션 중 Write Depth, Depth Test로 나뉘어 있습니다.
이때 Write Depth는 해당 Render Objects의 효과를 깊이 버퍼에 Write를 할 것인지를 설정하는 옵션. 이 Write 된 효과는 후에 나타나는 Render Objects 옵션에 영향을 주기 위해 의도하여 Write 하는 경우이고, Depth Test의 경우에는 해당 효과를 시각적으로만 보이고, Write 하지 않는 옵션으로 이해하였습니다.
이해한 것을 기반으로 GPT와 씨름을 해보며, 자주 사용하는 8가지 효과에대해 질의해 보았고, 이를 하나하나 이해하며, 예시 데이터를 만들어보도록 하겠습니다.
1. Renderer Feature로 자주 만드는 8가지 효과
1 | 오브젝트 실루엣(X-Ray) | ① 일반 렌더 → ② Render Objects NotEqual, WriteDepth Off, 투명 머티리얼 | NotEqual 로 “가려진 곳만” 통과 |
2 | 셀·카툰 아웃라인 | ① 기본 메쉬로 깊이 기록 → ② 동일 메쉬를 살짝 스케일 + Equal | 2 패스째는 Equal, WriteDepth On |
3 | 선택적 글로우/하이라이트 | ① Mark Stencil = 1 (ColorMask 0) → ② Fullscreen Pass에서 Stencil 1 영역만 블룸 합성 | 스텐실 비교식 Equal 1 |
4 | 월드 HUD / 디버그 기즈모 | Render Objects, Depth Disabled | 깊이無 → 항상 화면 위 |
5 | 카메라 후면 하늘·포그 볼륨 | Render Objects(Full-screen Quad) GreaterEqual, WriteDepth Off, Event After Opaques | Reversed-Z면 LessEqual 대신 GreaterEqual |
6 | 오브젝트-전용 RenderTexture 캡처 | Custom Pass → RT 설정 → 필요한 시점에 Draw | CopyColor / CopyDepth를 참고 cyanilux.comdocs.unity3d.com |
7 | 특수 디칼(탄흔·낙서) | Render Objects, Layer = Decal, LessEqual, ZWrite Off, 비슷한 깊이 허용 | 동일 표면 지글 방지 |
8 | 전체 화면 후처리 | Fullscreen Pass(ShaderGraph FullScreen Stack) 또는 C# ScriptablePass | 대부분 Depth Always + ZWrite Off |
2. 셀-카툰 아웃라인
적용 방식 순서
1. 기존 Depth 버퍼에 해당 오브젝트의 Mesh를 그립(기록) 니다.
2. 머테리얼을 적용했을 때 기존 mesh 대비 좀 더 크기가 크게 그려지는 Shader Graph를 만듭니다.
3. 머테리얼을 활용하여 추가적인 그래픽을 그립니다. 이때 Depth Test의 옵션을 변경하며 테스트를 진행합니다.
4. 이때 Mesh를 Depth 버퍼에 기록하고, 해당 생성한 Material을 override 하여 이전 Depth 버퍼와 비교하여 효과를 적용합니다.
여기서 기존 Depth 버퍼에 Mesh를 Write를 한다는 뜻은 각 Rendering Event 시점에 별도의 처리가 없으면 자동으로 Write가 됩니다. 그 이후에 FrameDebugger를 통해 Clear Depth를 하지 않았다면, 기록된 Depth를 활용하여 RenderPass의 최종 렌더링이 결정됩니다.
먼저 필요한 Shader Graph를 만드는 과정을 정리해 보겠습니다. Outline이 나타나게 되려면 아래와 같은 순서대로 Graph를 구성해야 됩니다.
- Vertex의 Position을 테두리 윤곽을 나타내기 위해 Vertex를 Custom 합니다.
- Vertex를 커스텀할 때 Object 기준으로의 Position과, 오브젝트의 normal기준으로 두께를 곱하여 테두리를 표현합니다.
- 두 개의 Vertex position을 합친 다음 Object의 Vertex Position에 적용합니다
- 다음으로 해당 테두리의 색상을 변경하기 위해 Color 값을 Parameter로 열어주고, 이를 Fragment Base Color에 연결해 줍니다.
이제 스터디하면서 요청하였던 해당 RenderPass의 순서를 변경하였을 때 똑같은 방식의 효과를 낼 수 있는가? 에 대해서 한번 해보겠습니다.
기존 1. OpaqueObject Rendering, 2. OutlineRenderPass Rendering 순으로 작업하였을 때 정상적으로 Outline이 나타났는데 이를 뒤집어서 적용해 보도록 하겠습니다.
이번에는 Render Pass의 순서를 조정하여, 1. Outline Pass RenderPass를 진행하고, 2. Opaque Object 렌더링을 진행하는 방식으로 outline을 표현해 보겠습니다.
적용 순서
- Renderer Feature의 Event 순서를 변경합니다.
- 먼저 Outline Pass를 실제 오브젝트 형태로 사용하기 위해 Graph를 Custom 제작합니다. Outline이 아닌 내부 오브젝트 렌더링용.
- 다음으로 Outline으로 지정할 색상을 기본 오브젝트의 Material로 지정하여, Depth 순서를 조정합니다.
여기서 오브젝트의 외곽선을 표현하는 노란색이 실제 오브젝트의 Material을 의미하고, 내부에 보이는 흰색이 RenderObjects로 새롭게 렌더링 하여 Depth Test를 진행한 그래픽입니다.
장점
- 변경된 방식의 장점은 외곽선까지 오브젝트의 물리 연산을 진행하게 될 때 직관적으로 소스를 작성할 수 있음.
단점
- 내부의 Object의 렌더링이 그림자 표현이 일어나고 있음.
- 외곽선이 아닌 실제 캐릭터의 렌더링을 커스텀하게 제작하게 되면, 노말맵이나 라이트에 영향이 가 고려해야 될 사항이 많음.
- 또한, 텍스쳐가 포함되어 있으면 위와 같은 그래픽을 구현하는데 제약사항이 있을 수 있음.
다음 글에서는 위의 표에서 제시하였듯이, 선택적 글로우/하이라이트에 대한 효과를 적용해 보도록 하겠습니다.
'Unity' 카테고리의 다른 글
Renderer Feature - 3(선택적 글로우/하이라이트) (1) | 2025.06.24 |
---|---|
Unity_URP RF(RendererFeature) (0) | 2025.05.12 |
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 |