WinCNT

URP에서 유니티짱 툰쉐이더2.0(UTS2)의 Outline이 제대로 나오지 않는 이슈 + SRP Batcher가 제대로 작동하지 않는 이슈 본문

Unity/Unity 개발 중 발생한 이슈 정리

URP에서 유니티짱 툰쉐이더2.0(UTS2)의 Outline이 제대로 나오지 않는 이슈 + SRP Batcher가 제대로 작동하지 않는 이슈

WinCNT_SSS 2023. 8. 28. 17:57

발생한 이슈

다른 팀(?)의 프로젝트의 최적화 작업을 돕던 도중, 유니티짱 툰쉐이더 Ver2.0(UTS2)이 적용된 캐릭터를 확인하던 중에 2가지 문제점이 있다는 사실을 알게 되었다

 

하나는 Outline이 제대로 나오지 않는다는 점이었고, 다른 하나는 SRP Batcher가 제대로 작동하지 않는다는 점이었다


이슈 상세

빨간색 Outline을 그렸을 때는 다음과 같은 현상이 발생했다

UTS2의 Outline을 Active로 하면 다음과 같은 이유로 SRP Batch가 깨지는 것을 볼 수 있다

💡 SRP : Node use multi-pass shader


발생 원인

Outline관련 이슈

삽질의 과정은 생략하고, 결론부터 말하자면 Culling Mode 설정의 문제였다

매뉴얼을 확인해보니, UTS2의 Outline에 대한 내용이 있어서 파파고 해봤다

💡Outline
이 방식을 간단히 설명하자면, 셰이더에서 원래의 객체보다 조금 더 큰 객체를 면 법선만 반전해서 생성합니다.
새로 생성한 아웃라인용 오브젝트에는 프론트 컬링으로 그려지기 때문에 원래보다 조금 더 크게 생성한 만큼 그것이 원래의 오브젝트에 의해 덮어쓰면 튀어나온 부분이 아웃라인처럼 보인다는 것입니다.
이 방식은 비교적 가벼운데다 조정이 편하게 가능해 게임용 아웃라인으로 전통적으로 사용돼 왔습니다.
실제로 객체 주위에 라인을 긋고 있는 것은 아니라는 점에 유의하십시오.

참고
 : 실제로 객체 주위에 라인을 그리는 방식도 있지만, 그것들은 주로 포스트 프로세스 방식의 아웃라인으로 알려져 있습니다.
포스트 프로세스 방식의 아웃라인은 채용하는 방식에 따라 속도도 퀄리티도 다릅니다.실제 게임에서는 기존형 객체 반전 방식에 가벼운 포스트 프로세스 방식을 더해 보정하는 경우가 많습니다.

 

즉, Culling Mode가 Front로 되어 있어야 한다는 것이었다

딱히 설정을 건드린 적은 없어서 일단 코드 쪽을 확인해봤다

Pass
{
// 생략
// ...

	Name "Outline"
	Tags {
	    "LightMode" = "SRPDefaultUnlit"
	}
	//Cull[_SRPDefaultUnlitColMode]
	Cull [_CullMode]
	//Cull Front
	ColorMask [_SPRDefaultUnlitColorMask]
	Blend SrcAlpha OneMinusSrcAlpha

// 생략
// ...
}

 

그러나 확인해보니 Cull [_CullMode] 주변에 가득한 주석의 흔적…

(UTS2의 깃허브 코드를 확인해보니 일단 Cull[_SRPDefaultUnlitColMode]가 원래의 코드였다)

Cull [_CullMode]는 오브젝트에 대한 컬링을 설정하는 프로퍼티이며, 일반적으로 Back으로 설정하고 있었다

즉, 이걸 Outline에서도 쓰서 이슈가 발생한 것이었다

SRP Batcher관련 이슈

이쪽의 원인은 명확했다

프레임 디버거에서 나온 문구대로, 일반적인 렌더링 패스와 Outline 패스를 동시에 사용했기 때문에 SRP Batcher가 작동하지 않게 되는 것이었다

다행히 참고 자료가 있어서 대응할 수 있었다


해결법

Outline관련 이슈

이쪽은 해결이 간단했다

Cull [_CullMode]를 Cull Front로 바꾸면 된다

 

아니면 Cull[_SRPDefaultUnlitColMode]로 되돌리고 머테리얼에서 설정하는 방법도 있다

(이쪽이 정공법)

Cull[_SRPDefaultUnlitColMode]에 대한 설정은 SRPDefaultUnlit Cull Mode에서 할 수 있다

(혹시 안 보인다면 Show All properties를 눌러보자)

 

SRP Batcher관련 이슈

이쪽은 원인은 명확했지만 해결은 어려웠다

다행히 아래와 같은 참고 사이트가 있어서 어떻게든 했다는 느낌

유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기

 

유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기

안녕하세요 마둠파입니다. 오늘은 URP에서 멀티패스 자유롭게 사용하는 법에 대해서 포스팅 해 보려고 ...

