# 2-4 [ZWrite, ZTest, Offset]

Ricon·2024년 8월 7일

URP Shader Basic

목록 보기
9/17

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

강의 링크
도큐먼트 링크


Z Write

Object의 Pixel이 Depth Buffer에 작성되는지 여부를 제어(Default On)
불투명한 Object를 그릴 경우 On상태로 유지하면 되지만, 반투명한 효과를 그릴 경우 ZWrite Off로 전환
(URP에서 Depth Texture의 활용은 링크 내용 참고 [링크])

// Shader 시작. 셰이더의 폴더와 이름을 여기서 결정합니다.
Shader "URPTraining/09_ZWrite"
{
	Properties
	{
		// Properties Block : 셰이더에서 사용할 변수를 선언하고 이를 material inspector에 노출시킵니다
		_TintColor("Test Color", Color) = (1, 1, 1, 1)
		_Intensity("Range Sample", Range(0, 1)) = 0.5
		_MainTex("Main Texture", 2D) = "white"{}

		[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend", float) = 1
		[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend", float) = 0

		[Enum(UnityEngine.Rendering.CullMode)] _CullMode("Cull Mode", float) = 1

		[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", float) = 0
	}

	SubShader
	{
		Tags
		{
			//Render type과 Render Queue를 여기서 결정합니다.
			"RenderPipeline" = "UniversalPipeline"
			"RederType" = "Transparent"
			"Queue" = "Transparent"
		}
		Pass
		{
			Blend [_SrcBlend] [_DstBlend]
			Cull [_Cull]
			ZWrite  [_ZWrite]

			Name "Universal Forward"
			Tags { "LightMode" = "UniversalForward"}

			HLSLPROGRAM
			#pragma prefer_hlslcc gles
			#pragma exclude_renderers d3d11_9x
			#pragma vertex vert
			#pragma fragment frag

			//cg shader는 .cginc를 hlsl shader는 .hlsl을 include하게 됩니다.
			#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

			//vertex buffer에서 읽어올 정보를 선언합니다. 
			struct VertexInput
			{
				float4 vertex	: POSITION;
				float2 uv		: TEXCOORD0;
			};

			//보간기를 통해 버텍스 셰이더에서 픽셀 셰이더로 전달할 정보를 선언합니다.
			struct VertexOutput
			{
				float4 vertex	: SV_POSITION;
				float2 uv		: TEXCOORD0;
			};

			half4 _TintColor;
			float _Intensity;

			float4 _MainTex_ST;
			Texture2D _MainTex;
			SamplerState sampler_MainTex;

			//버텍스 셰이더
			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) * _TintColor * _Intensity;

				return color;
			}

			ENDHLSL
		}
	}
}

ZWrite Off

Zwrite On


Z Test

Depth Test를 실핼한 방법 선택.
이 항목은 이전 Pixel과 현재 Pixel을 비교해서 어떻게 그릴지 선택하는 단계

//Pass
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

오브젝트가 겹쳤을때 해당 Pixel을 어떻게 처리하는지 나타내는 표.
기본값은 LessEqual(LEqual)
기본 오브젝트와 같은 거리에 있거나 그 앞에 있는 오브젝트를 드로우 하고 그 뒤의 오브젝트는 숨김

*앞으로 나오는 경우를 제외하고는 보통 건드릴 일이 없는 항목. 객체가 겹쳤을 때 효과는 보통 Stencill Buffer를 활용하고 URP에서는 Custom Pass에서 설정

Shader "URPTraining/10_ZTest"
{
	Properties
	{
		// Properties Block : 셰이더에서 사용할 변수를 선언하고 이를 material inspector에 노출시킵니다
		_TintColor("Test Color", Color) = (1, 1, 1, 1)
		_Intensity("Range Sample", Range(0, 1)) = 0.5
		_MainTex("Main Texture", 2D) = "white"{}

		[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend", float) = 1
		[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend", float) = 0

		[Enum(UnityEngine.Rendering.CullMode)] _CullMode("Cull Mode", float) = 1

		[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", float) = 0
		[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", float) = 0
	}

	SubShader
	{
		Tags
		{
			//Render type과 Render Queue를 여기서 결정합니다.
			"RenderPipeline" = "UniversalPipeline"
			"RederType" = "Transparent"
			"Queue" = "Transparent"
		}
		Pass
		{
			Blend [_SrcBlend] [_DstBlend]
			Cull [_Cull]
			ZWrite  [_ZWrite]
			ZTest [_ZTest]


Offset

Factor 및 Units Parameter 2개를 사용하여 Depth Offset를 지정.
Factor는 Polygon의 X 또는 Y를 기준으로 최대 Z기울기를 Scale하고, Units는 최소 분석 가능 Depth Buffer 값을 스케일하게된다.
이를 통해 두개의 Object가 겹칠 경우 특정 오브젝트를 앞에 그리게 조절할 수 있음.

EX)Offset 0, -1은 폴리곤의 기울기를 무시하고 폴리곤을 카메라로 더 가까이 당기게 됨.

Enum을 사용해서 토글로 제어 가능

Properties
{
	_Factor("Factor", int) = 0
	_Units("Units", int) = 0
}
SubShader
{
	Pass
	{
		Offset [_Factor],[_Units]


업로드중..

0개의 댓글