본문 바로가기
유니티/Shader Study

URP Shader Study #7 - Zwrite, ZTest, Offset

by witn331ss 2023. 12. 2.

Zwrite

픽셀이 뎁스버퍼에 작성되는지 제어하는 것임

기본은 이 깊이를 그려내는 텍스쳐에 작성하는데 

 

불투명 오브젝트 같은 경우는 제어가 안되는 경우가 있어서 이걸 작성해줘야 한다.

 

#6에서 했던 코드를 가지고 와서 Pass 부분에 Zwrite off 를 추가해주자.

    Blend [_SrcBlend] [_DstBlend]
              Cull [_Cull]
              Zwrite off

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

 

그러면 원래 뒷 부분을 정확하게 못 그려주던 셰이더가 말잘듣고 그려준다 (우와~)

 

물론 이것도 전에 했던 것 처럼 토글로 제어가 가능하다.

 

프로퍼티스
  [Enum(Off, 0, On, 1)] _ZWrite("ZWrite", Float) = 0
  
태그
 	Zwrite [_ZWrite]

 

 

 

ZTest

이 항목은 이전픽셀과 현재픽셀을 비교해서 어떻게 그릴 지를 수행하는 단계이다.

쉽게 말하면 픽셀이 겹쳐있을 때 이걸 앞에 그릴지 아니면 뒤에 그릴지를 제어해주는 명령어라고 생각하면 된다.

 

이렇게 7가지의 명령어가 존재한다.

Pass
{  
Blend [_SrcBlend] [_DstBlend]
Cull [_Cull]
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
	
Name "Universal Forward"
Tags {"LightMode" = "UniversalForward"}

 

 

해당 표는 오브젝트가 겹쳐있을 때 해당 픽셀을 어떻게 처리하는지를 나타내는 표이다.

기본값은 LEqual(LessEqual)

기존 오브젝트와 같은 거리에 있거나 그 앞에 있는 오브젝트를 드로우하고 그뒤의 오브젝트는 숨김처리를 해준다.

 

물론 하나하나 코드를 칠순없으니 토글로 제어해버리자

프로퍼티스
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 0

패스
	 ZTest [_ZTest]

 

큐가 똑같을 때는 유니티가 알아서 하는디 반투명 쉐이더가 겹쳐있을때 조금 곤란할 때가 많다 (유리컵에 물이 있는 경우 등) 그때 제어해줄 수도 있다 매쉬 뒤로 가려져야할때나 등등..

Offset

Unity 쉐이더에서 "Offset"은 렌더링 순서를 조정하는 데 사용된다.

이는 주로 두 개의 메시나 폴리곤이 매우 가까이 있을 때 발생하는 'Z-fighting' 현상을 방지하기 위해 사용되는데

"Offset" 명령어는 두 개의 파라미터를 받는다.

 

첫 번째 파라미터는 깊이 값의 스케일링을,

두 번째 파라미터는 깊이 값에 추가되는 상수 값을 조정합니다.

 

이를 통해 메시의 렌더링 순서를 세밀하게 조절할 수 있어, 겹침 문제를 해결하거나

시각적 효과를 조정하는 데 유용하다.

 

패스에 다음과 같이 추가해준다

Offset 0, -1

 

물론 이것도 꺼내서 제어할 수 있게 할수있다

 

프로퍼티스

       _Factor("OffsetFactor", Range(0,100)) = 0
       _Units("OffsetUnits", Range(0, 100)) = 0

패스
              Offset[_Factor],[_Units]