# 1-2 [Properties, SubShader]

Ricon·2024년 8월 5일

URP Shader Basic

목록 보기
2/17

본 게시물은 Unity Korea 채널의 URP Shader Training 시리즈와 강의에 사용된 도큐먼트를 공부하며 정리한 게시물입니다.

강의 링크
도큐먼트 링크


Properties

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

SubShader

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을 빈 값으로 설정)

Shader Tags

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)

Render Type

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

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"}
        ...
    }

0개의 댓글