[Unity] Z-파이팅
![[Unity] Z-파이팅](/_next/image?url=https%3A%2F%2Fdata.develog.develrocket.com%2Fupload%2Fdevelog%2Fuser_1777093328305%2F1785930264559-qd5m6r%2F_____2026-08-05_204205.png&w=3840&q=75)
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
Z-파이팅(Z-fighting)은 카메라로부터 거의 같은 깊이에 놓인 두 개 이상의 면이 서로 앞에 그려지려고 다투면서 화면이 지글거리거나 깜빡이는 현상이다.


유니티에서 그냥 Plane 두개랑 Material 두개만 만들어도 만들 수 있다.
렌더링 과정에서 각 픽셀의 깊이 값은 뎁스 버퍼(depth buffer) 에 저장된다. 이 값은 부동소수점이며, 정밀도는 유한하다. 두 면의 깊이 차이가 이 정밀도보다 작으면 GPU는 어느 면이 앞인지 판정하지 못한다. 이 상태에서 카메라의 위치나 각도가 조금만 바뀌어도 판정이 뒤집히고, 그 결과 픽셀 단위로 앞뒤가 번갈아 그려지며 지글거림이 발생한다.
특히 카메라에서 멀어질수록 뎁스 정밀도는 급격히 떨어진다. 원근 투영에서 깊이 값은 비선형으로 분포하기 때문에, 먼 거리에 정밀도가 몰려 있어 깨지기 쉽다. 직교(orthographic) 투영에서는 깊이가 선형으로 분포하므로 원근보다는 덜하지만, 완전히 겹친 면 자체는 여전히 문제가 된다.
두 폴리곤이 같은 평면에 겹쳐 있을 때 발생하기 쉽다. 바닥 위에 얹은 데칼, 그림자 평면, 벽에 딱 붙여 배치한 오브젝트 등이 대표적인 예다. 또한 카메라의 near/far clip plane 범위가 지나치게 넓을 때, 특히 near 값이 너무 작을 때 정밀도가 낭비되어 문제가 심해진다.
가장 기본적인 방법은 겹치는 면 사이에 미세한 간격을 두어 살짝 띄우는 것이다. Polygon Offset(Depth Bias) 을 사용해 렌더링 시 깊이 값을 인위적으로 밀어주는 방법도 있는데, 데칼이나 그림자 처리에 흔히 쓰인다. near/far clip plane을 조정하는 것도 효과적이다. 특히 near 값을 너무 작게 잡지 않는 것이 중요한데, near를 키우는 쪽이 far를 줄이는 것보다 정밀도 개선 효과가 크다. 렌더 순서를 강제하고 싶다면 셰이더의 render queue나 Sorting을 조정해 그리는 순서를 명시할 수 있다. 그래도 해결되지 않는다면 완전히 같은 위치에 겹친 지오메트리는 하나로 합치거나 아예 제거하는 편이 낫다.
포스트 프로세싱

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.