- 렌더링된 영상의 시각적 사실감을 높이는 데 있어 그림자는 필수불가결한 항목이다.
- (a)에서 캐릭터와 지면 간 상대적인 위치는 명확하지 않는 반면, (b)에서는 캐릭터가 지면에 착지하는 중임을 쉽게 알아낼 수 있다.
15.1 두 단계 렌더링
- 쉐도우 매핑 알고리즘은 두 번의 렌더링 패스(rendering pass)를 통해 수행된다.
- 첫 번째 패스에서는 쉐도우맵(shadow map)이라는 특수한 텍스처를 생성한다. (a)는 광원에서 나온 빛이 미치는 표면은 굵은 선으로 표시되었다.
- 이들 표면을 균일하게 샘플하여, 각 샘플점 $p$마다 광원까지의 거리를 쉐도우 맵에 저장한다.
- 이 거리를 $z$로 표기하는데, 이는 광원에서 본 3차원 장면의 깊이다. (Z Buffer)
- 따라서, 쉐도우맵은 광원 기준의 깊이맵(depth map)이라고도 한다.
- 두 번째 패스에서는 실제 렌더링을 수행하는데, 이 과정에서 쉐도우맵을 사용하여 그림자를 생성한다.
- (b)에서 프래그먼트 $f_1$을 처리하는 경우를 보면, 이 프래그먼트에 해당하는 월드 공간의 점을 $q_1$이라 하면, 광원과 $q_1$ 사이의 거리 $d_1$은 쉐도우맵에 저장된 깊이값 $z_1$보다 크다.
- $z_1$이라는 깊이 값을 가진 어떤 점이 광원과 $q_1$사이에 놓여 있어서 $q_1$으로 향하는 빛을 가리고 있다는 것을 의미한다. 따라서 $q_1$은 그림자에 속하는 점으로 판정된다.
- 반면, 광원까지의 거리 $d_2$는 쉐도우맵에 저장된 값 $z_2$와 같은 $q_2$는 광원에서 보이는 점이 되고, 따라서 $q_2$는 빛을 받는 점으로 판정된다.
- (b)는 쉐도우 매핑을 사용해 장면을 렌더링한 결과를 보여준다. 완전하게 빛을 받는 지역에 자잘한 그림자가 섞여 있다.
- 쉐도우맵은 텍스처의 한 종류이므로 이를 어떻게 필터링할 것인지 미리 정해야 하는데, 근접점 샘플링(nearest point sampling)을 사용한다고 가정하자. 그러면 $q_1$의 경우, 쉐도우맵에서 $z_1$을 읽어올 것이다.
- 이는 $q_1$과 광원 사이의 거리 $d_1$보다 작기 때문에 $q_1$은 그림자에 속하는 점으로 판정되고, 이는 잘못된 판정이다.
- 이처럼 완전하게 빛을 받는 지역임에도 일부 프래그먼트는 빛을 못 받는 것으로 판정되어 (b)처럼 자잘한 그림자가 생성되는 것이다.
- 이 문제를 해결하는 방법은 간단하다. 두 번째 패스에서 샘플한 점들을 광원 쪽으로 약간 이동하면 된다.
- 즉 광원까지의 거리 $d$에서 일정한 값을 빼는 것이다. 이 값을 바이어스(bias)라 한다.
- (d)에서는 $d_1$에서 바이어스를 빼서 $d_1'$를 만든 후 이르 $z_1$과 비교하였다. $d_1'$가 $z_1$보다 작으므로 $q_1$은 빛을 받는 것으로 판정된다. 이러한 방법을 통해 쉐도우 매핑을 개선한 결과를 보여준다.
- 쉐도우 매핑에서는 적절한 바이어스를 설정하는 것이 중요한데, 바이어스가 너무 작을 경우 불필요한 자잘한 그림자를 완벽히 제거할 수 없다.
- 바이어스는 대개 몇 번의 시험을 거쳐 적절한 값으로 설정된다.
15.2 쉐도우맵 필터링
- (a)의 월드 공간 점 $q_1$과 $q_2$를 보면, 이는 쉐도우맵으로 투영(project)되어 두 텍셀 $p_1$과 $p_2$ 사이에 놓이게 된다.
- 근접점 샘플링으로 쉐도우맵을 필터링하면, $q_1$은 $p_1$과 비교되어 그림자 지는 것으로 판정되고, $q_2$는 $p_2$와 비교되어 빛을 받는 것으로 판정된다.
- 즉, 하나의 프래그먼트는 완전히 빛을 받거나 완전히 그늘지거나 둘 중 하나로 판정될 뿐, 다른 여지는 없어진다.
- 그 결과 (b)와 같이 거친 윤곽선을 가진 그림자가 생성된다.
- 이제 겹선형보간으로 쉐도우맵을 필터링해 보자.
- (c)는 쉐도우맵에 투영된 프래그먼트 $q$를 보여준다. $q$를 둘러싼 네 개 텍셀의 깊이 값은 쉐도우맵에서 읽어온 것이고, 이 깊이 값을 겹선형보간하면 64가 된다.
- 만약, $q$의 깊이가 80이라면, $q$는 그늘진 것으로 판정된다. 즉, 완전히 빛을 받거나 완전히 그늘지거나 둘 중 하나로 판정되는 문제는 여전하다. 겹선형보간이 문제를 해결해 주지 않는다.
- 이 문제를 해결하는 방법은 네 개의 텍셀 각각에 대해 $q$의 가시성(visibility)을 결정한 후 이를 보간하는 것이다.
- (d)를 보면, 왼쪽 위의 텍셀만 고려하면 $q$에는 그림자가 맺히는 것으로 판정될 것이다. 즉, 가시성은 0이다.
- 반면, 나머지 세 개의 텍셀에 대해서는 $q$는 빛을 받는 것으로 판정된다. 즉, 가시성은 1이다.
- 네 개의 가시성 값을 겹선형보간하면 $q$의 가시성은 0.58로 계산된다. 이 값은 $q$가 빛을 받는 정도를 나타낸다.
- 완전히 빛을 받거나 완전히 그늘지거나 둘 중 하나를 택하는 대신, [0, 1] 범위 안의 값을 취하게 된다. 0에 가까우면 어둡게, 1에 가까우면 밝게 처리된다.
- (d)의 그림자 윤곽선은 (c)보다 부드러워졌다.
- 쉐도우맵에서 여러 개의 텍셀을 참조하여 이들에 대한 픽셀의 가시성을 결정하고 그 결과를 결합하는 기법을 일반적으로 PCF(percentage closer filtering)라고 부른다.
근접점샘플링과 겹선형보간이 궁금하다면?
[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 8 - 이미지 텍스처링 [2/2]
8.4 텍스처 포장 텍스처 좌표는 원칙적으로 [0, 1] 범위 안에서 정의되지만, GL은 그 범위 밖에서 좌표를 지정하는 것을 허용하고 이를 처리해 준다. 사용자는 텍스처 포장 모드(texture wrapping mode)를
j1y00h4.tistory.com
출처
[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용입니다.
'공부 > Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문' 카테고리의 다른 글
[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 16 - 전역 조명과 텍스처링 [2/2] (0) | 2022.06.25 |
---|---|
[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 16 - 전역 조명과 텍스처링 [1/2] (0) | 2022.06.25 |
[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 14 - 노멀 매핑 [2/2] (0) | 2022.06.11 |
[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 14 - 노멀 매핑 [1/2] (0) | 2022.06.11 |
[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 13 - 캐릭터 애니메이션 [4/4] (0) | 2022.06.06 |