Reflection Probes를 사용하는 이유는 캐릭터 같은 동적인 오브젝트가 반사를 사용이 필요할때 사용하는데, 이것이 중요한 게임이 있을 수 있습니다.

모바일에서는 필요하지 않다면 쓸 이유는 없어 보이는군요.

https://github.com/madumpa/URP_StylizedLitShader

 

GitHub - madumpa/URP_StylizedLitShader: Madumpa's URP Stylized Lit Shader Repository

Madumpa's URP Stylized Lit Shader Repository. Contribute to madumpa/URP_StylizedLitShader development by creating an account on GitHub.

github.com

마둠파님의 스타일라이즈 셰이더가 참 괜찮더군요.

다만, HLSL기반이라 그런지 코드분석에는 어려움이 있었습니다.(아직도 뭐가뭔지...)

그러다가, 작은 부분에 욕심이 생기어서 마스크맵중에 B채널을 emission으로 사용할 방법이 없을까 고민하였습니다.

어차피 마스크맵중에서 RGBA중에서 R은 matellic고, A는 smoothness이고, G는 AO로 사용하는데... B채널을 emission전용으로 쓰면 좋을거 같다는 생각이 들었습니다.

그래서 이러저리 헤메다가 간단하게 코드하나를 추가하여 마무리 하였습니다.

실제 개발에 사용될지는 알수없으나, 사용하게 되면 마둠파님한테 메일을 보내려고 합니다.

//color += emission; // 원본
color += emission.bbb*_EmissionColor.rgb;// B채널을 사용하기위한 추가사항	
return half4(color, alpha);

 

 

 

Shader "URPTraining/TextureAlpha"
{

	Properties{

	_MainTex("Main Texture", 2D) = "white" {}
	_Transparency("Transparency", Range(0,1)) = 0.5

	}

		SubShader
	{
		Tags
	{
		"RenderPipeline" = "UniversalPipeline"
		"RenderType" = "TransparentCutout"
		"Queue" = "Alphatest"
	}
		Pass
	{
		Name "Universal Forward"
		Tags{ "LightMode" = "UniversalForward" }

		Blend SrcAlpha OneMinusSrcAlpha
		Cull Back
		Zwrite off

		HLSLPROGRAM
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x

#pragma vertex vert
#pragma fragment frag


#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

#pragma multi_compile _ _MAIN_LIGHT_SHADOWS // sbr batcher

		CBUFFER_START(UnityPerMaterial) // sbr batcher

		float _Transparency;
	float4 _MainTex_ST;
	Texture2D _MainTex;
	SamplerState sampler_MainTex;

	CBUFFER_END // sbr batcher

		struct VertexInput
	{
		float4 vertex : POSITION;
		float2 uv       : TEXCOORD0;
	};

	struct VertexOutput
	{
		float4 vertex  	: SV_POSITION;
		float2 uv      	: TEXCOORD0;
	};

	VertexOutput vert(VertexInput v)
	{
		VertexOutput o;

		o.vertex = TransformObjectToHClip(v.vertex.xyz);
		o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;

		return o;
	}

	half4 frag(VertexOutput i) : SV_Target
	{
		float4 color = _MainTex.Sample(sampler_MainTex, i.uv);

		color.a *= _Transparency;

		return color;
	}
		ENDHLSL
	}
	}

}

URP의 Quality 셋팅의 연관 관계입니다.

이전에 빌트인 쉐이더와 다르게 Quality 셋팅을 Render Pipleline을 통해서 셋팅되는것을 볼수 있습니다.

 

 

https://docs.google.com/document/d/1UX0319CXa29fCFAgg0qa5vnH-U6875jt0KLKUk5mke8/edit

 

URP Shader Basic

URP Shader Basic term 2 Shader란? 2 Basic simple basic code 2 Shader “shader folder name / shader name” 3 Properties에서 변수 설정하고 매터리얼에서 확인 3 SubShader 4 Shader Tag 5 Rendering Order - Queue Tag 5 Render type 5 Pass 5 HLSL

docs.google.com

https://www.youtube.com/watch?v=mlNWoROvavY 

