본문 바로가기

컴퓨터 그래픽스

컴퓨터 그래픽스 - Shadow Mapping([KUOCW] 한정현 교수님 강의)

이 포스팅은 [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를 취급합니다. 즉 광원에서 보이는 물체들이 어느 정도 깊이 값을 가지는지를 나타냅니다.  

Two-pass Algorithm

두 번째로는 원래 방식대로인 카메라를 기준으로 렌더링을 진행합니다. 이것이 두 번째 Pass가 되는 것이죠. 이렇게 생성된 두 screen의 값을 비교하는데요. 위의 그림 오른쪽 처럼 카메라가 보는 지점 q를 광원과 연결했을 때의 길이와 d와 실제 그 위치로 뻗어나가는 ray가 닿는 지점 z를 비교합니다. 이때 d> z면 그 지점은 어떤 물체가 빛을 받지 못하고 가려져 있다는 의미로 그림자로 처리하는 것이죠.

 

하지만 이런 방식으로 처리하게되면 surface acne artifact라는 문제가 발생하게 됩니다. surface acne artifact는 아래 그림처럼 그림자를 처리하는 데 있어서 부자연스러운 줄무늬가 생성되는 현상을 말합니다.

 surface acne artifact

이러한 문제가 생기는 이유는 두 rendering pass의 sampling이 일치하지 않기 때문인데요. 바로 아래 그림처럼 한 점 q를 나타내는 카메라로 부터의 ray에 해당하는 광원으로부터의 파란색 ray는 존재하지 않습니다. 그렇게 되면 가장 가까운 sampling ray z1로 근사를 하여 계산하게 되는데 이렇게 되면 d1 > z1이므로 q1지점은 그림자가 생성되고 q2 지점은 반대로 빛을 받는 지점으로 판단하게 되어  surface acne artifact가 생성되는 것이죠.

surface acne artifact 원인(위)과 bias의 표현(아래)

이 문제를 해결하기 위해서 그래픽스에서는 임의의 bias를 주어 sampling문제로 차이가 생겨 d > z 가되어 surface acne artifact가 생기는 문제를 해결하고자 하였습니다 이렇게 되면 d와 z+bias를 비교하므로 bias만큼의 차이는 그림자가 지지 않게 되죠. bias를 샘플링에서 나타날 수 있는 차이만큼 표현해주는 것입니다. 이때 bias를 얼마큼 설정해 주느냐가 아래 그림처럼 그림자의 효과를 결정하기도 합니다.

Bias에 따른 그림자 표현


shadow mapping with low resolution shadow map

  • Shadow Map Filtering

또 shodow map의 해상도가 충분하지 않다면, 여러 픽셀이 shadow map의 하나의 texel에 매칭이 되는 경우가 생길 수 있습니다. 이렇게 되면 위의 그림처럼 그림자가 부드럽지 않게 생성되게 되죠. 이는 texturing에서 나타났던 문제와 동일하다고 볼 수 있죠. 하지만 shadow map의 texel 값을 bilinear interpolation해서 거리 z 값을 나타내도 결국 d와 z의 거리를 계산하는 것이기 때문에 아래 그림의 왼쪽처럼 개선되지 않는다고 말합니다.  

shadow map texle bilinear interpolation(좌)와 precentage closer filtering(우)

이 문제를 그래픽스에서는 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에서의 그림자 표현 또한 있다는 것을 언급하고 넘어갑니다.

Soft Shadow


감사합니다.

 

References

강의: [KUOCW] 한정현 교수님 강의

https://www.youtube.com/channel/UCfyXTCv0QlZxG1S1rteGI7A

강의 자료: 한정현 교수님 연구실 홈페이지
http://media.korea.ac.kr/books/