TOOLS GAMES DEVLOG DOCS ABOUT CONTACT
HOME > DOCS > Shader / URP > 알파 블렌딩 정렬 문제 없이 섀도우 맵을 통과하는 디더링(Bayer Dither) 반투명 셰이더
Shader / URP Advanced Unity 2021.3+ / Unity 6 (URP)

알파 블렌딩 정렬 문제 없이 섀도우 맵을 통과하는 디더링(Bayer Dither) 반투명 셰이더

불투명(Opaque) 큐에서 4x4 베이어 매트릭스(Bayer Matrix) 픽셀 마스킹으로 반투명을 모사하여 드로우콜 배칭과 깊이/그림자 맵을 완벽 보존하는 최적화 기법.

#Shader #URP #Dither #Shadows #Optimization
핵심 개념일반적인 반투명(Transparent) 셰이더는 깊이 버퍼(ZWrite Off)를 끄기 때문에 서로 겹치면 소팅(Sorting) 버그가 나고 그림자를 드리우지 못합니다. 디더링(Dithering)을 쓰면 불투명 렌더 큐에서 clip()을 사용하여 섀도우 맵 캐스팅과 깊이 기록을 유지하면서 반투명하게 페이드할 수 있습니다.

1. 4x4 베이어 매트릭스 디더 마스크 HLSL

DitherTransparency.hlsl
static const float bayer4x4[16] = {
     0.0/16.0,  8.0/16.0,  2.0/16.0, 10.0/16.0,
    12.0/16.0,  4.0/16.0, 14.0/16.0,  6.0/16.0,
     3.0/16.0, 11.0/16.0,  1.0/16.0,  9.0/16.0,
    15.0/16.0,  7.0/16.0, 13.0/16.0,  5.0/16.0
};

// 스크린 픽셀 좌표 4x4 모듈로 인덱싱
int2 pixelPos = int2(input.positionCS.xy) % 4;
int index = pixelPos.y * 4 + pixelPos.x;
float threshold = bayer4x4[index];

clip(_Transparency - threshold); // 알파값 미만이면 픽셀 폐기

참고자료 & 관련 링크