참고 영상 : https://www.youtube.com/watch?v=GelFADvLJXY
유니티에서 3D 게임을 만들다 보면, 그림자가 이상하게 보일 때가 있다. 해당 현상이 생기는 이유와 해결 방법을 정리해 보려고 한다.
그림자에 점이나 선이 생기는 이유
- Shadow Acne (그림자 여드름) ★
- 문제 : 그림자가 드리워져야 할 물체 표면 자체에 그림자가 얼룩덜룩하게 나타나거나 점/선 형태의 패턴이 생기는 현상.
- 원인 : 그림자는 광원으로부터 물체까지의 거리를 계산하여 생성됩니다. 이때, 부동 소수점 정밀도 문제로 인해 그림자를 생성하는 텍셀(Texel)이 실제 그림자가 드리워져야 할 위치보다 미세하게 광원에 더 가깝다고 판단될 수 있습니다. 이로 인해 물체 자체가 자기 그림자를 드리우는 것처럼 보이는 것입니다.
- Peter Panning (피터 패닝)
- 문제 : 물체와 그림자가 분리되어 그림자가 공중에 떠 있는 것처럼 보이는 현상.
- 원인 : Shadow Acne를 해결하기 위해 그림자를 드리울 때 물체 표면에서 그림자를 살짝 밀어내는(Offset) 방식을 사용하는데, 이 오프셋 값이 너무 크면 그림자가 물체에서 멀어지는 문제가 발생합니다.
일반 편차(Normal Bias)
일반 편차(Normal Bias)는 이러한 그림자 아티팩트를 해결하기 위해 사용되는 중요한 설정입니다.
- 정의 : 그림자를 생성할 때, 물체의 법선(Normal) 방향으로 그림자를 드리우는 표면을 얼마나 "밀어낼지"를 결정하는 값입니다. 쉽게 말해, 그림자를 생성하는 기준점을 물체 표면에서 법선 방향으로 얼마나 이동시킬지 조절하는 것입니다.
- 작동 방식:
- 광원에서 섀도우 맵(Shadow Map)을 생성할 때, 물체 표면의 각 점에 대해 해당 점의 법선 방향으로 일정량의 오프셋을 적용합니다.
- 이 오프셋 덕분에 그림자를 드리우는 물체 표면이 실제보다 미세하게 더 광원에서 멀리 있다고 인식되어 Shadow Acne 현상을 줄일 수 있습니다.
일반 편차(Normal Bias) 조절에 따른 변화
일반 편차 = 0 (문제 해결)
- 현상 : 일반 편차 값을 0으로 낮추자, 물체 표면을 지저분하게 만들었던 Shadow Acne가 사라지고 아래 이미지처럼 깔끔한 그림자가 생성되었습니다.
- 분석 : 이 경우, 기본값으로 설정된 편차가 오히려 불필요한 문제를 일으키고 있었음을 의미합니다. 편차를 0으로 설정하여 그림자 계산을 물체 표면에 더 가깝게 수행함으로써, 자기 그림자를 유발하던 정밀도 오류를 회피하고 깨끗한 결과를 얻게 된 것입니다. (물론, 다른 환경에서는 0으로 설정 시 오히려 Shadow Acne가 발생할 수도 있습니다.)
일반 편차 = 1 (기본값, 문제 발생)
- 현상 : URP의 기본 설정값 등에서 흔히 볼 수 있는 상태로, 물체 표면에 점이나 선 형태의 그림자 아티팩트(Shadow Acne)가 나타납니다. 그림자가 자기 자신을 침범하여 얼룩덜룩하게 보이는 문제입니다.
- 원인 : Shadow Acne를 방지하기 위해 약간의 편차(Bias)가 적용되었지만, 그 값이 충분하지 않거나 혹은 렌더링 파이프라인의 정밀도 한계와 맞물려 여전히 자기 그림자(self-shadowing) 현상이 발생하는 것입니다.
일반 편차 = 10 (그림자 깨짐)
- 현상 : 반대로 일반 편차 값을 10이라는 매우 큰 값으로 설정했더니, 그림자가 물체에서 분리되는 'Peter Panning' 현상을 넘어 아예 형태를 알아볼 수 없게 산산조각 나는 문제가 발생했습니다.
- 원인 : 이는 과도한 편차 적용으로 인한 형태 왜곡 때문입니다. 물체 표면의 각 지점을 법선 방향으로 너무 멀리 밀어내다 보니, 광원의 시점에서 봤을 때 원래의 물체 형태가 완전히 해체된 것처럼 보이게 됩니다. 이 흩어진 기준점들을 바탕으로 그림자를 그리니, 결과물 역시 조각난 형태로 나타나는 것입니다.
결론적으로, Normal Bias는 Shadow Acne를 잡을 수 있을 만큼 충분히 높되, Peter Panning이나 그림자 깨짐을 유발하지 않을 만큼 낮은 최적의 값을 찾는 것이 중요합니다. 이 값은 씬의 스케일, 애셋의 폴리곤 밀도, 광원의 각도 등에 따라 달라질 수 있으므로, 상황에 맞게 미세하게 조절하는 과정이 필요합니다.