본 게시물은 Unity Korea 채널의 URP Shader Training 시리즈와 강의에 사용된 도큐먼트를 공부하며 정리한 게시물입니다.
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
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]
![]()
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]
![]()