SubShader
    {
       Tags { "RenderType" = "Opaque"
              "RenderPipeline" = "UniversalPipeline"
              "UniversalMaterialType" = "SimpleLit" 
              "IgnoreProjector" = "True"
              "ShaderModel"="4.5"}
        Pass
        {
           Name "ForwardLit"
           Tags { "LightMode" = "UniversalForward" }
           …
        }
   
        Pass
        {
            Name "ShadowCaster"
            Tags{"LightMode" = "ShadowCaster"}
          …
        }
       Pass
        {
            Name "GBuffer"
            Tags{"LightMode" = "UniversalGBuffer"}
        …
        }
       Pass
       {
            Name "DepthOnly"
            Tags{"LightMode" = "DepthOnly"}
       …
       }

한동안 URP에 맹신하고 그쪽으로 개발을 하던중에 개발자의 뭔가 이상하다는 소리에 머리가 하얗게되었습니다.

저는 신규 게임 개발 초기때부터 URP를 써야한다고 저는 계속 주장을 하였습니다.

유니티코리아에서도 URP 포퍼먼스 향상에 대해서 자주 언급이 있었고, 실제 테스트한 내용들을 보았기 때문에

그에 대한 기대감이 있었습니다. 헌데, 실제 개발에는 차이가 있었습니다. 

 

우리 프로젝트는 RPG와 달리 씬에 등장하는 캐릭터가 수가 적고, 배경도 한화면에 한번에 뿌려지는 방식이다보니...

URP를 사용하는것이 오히려 더 무거웠습니다.

URP가 오히려 무겁고 포퍼먼스를 저해할수 있다는데 약간 놀랐습니다.

실제로 같은 환경에서 FPS속도를 보았는데, 30프레임가량 차이가 나더군요.

결론은 레거시로 돌리는걸로 이야기가 되었습니다.

많은 의문점을 남기고 다시 이전 쉐이더 방식으로 돌아갔습니다.

아직 더 연구가 필요하겠지만, 프로젝트마다 취해야할 쉐이더 방식이 다른거 같습니다.

URP나 HDRP를 맹신하면 안될거 같습니다.


위 내용에 대한 궁금증이 해결이 되었습니다.

테스트하였던 배경과 캐릭터의 문제였습니다.

URP로 변경하면서 배경의 경우 텍스쳐 한장과 하나의 폴리곤으로 구성되어있다보니 너무 단순한 구조이고,

지나치게 가벼워서 URP가 오히려 무겁게 되버렸던겁니다.

또하나는 캐릭터 쉐이더를 외부에서 만든 쉐이더를 차용했는데, SBR Bacher가 되질 않아서 무거워지면서

URP의 변경하면서 아무런 이득을 취하지 못해서였습니다.

 

이제 속이 후련하군요...ㅎ

'Unity > URP' 카테고리의 다른 글

StylizedLitShader을 약간의 변경...  (0) 2021.10.08
unlit shader에 SRP batcher를 넣어봅시다.  (0) 2021.10.06
Project Settings  (0) 2021.09.28
URP 트레이닝 기초  (0) 2021.05.26
URP를 써야하는 이유.  (0) 2020.06.10

youtu.be/UsyvT36vqpU

많은 것이 좋아졌다고하는데 뚜렷이 무엇이 좋아졌는지 잘 알수가 없었는데, 이내용을 보면 개선된 방식이라는게 느껴지긴합니다.

 

제가 받아들인 요약은

1. 같은 프로젝트라도 드로우콜 800짜리가 500짜리대로 떨어짐.

2. 조명이 여러개 써도 괜찮을정도로 개선됨(여러 조명을 하나의 조명?으로 계산을 한다고 했나?) 하튼 실시간 라이트를 32개정도까지 써도 될정도로 효율이 좋아짐.

3. 이전 파이프라인 쉐이더는 여러개의 오브젝트가 있을때 오브젝트마다 드로우콜이 증가했지만, URP 기본 쉐이더를 여러 오브젝트가 같이 사용시 드로우콜을 1개로 바꿔버린다.(이건 획기적이긴한데... 커스텀은.....?)

4. 왜 이렇게 효율이 좋아지는가 하면 이전에는 배치가 메터리얼 단위로 일어나기 때문이었지만, SRP로 바뀌면서 쉐이더 단위로 바뀌어서 메터리얼이 많아져도 같은 쉐이더라면 효율이 좋아진다는것입니다.

(reder list에서 SRP Batcher를 키는것이 중요하다.)