유니티 엔진 (Unity Engine)

[Unity] Dithering 셰이더 함수, Dither 노드, Dither thresholds array

원소랑 2024. 3. 13. 12:38

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

 

클립 - Win32 apps

지정된 값이 0보다 작으면 현재 픽셀을 버립니다.

learn.microsoft.com

 

 

유니티 셰이더 그래프(Unity Shader Graph)의 Dither Node 공식 문서

https://docs.unity3d.com/Packages/com.unity.shadergraph@14.0/manual/Dither-Node.html

 

Dither Node | Shader Graph | 14.0.10

Dither Node Description Dither is an intentional form of noise used to randomize quantization error. It is used to prevent large-scale patterns such as color banding in images. The Dither node applies dithering in screen-space to ensure a uniform distribut

docs.unity3d.com


게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.

 

<유니티 교과서 개정6판>(유니티 최신 버전)
https://link.coupang.com/a/be3P0t

 

유니티 교과서 개정6판

COUPANG

www.coupang.com

 

<대마왕의 유니티 URP 셰이더 그래프 스타트업>

https://link.coupang.com/a/bs8qyC

 

대마왕의 유니티 URP 셰이더 그래프 스타트업

COUPANG

www.coupang.com


<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e>
https://link.coupang.com/a/8VWas

 

리얼-타임 렌더링 4/e

COUPANG

www.coupang.com

 

<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것>
https://link.coupang.com/a/9BqLd

 

이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것

COUPANG

www.coupang.com

 

유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)


 

728x90
반응형