이 포스팅은 [KUOCW] 한정현 교수님 강의 15장 - Shadow Mapping을 듣고 정리한 내용입니다.
제목 그대로 그림자에 대한 포스팅이므로 그래픽스 공간상 빛의 효과가 어떻게 표현되는지 알고 보시면 좋을 거 같습니다.
2022.01.19 - [컴퓨터 그래픽스] - 컴퓨터 그래픽스 기초 - Fragment Shader part 2. Phong Lighting ([KUOCW] 한정현 교수님 강의)
이번 강은 물체의 그림자를 어떻게 표현할 것인가를 다룹니다. 그래픽스에서 그림자는 필수적인 요소이죠. 사실적인 표현으로써도 물론이고, 각 물체 간의 관계를 이해하고 표현되는데도 쓰입니다. 아래 그림에서 (b)는 그림자의 위치에 따라 캐릭터가 땅에 착지하는 효과를 줄 수 있음을 보여줍니다.
- Two-pass Algorithm
먼저 shadow를 표현하는 방법으로 two-pass algorithm을 사용하는데요. 이 알고리즘은 두가지 pass, 즉 두 가지 시점에서 렌더링을 진행하는 방식을 말합니다. 첫 번째로는 아래 사진의 왼쪽 그림처럼 광원(light source)을 카메라(EYE)로 취급하여 렌더링을 진행하는데요. 이때 생성된 screen을 shadow map이라고 하고 여기에는 깊이를 나타내는 Z-buffer를 취급합니다. 즉 광원에서 보이는 물체들이 어느 정도 깊이 값을 가지는지를 나타냅니다.
두 번째로는 원래 방식대로인 카메라를 기준으로 렌더링을 진행합니다. 이것이 두 번째 Pass가 되는 것이죠. 이렇게 생성된 두 screen의 값을 비교하는데요. 위의 그림 오른쪽 처럼 카메라가 보는 지점 q를 광원과 연결했을 때의 길이와 d와 실제 그 위치로 뻗어나가는 ray가 닿는 지점 z를 비교합니다. 이때 d> z면 그 지점은 어떤 물체가 빛을 받지 못하고 가려져 있다는 의미로 그림자로 처리하는 것이죠.
하지만 이런 방식으로 처리하게되면 surface acne artifact라는 문제가 발생하게 됩니다. surface acne artifact는 아래 그림처럼 그림자를 처리하는 데 있어서 부자연스러운 줄무늬가 생성되는 현상을 말합니다.
이러한 문제가 생기는 이유는 두 rendering pass의 sampling이 일치하지 않기 때문인데요. 바로 아래 그림처럼 한 점 q를 나타내는 카메라로 부터의 ray에 해당하는 광원으로부터의 파란색 ray는 존재하지 않습니다. 그렇게 되면 가장 가까운 sampling ray z1로 근사를 하여 계산하게 되는데 이렇게 되면 d1 > z1이므로 q1지점은 그림자가 생성되고 q2 지점은 반대로 빛을 받는 지점으로 판단하게 되어 surface acne artifact가 생성되는 것이죠.
이 문제를 해결하기 위해서 그래픽스에서는 임의의 bias를 주어 sampling문제로 차이가 생겨 d > z 가되어 surface acne artifact가 생기는 문제를 해결하고자 하였습니다 이렇게 되면 d와 z+bias를 비교하므로 bias만큼의 차이는 그림자가 지지 않게 되죠. bias를 샘플링에서 나타날 수 있는 차이만큼 표현해주는 것입니다. 이때 bias를 얼마큼 설정해 주느냐가 아래 그림처럼 그림자의 효과를 결정하기도 합니다.
- Shadow Map Filtering
또 shodow map의 해상도가 충분하지 않다면, 여러 픽셀이 shadow map의 하나의 texel에 매칭이 되는 경우가 생길 수 있습니다. 이렇게 되면 위의 그림처럼 그림자가 부드럽지 않게 생성되게 되죠. 이는 texturing에서 나타났던 문제와 동일하다고 볼 수 있죠. 하지만 shadow map의 texel 값을 bilinear interpolation해서 거리 z 값을 나타내도 결국 d와 z의 거리를 계산하는 것이기 때문에 아래 그림의 왼쪽처럼 개선되지 않는다고 말합니다.
이 문제를 그래픽스에서는 Precentage Closer Filtering(PCF)라는 방법을 통해 해결하려 하는데요. 이 방법은 각 texel의 z값을 이용해 bilinear interpolation하는 것이 아니라, 각 texel의 visivility를 bilinear interpolation 합니다. 위의 그림 오른쪽처럼 각 pixel이 그림자에 해당하는지 해당하지 않는지를 두고 그 중간의 지점이 빛을 얼마나 받는지를 계산한다는 것이죠. 이런 방식을 통해서 완벽하지는 않지만 조금은 개선된 효과를 보이는 것을 확인할 수 있습니다.
강의에서는 코드로 shadow map이 rendering pipeline을 통해 어떻게 연산되는지도 설명합니다.
- Soft Shadow
마지막으로 강의에서는 지금까지의 hard shadow와 다르게 area 또는 volumetric light source에서의 그림자 표현 또한 있다는 것을 언급하고 넘어갑니다.
감사합니다.
References
강의: [KUOCW] 한정현 교수님 강의
https://www.youtube.com/channel/UCfyXTCv0QlZxG1S1rteGI7A
강의 자료: 한정현 교수님 연구실 홈페이지
http://media.korea.ac.kr/books/