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
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); // 알파값 미만이면 픽셀 폐기