본문 바로가기
Programming/Unity

[Unity] URP - Lit Shader Properties 런타임에서 변경

by 타임박스 2021. 6. 11.
반응형


✔  URP Lit Shader Properties

런타임에서 매테리얼 속성 변경방법, Normal Map Issue



URP에서 사용되는 Property들을 정리해본다.

기존 Standard와 변경된 사항이 많아서 기존 Standard를 사용하던 에셋이나 프로젝트들을 URP로 업데이트를 해야할 경우에 속성변경이 필요하다.

아래는 Universal Render Pipeline/Lit에서 사용되는 속성들이다.

_WorkflowMode("WorkflowMode", Float) = 1.0			//0 : specular , 1 : metallic
_BaseMap("Albedo", 2D) = "white" {}
_BaseColor("Color", Color) = (1,1,1,1)
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
_Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5
_GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
_SmoothnessTextureChannel("Smoothness texture channel", Float) = 0
_Metallic("Metallic", Range(0.0, 1.0)) = 0.0
_MetallicGlossMap("Metallic", 2D) = "white" {}
_SpecColor("Specular", Color) = (0.2, 0.2, 0.2)
_SpecGlossMap("Specular", 2D) = "white" {}
_SpecularHighlights("Specular Highlights", Float) = 1.0
_EnvironmentReflections("Environment Reflections", Float) = 1.0
_BumpScale("Scale", Float) = 1.0
_BumpMap("Normal Map", 2D) = "bump" {}
_Parallax("Scale", Range(0.005, 0.08)) = 0.005
_ParallaxMap("Height Map", 2D) = "black" {}
_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
_OcclusionMap("Occlusion", 2D) = "white" {}
_EmissionColor("Color", Color) = (0,0,0)
_EmissionMap("Emission", 2D) = "white" {}
_DetailMask("Detail Mask", 2D) = "white" {}
_DetailAlbedoMapScale("Scale", Range(0.0, 2.0)) = 1.0
_DetailAlbedoMap("Detail Albedo x2", 2D) = "linearGrey" {}
_DetailNormalMapScale("Scale", Range(0.0, 2.0)) = 1.0
_DetailNormalMap("Normal Map", 2D) = "bump" {}
_ClearCoatMask("_ClearCoatMask", Float) = 0.0
_ClearCoatSmoothness("_ClearCoatSmoothness", Float) = 0.0
_Surface("__surface", Float) = 0.0			//0 : opaque, 1:Transparent
_Blend("__blend", Float) = 0.0
_AlphaClip("__clip", Float) = 0.0
_SrcBlend("__src", Float) = 1.0
_DstBlend("__dst", Float) = 0.0
_ZWrite("__zw", Float) = 1.0
_Cull("__cull", Float) = 2.0
_ReceiveShadows("Receive Shadows", Float) = 1.0
_QueueOffset("Queue offset", Float) = 0.0

 

위 항목들은 Lit.Shader 파일이나 Inspector에서 Debug모드로도 볼 수 있다.

 

● 스크립트로 쉐이더 속성 변경 방법 (런타임에서도 가능)

아래는 속성 변경 예제다.

//변경할 텍스쳐이미지
Texture2D texture = new Texture2D(1,1);
texture.LoadImage(texturebytes);

//변경할 매테리얼.
Material mat;

//Base Map 
mat.SetTexture("_BaseMap", texture);

//Base Color
mat.SetColor("_BaseColor", new Color(1f,1f, 1f, 1f));

//Normal Map -> Runtime Issue가 있음. 제대로 동작안됨.
mat.SetTexture("_BumpMap", bumpTexture);
mat.EnableKeyword("_NORMALMAP");

//Specular Color
mat.SetColor("_SpecColor", new Color(1f,1f, 1f, 1f));

//Emission Color
mat.SetColor("_EmissionColor", new Color(1f,1f, 1f, 1f));
mat.EnableKeyword("_EMISSION");

//Emission Map
mat.SetTexture("_EmissionMap", texture);

//Metallic Map
mat.SetTexture("_MetallicGlossMap", texture);
mat.EnableKeyword("_METALLICSPECGLOSSMAP");

//Specular Map
mat.SetTexture("_SpecGlossMap", texture);
mat.EnableKeyword("_ SPECULAR_SETUP");

//Smoothness 
mat.SetFloat("_Smoothness", 0.5f);

 

● 예외 사항 (Normal Map)

노말맵의 경우에는 런타임에서 변경해주더라도 제대로 적용이 안되는 경우가 발생한다.

변경하려는 Texture가 Texture Type이 Normal Map이 아닌경우에는 제대로 적용되지 않는다.

텍스쳐를 유니티 프로젝트에 임포트하고나서 Texture Type을 Normal Map 타입으로 변경해줘야한다.

만약 Default 타입에 Texture를 넣게되면 제대로 적용되지 않고 "This texture is not marked as a normal map"이라는 문구와 "Fix Now" 버튼이 생긴다.

"Fix Now"를 누르게되면 Texture Type은 Normal 타입으로 변경된다.

하지만 만약 텍스쳐가 유니티 프로젝트에 포함되지 않고 Web이나 다른 위치로부터 텍스쳐를 불러와야한다면?

Texture Type을 변경할 수 없어 적용해도 문제가 발생된다.

Lit.Shader로는 불가능하다.

# 해결방안

1. 소스코드에서 RGB값을 변경하여 Normal Map 타입으로 텍스쳐를 변환한다.

- 이 방법은 이미지파일이 크면 클수록 처리시간이 너무 길어져 사용하기 적합하지 않았다.

2. Shader를 제작한다.

- 제공되는 Lit.Shader를 쓰지 않고 Shader Code 혹은 Shader Graph를 이용하여 커스텀 쉐이더를 작성한다. Shader Graph에서 Texture 타입을 Bump로 설정하면 문제없이 작동되었다.

 

감사합니다.

반응형

댓글