일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Private Bytes
- Cell Shader
- 벡터
- Virtual Byte
- Cartoon Rendering
- Specular
- 개인 바이트
- working set
- OculusMotionVectorPass
- URP
- Windows Build
- 게임 수학
- ASW(Application SpaceWarp)
- AppSW
- ColorGradingLutPass
- 프로그래밍 기초
- C언어
- Three(Two) Tone Shading
- Rim Light
- 메모리 누수
- 가상 바이트
- 3d
- Cell Look
- VR
- URP로 변경
- Toon Shader
- 작업 집합
- Today
- Total
WinCNT
URP에서 유니티짱 툰쉐이더2.0(UTS2)의 Outline이 제대로 나오지 않는 이슈 + SRP Batcher가 제대로 작동하지 않는 이슈 본문
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 셰이더 자유롭게 작성하기
이 방법은 별도의 레이어와 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
문제는 태그들에 따라 아웃라인의 렌더링 여부와 SRP Batcher가 작동 여부가 바뀐다는 점이다
예를 들어 UniversalForward를 사용하면 SRP Batcher는 작동하지만 외곽선이 안 그려진다던가, SRPDefaultUnlit를 사용하면 외곽선은 그려지지만 SRP Batcher는 작동하지 않는다던가…
(그래서 삽질을 좀 했다)
그렇기 때문에 아예 안 겹치는 LightMode로 변경해준다
공식 문서에 커스텀으로 해도 된다는 말은 못 찾았지만, 작성한 사례가 존재하니 일단 넘어가도록 하자
(Render Feature 관련 공부가 부족하다는 걸 느낀다)
유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기
【Unity】マルチパスのファーシェーダをURPに対応させる
아무튼 LightMode도 변경해줬으면 다음으로는 Render Feature를 만들어준다
Render Feature는 스크립트를 이용해서도 만들 수 있지만, 간단한 것은 유니티 에디터에서 제공해준다
우선 설정된 Universal Render Data의 인스펙터를 봐보자
어딨는지 모를 경우에는 다음과 같은 방법으로 찾을 수 있다
- Project Settings > Graphics > Scriptable Render Pipeline Settings에 설정된 에셋를 클릭
- 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
【Unity】URPにおけるシェーダのLightModeの用途を整理する - LIGHT11
유니티 쉐이더 - URP multi-pass 셰이더 자유롭게 작성하기
【Unity】マルチパスのファーシェーダをURPに対応させる
'Unity > Unity 개발 중 발생한 이슈 정리' 카테고리의 다른 글
Meta Quest 2에서 오른쪽 스크린만 일부 오브젝트의 드로우 처리가 안 되거나 색상이 이상해지는 이슈 (0) | 2023.09.12 |
---|---|
파티클 시스템의 이펙트가 Dynamic Batching되지 않는 이슈 (0) | 2023.09.08 |
VR기기에 대한 어플리케이션 설정이 적용되지 않는 이슈 (0) | 2023.07.26 |
커스텀 셰이더에 Meta Pass를 추가했더니 SRP Batcher가 제대로 작동하지 않게 된 이슈 (0) | 2023.07.21 |
VR기기(Oculus Quest 2)에서 GPU Utilization(GPU U)가 FinalBlit에서 급격히 오르는 이슈 (0) | 2023.07.04 |