본 게시물은 Unity Korea 채널의 URP Shader Training 시리즈와 강의에 사용된 도큐먼트를 공부하며 정리한 게시물입니다.
Material창에서 보이는 변수는 Shader Script의 Properties단에서 정의한다.
Properties
{
// Properties Block : 셰이더에서 사용할 변수를 선언하고 이를 material inspector에 노출시킵니다
_ColorVar("Basic Color", Color) = (1, 1, 1, 1)
_RangeVar("Basic Range", Range(0, 1)) = 0
_VectorVar("Basic Vector", Vector) = (1, 1, 1, 1)
_IntVar("Basic Int", Int) = 1
_FloatVar("Basic Float", Float) = 1.5
_Texture2DVar("Basic Texture 2D", 2D) = "White"{}
_Texture3DVar("Basic Texture 3D", 3D) = "White"{}
_TextureRectVar("Basic Texture Rect", Rect) = "White"{}
_TextureCubeVar("Basic Texture Cube", CUBE) = "White"{}
_TextureArrayVar("Basic Texture 2D Array", 2DArray)=""{}
}
![]()
- Color
- 컬러 팔레트를 변수로 사용
- Range
- 범위값을 변수로 사용
- Vector
- xyzw 4개의 Vector값을 가지는 변수
- Int, Float
- 정수, 실수형 변수
- Texture Sampler
- Texture 변수. Texture를 입력받지 않을 때는 기본 색상을 지정해야 한다.
- 2D
- 3D
- Rect
- Cube
- 2D Array
Mesh를 렌더링 할 때 Unity는 대상 장치의 GPU와 호환되는 SubShader 블록을 선택한다.
SubShader 블록은 SubShader Tags 블록을 선택적으로 포함할 수 있다.
Tags 키워드를 사용하여 SubShader Tags블록을 선언한다.
Tags
{
//Render type과 Render Queue를 여기서 결정합니다.
"RenderPipeline" = "UniversalPipeline"
"RederType" = "Opaque"
"Queue" = "Geometry"
}
RenderPipeline은 SubShader를 사용할 렌더 파이프 라인을 Unity에서 선언하게 된다.
UniversalPipeline은 URP를 사용하는 것을 선언한다.
만약, 단 렌더 파이프 라인에서 동일한 Shader를 사용하고자 한다면 다른 RenderPipeline 태그 값으로 여러 SubShader블록을 만들어서 사용하면 된다.
(Built-In 렌더 파이프라인에서 실행하려면 RenderPipeline을 빈 값으로 설정)
SubShader 내부의 Tag는 렌더링 순서 및 기타매개 변수를 결정하는데 사용된다. 이 Tag는 Pass가 아닌 SubShader 섹션에 위치해야한다.
Rendering Order - Queue Tag
Queue Tag를 사용해 오브젝트를 그리는 순서를 결정할 수 있음
이는 오브젝트가 속한 Render 대기열을 결정함.
Unity는 해당 Render Queue에 대한 값을 임의로 지정해 둠.
- Background(1000) : 가장 먼저 렌더링됨. 일반적으로 백그라운드에 있어야하는 작업에 사용
- Geometry(Default-2000) : 대부분의 불투명 오브젝트에 해당. 기본값
- AlphaTest(2450) : 알파 테스트를 거친 Geometry는 이 Queue값을 사용.
모든 불투명 오브젝트를 그린 후에 알파 테스트된 오브젝트를 렌더링 하는 것이 효율적
-> 별개의 Queue로 구분해서 사용하게 됨.- Transparent(3000) : Geometry 및 AlphaTest 이후에 이 RenderQueue 항목은 뒤에서 앞의 순서로 렌더링함.
알파 블렌딩된 모든 것(예로 Depth Buffer에 사용하지 않은 쉐이더)는 여기로 이동됨
EX) 유리, 파티클 이펙트 등- Overlay(4000) : 오버레이 효과를 위한 것으로 마지막으로 렌더링 된 모든 항목이 여기에 해당
EX)Lens Flare등
Render Queue값 2500까지는 불투명(Opaque) Mesh로 간주되며, 이 값 이후로는 불투명(Transparent)로 간주됨(Geometry+500)
RenderType태그는 Shader를 미리 정의 된 여러 그룹으로 분류함. 불투명한 Shader 또는 Alpha Test를 거친 Shader등이 여기에 해당.
Render Type은 Shader 교체에 사요오디거나 경우에 따라 카메라의 Depth Texture를 생성하는 데 사용됨.
- Opaque : 대부분의 불투명 쉐이더
- Transparent : 대부분의 반투명 쉐이더
- TransparentCutOut : mask된 투명 쉐이더(AlphaTest된 쉐이더가 여기에 해당)
- Background : Skybox Shader
- Overlay : Halo, Flare Shader
- TreeOpaqe :Terrain에서 나무와 줄기 부분
- TreeTransparentCutOut : Terrain의 나무 잎 부분
- TreeBillboard : Terrain의 빌보드된 나무
- Grass : Terrain의 잔디
- GrassBillboard : Terrain의 빌보드된 잔디
Pass Block은 Shader에서 사용할 각 렌더 패스를 결정.
패스에서 LightMode 태그를 설정하지 않으면 URP는 해당 패스에 대해 SRPDefaultUnlit태그 값을 사용
Pass
{
[Name And Tags] [enderSetup]
}
Basic 과정에서 각 Pass를 다루지는 않지만, 개략적인 구조는 아래 simpleLit Shader 구조를 참고한다.
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"}
...
}