Dither는 양자화 오류를 무작위화하는 데 사용되는 의도적 형태의 노이즈. 이미지에서 컬러 밴딩과 같은 대규모 패턴을 방지하기 위해 사용되거나, 화면 공간에 디더링을 적용하여 패턴의 균일한 분포를 보장하기 때문에 불투명한 오브젝트의 특정 픽셀을 Cliping 하여 투명하게 보이도록 처리할 수 있음. 불투명 렌더링 패스에서 투명하게 보이도록 처리하는데 유용.
아래 함수의 ScreenPisition 은 디더 패턴을 적용하는 데 사용할 스크린 좌표.
void Unity_Dither_float4(float4 In, float4 ScreenPosition, out float4 Out)
{
float2 uv = ScreenPosition.xy * _ScreenParams.xy;
float DITHER_THRESHOLDS[16] =
{
1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0,
13.0 / 17.0, 5.0 / 17.0, 15.0 / 17.0, 7.0 / 17.0,
4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0,
16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0
};
uint index = (uint(uv.x) % 4) * 4 + uint(uv.y) % 4;
Out = In - DITHER_THRESHOLDS[index];
}
위 코드에서 DITHER_THRESHOLDS 배열 값은 1~16, 즉 16개 배열 노드를 갖고 겹치지 않는 숫자를 배치함으로써 특정 패턴을 구성할 수 있도록 해주는 값. 이 1~16 사이의 값을 최대값 17로 두고 시각화 해보면 아래처럼 보인다. uv 좌표를 %4 *4 하고 + %4 연산해서 최대 15를 넘지 않도록 index 값을 구해서 파라미터 In 값인 Color 값, 혹은 Alpha 값에서 1/17 ~ 16/17 사이의 값을 빼준다.
이렇게 Dither 함수에서 구한 최종 값을 HLSL 함수 clip() 처리 해주면 0 미만 픽셀을 버리도록 해서 패턴 모양대로 구멍이 뚫린 결과를 얻을 수도 있음.
HLSL clip function
https://learn.microsoft.com/ko-kr/windows/win32/direct3dhlsl/dx-graphics-hlsl-clip
유니티 셰이더 그래프(Unity Shader Graph)의 Dither Node 공식 문서
https://docs.unity3d.com/Packages/com.unity.shadergraph@14.0/manual/Dither-Node.html
게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.
<유니티 교과서 개정6판>(유니티 최신 버전)
https://link.coupang.com/a/be3P0t
<대마왕의 유니티 URP 셰이더 그래프 스타트업>
https://link.coupang.com/a/bs8qyC
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e>
https://link.coupang.com/a/8VWas
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것>
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)
'유니티 엔진 (Unity Engine)' 카테고리의 다른 글
[Unity] 셰이더 처리 후 텍스처 테두리가 번져 보이는 문제 (0) | 2024.03.19 |
---|---|
[Unity] 간단한 가우시안 블러(GaussianBlur) 셰이더 코드 (0) | 2024.03.14 |
[Unity] 유니티로 Texture 를 복사하거나 Shader로 변형하는 방법 (0) | 2024.03.14 |
[Unity] 밸브사의 포탈(Portal) 게임의 포탈 메카닉스 만드는 방법 (자료) (0) | 2024.03.13 |
[Unity] Working with Cinemachine Cameras Overview (시네머신 카메라 작업 개요) (0) | 2024.03.12 |
[Unity] 화면 캡쳐(Screen Capture) 관련 자료 메모 (0) | 2024.03.07 |
[Unity] FOW(Fog of War) 전장의 안개 (0) | 2024.02.06 |