blog.naver.com

이 방법은 별도의 레이어와 Light Mode 태그, 그리고 렌더 피처를 이용해서 SRP Batcher가 작동하도록 하는 방법이다

 

우선은 별도의 레이어가 필요하다

아웃라인은 보통 캐릭터에만 있다는 편견을 바탕으로 Character란 레이어를 추가하고, 아웃라인을 표시할 오브젝트의 레이어를 Character로 변경했다

(물론 레이어의 이름은 딱히 상관 없다)

그 다음으로 아웃라인 패스의 Light Mode 태그를 변경한다

이번에는 SRPDefaultUnlit를 UTS2Outline로 변경했다

Pass
{
// 생략
// ...

	Name "Outline"
	Tags {
	    "LightMode" = "UTS2Outline"
	}
	Cull Front
	
// 생략
// ...
}

 

사실 LightMode 태그는 미리 정해진 값들이 존재한다

URP ShaderLab Pass tags | Universal RP | 12.1.11

 

URP ShaderLab Pass tags | Universal RP | 12.1.12

This section contains descriptions of URP-specific ShaderLab Pass tags. NOTE: URP does not support the following LightMode tags: Always, ForwardAdd, PrepassBase, PrepassFinal, Vertex, VertexLMRGBM, VertexLM. LightMode The value of this tag lets the pipelin

docs.unity3d.com

문제는 태그들에 따라 아웃라인의 렌더링 여부와 SRP Batcher가 작동 여부가 바뀐다는 점이다

예를 들어 UniversalForward를 사용하면 SRP Batcher는 작동하지만 외곽선이 안 그려진다던가, SRPDefaultUnlit를 사용하면 외곽선은 그려지지만 SRP Batcher는 작동하지 않는다던가…

(그래서 삽질을 좀 했다)

 

그렇기 때문에 아예 안 겹치는 LightMode로 변경해준다

공식 문서에 커스텀으로 해도 된다는 말은 못 찾았지만, 작성한 사례가 존재하니 일단 넘어가도록 하자

(Render Feature 관련 공부가 부족하다는 걸 느낀다)

유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기

 

유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기

안녕하세요 마둠파입니다. 오늘은 URP에서 멀티패스 자유롭게 사용하는 법에 대해서 포스팅 해 보려고 ...

blog.naver.com

【Unity】マルチパスのファーシェーダをURPに対応させる

 

【Unity】マルチパスのファーシェーダをURPに対応させる

はじめに ファーシェーダといえばシェル法やフィン法を用いてジオメトリシェーダで作成するのが一般的ですが、モバイ…

engineering.cocone.io

 

아무튼 LightMode도 변경해줬으면 다음으로는 Render Feature를 만들어준다

Render Feature는 스크립트를 이용해서도 만들 수 있지만, 간단한 것은 유니티 에디터에서 제공해준다

 

우선 설정된 Universal Render Data의 인스펙터를 봐보자

어딨는지 모를 경우에는 다음과 같은 방법으로 찾을 수 있다

  1. Project Settings > Graphics > Scriptable Render Pipeline Settings에 설정된 에셋를 클릭
  2. Rendering > Renderer List에 설정된 Universal Render Data를 클릭

그리고 Add Renderer Feature를 통해 Render Objects를 추가하자

그리고 Layer Mask와 LightMode Tags를 이번에 설정한 값으로 바꿔준다

그럼 아웃라인도 적용되고, SRP Batcher도 잘 작동하게 된다!


마무리

한 번에 2가지 이슈가 있었지만 어떻게든 됐다

URP를 제대로 사용하려면 Render Feature 관련해서 공부가 필요할 것 같다고 느꼈다


참고 자료

URP ShaderLab Pass tags | Universal RP | 12.1.11

 

URP ShaderLab Pass tags | Universal RP | 12.1.12

This section contains descriptions of URP-specific ShaderLab Pass tags. NOTE: URP does not support the following LightMode tags: Always, ForwardAdd, PrepassBase, PrepassFinal, Vertex, VertexLMRGBM, VertexLM. LightMode The value of this tag lets the pipelin

docs.unity3d.com

【Unity】URPにおけるシェーダのLightModeの用途を整理する - LIGHT11

 

【Unity】URPにおけるシェーダのLightModeの用途を整理する - LIGHT11

UnityのUniversal Render PipelineにおけるシェーダのLightModeの用途を整理しました。 はじめに LightModeまとめ 関連 参考

light11.hatenadiary.com

유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기

 

유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기

안녕하세요 마둠파입니다. 오늘은 URP에서 멀티패스 자유롭게 사용하는 법에 대해서 포스팅 해 보려고 ...

blog.naver.com

【Unity】マルチパスのファーシェーダをURPに対応させる

 

【Unity】マルチパスのファーシェーダをURPに対応させる

はじめに ファーシェーダといえばシェル法やフィン法を用いてジオメトリシェーダで作成するのが一般的ですが、モバイ…

engineering.cocone.io