오늘은 A 프로젝트에서 같이 개발하는 팀원에게 이슈 관련으로 연락이 왔다.
유니티 Editor Game뷰에서 스프라이트의 레이어 순서가 적용되지 않는 문제가 발생한 것이다.
오브젝트의 전체 몸체를 개별로 나누어서 파츠 형식으로 리소스를 제작한 상태이고
각 파츠별 앞서 있는 sprite 일수록 Order in Layer 값을 조절한 상태였다.
원래는 왼쪽과 같이 설정한 Layer의 순서대로 Rendering 되어 이쁘게 나와야 하는 오브젝트가...
오른쪽과 같이 Rendering 순서가 잘못되어 이쁘게 나오지 않는 현상이 발생한 것이다
설정한 Layer 순서가 적용이 되지 않았는지 확인하기 위해 Frame Debugger를 통해 Draw 되는 순서를 확인해 보았지만
설정한 순서대로 잘 Draw가 되고 있었다...
해당 오브젝트는 2.5D의 분위기를 연출하는 씬에서 사용되기 때문에 씬에서 Game뷰를 랜더링 해주는 카메라 projection이 perspective로 설정되어 있어 급한 대로 z축의 값을 일부 조정해서 렌더링 순서를 맞췄다.
하지만 z축 값이 동일한 상태에서 Layer 값만을 조절해서 해결할 수 없는 부분이 매우 의문이 들었다.
그래서 오늘은 왜 Layer 값만으론 해결할 수 없었는지와
z축 값을 조절하지 않고도 랜더링 순서 대한 문제를 해결할 수 있는 방법에 대해 알아보고자 한다.
여러 방법을 시도해 보면서 문제에 대한 삽질을 한 끝에 무엇 때문에 해당 문제가 발생되었는지 알게 되었다.
결론적으로 말하자면 Z-fighting이 발생해서 위와 같은 문제가 발생한 것이다.
Z-fighting이란 두 오브젝트가 동일한 깊이를 공유할 때 Z-buffer의 정밀도 부족으로 인해 렌더링 결과가 깜빡이거나 섞이는 현상이다.
Orthographic모드는 카메라와 오브젝트 간의 실제 거리 대신 직선 거리를 기반으로 선형적으로 계산되어 Z-buffer의 정밀도가 높아지는 데에 비해
Perspective모드는 실제 거리를 기반으로 멀어질수록 Z-buffer의 정밀도가 떨어지게 된다.
그렇기 때문에 오브젝트의 rotation이 카메라를 바라보는 각도라면
Z-buffer의 정밀도가 높아져 Z-fighting의 발생 빈도가 줄어들면서 Z값을 수정하지 않더라도 위의 문제를 해결할 수 있을 것이다.
하지만 오브젝트를 항상 카메라를 바라보도록 하는 방식은 현재 게임 방향성과 맞지 않는 부분이기 때문에 다른 방식을 택하여 이 문제를 해결했다.
현재 Z-fighting이 발생하는 오브젝트의 Depth를 읽지 않도록 설정한다면 rotation을 수정하지 않고도 Layer 순서대로 Game뷰에 랜더링 될 것이다.
기존 사용하던 Shader에서 Depth Write를 Disabled로 변경해주면 깊이를 읽지 않을 수 있다.
해당 설정으로 변경한 결과 기존 의도했던 순서대로 Sprite들이 랜더링 되는 모습을 볼 수 있다.
참고 블로그 : https://rito15.github.io/posts/unity-transparent-stencil/
'Unity' 카테고리의 다른 글
유니티 프로젝트 개발 일지 - 5 (무기 구현) (0) | 2024.12.22 |
---|---|
유니티 프로젝트 개발 일지 - 4 (유니티 Line 그리기) (0) | 2024.12.21 |
유니티 프로젝트 개발 일지 - 2 (팝업 UI 컨트롤러) (1) | 2024.12.19 |
유니티 프로젝트 개발 일지 - 1 (상태 패턴) (1) | 2024.12.18 |
유니티 프로젝트 개발 일지 - 0 (0) | 2024.12.17 |