2023. 6. 7. 16:11ㆍUnity
Z Buffer
Z Buffer는 픽셀이 얼마나 멀리 있는지 거리 정보를 기록하는 이미지이다. 가장 가까운 곳은 0으로 완전히 검은색, 가장 멀리 있는 곳은 1로 흰색이다. 반투명 폴리곤은 Sorting(거리 순서로 그리는 방식)이나 Z Buffer로도 해결할 수 없는 문제가 있다.
Z Buffer의 정밀도는 플랫폼에 따라 다르지만 보통 16비트나 32비트 정밀도를 사용한다. 이 정도면 검은색에서 흰색 사이의 그라데이션 계조가 매우 풍부해서 미세한 거리 차이도 색상으로 구분할 수 있다.
하지만 구분할 수 없을 정도로 비슷한 거리의 폴리곤이면 Z Fighting이 일어나게 된다.
반투명(Translucent)
반투명 재질은 Z Buffer에 기록하는 Z Write를 끄고 렌더링 해야 한다. Z Test는 불투명과 마찬가지로 켠다. 즉, 반투명 재질은 Z Test 거리 검사는 하지만 검사 뒤 Z Buffer에 기록을 남기지 않으니 보이긴 보여도 실제 존재하지 않는 물체인 것이다.
Forward Rendering은 여러 이슈 때문에 반투명과 불투명을 분리해서 관리하고 모든 불투명 재질을 그린 다음에 반투명 재질을 그리기 시작한다.
위 메테리얼은 [Surface Type]을 [Transparent]로, [Blending Mode]를 [Alpha]로 설정한 모습이다. 알파 채널 정보가 있는 텍스쳐로 Transparent Alpha를 설정한 것이다. Alpha 방식에서는 Additive나 Multiply처럼 색이 더하거나 곱하는 방식이 아니고 덮어쓰는 방식이라서 그리는 순서에 의해 뭐가 더 위에 보일지 결정된다.
이 문제를 피하려면 재질의 [Surface Type]을 [Opaque]로 하거나 스프라이트 렌더러를 사용해서 그리는 순서를 수동으로 제어해야 한다.
[Opaque]와 [Alpha Clipping]을 켜면 반투명이 아닌 불투명으로 처리한다. 반투명은 불가능하지만 보이는 영역을 알파 텍스쳐로 제어하면서 그리는 순서도 문제없어서 풀이나 나무 빌보드 표현에 자주 사용된다.
참고자료
'Unity' 카테고리의 다른 글
[Unity] URP 셰이더 HLSL 구조와 _BaseColor 적용 (0) | 2023.06.08 |
---|---|
[Unity] URP 셰이더 Gamma와 sRGB (0) | 2023.06.07 |
[Unity] URP 셰이더 Sub Graph, Custom Lighting, Keyword (0) | 2023.06.05 |
[Unity] 텍스쳐와 UV를 이용한 셰이더 (Tiling, Offset, Scrollout) (0) | 2023.06.05 |
[Unity] URP 셰이더 그래프 기본적인 노드와 응용 (Add/Multiply/Divide/Pow/Saturate/Clamp/Abs) (0) | 2023.06.03 |