'깊이 그림자'에 해당되는 글 1건

  1. 2009.12.07 깊이 그림자 기법(Shadow Mapping)



아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/그림자%20생성

2008-07-04 21:30:00
デプスシャドウ技法~その基本形 GPUのピクセルスループット(テクセルフィルレート)が劇的に向上したことに後押しされて、最近では「ステンシルシャドウボリューム技法」よりも採用例が多くなってきているのが「デプ ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.



깊이 그림자 기법 ~ 그 기본형

GPU의 픽셀 처리량(Throughput, 텍셀 Fill Rate)이 극적으로 향상된 덕분에, 최근에는 「스텐실 그림자 볼륨 기법」보다 채용예가 많아지고 있는 것이 「깊이 그림자 기법」(Depth Shadow) 이다. 이 기법은 「그림자 맵 기법」(Shadow Maps)이나 「깊이버퍼 그림자 기법」(Depth Buffer Shadow) 이라고도 불리지만, 본 연재에서는 「깊이 그림자 기법」으로 통일하겠다.

이 기법은 다이렉트X 9 / SM 3.0 시대에 여러가지 개량판이 생겼고, 본 연재에서는 그 개량판까지 소개하려고 한다. 우선은 이 기본형의 개념으로부터 해설하겠다.

이 기법에서는 광원으로부터의 차폐구조를, 「광원으로부터 차폐물까지의 거리」정보로 표현한다.

「광원으로부터 차폐물까지의 거리」…… 라고 하면 어렵게 느껴질지도 모르겠지만, 실제로 이것은 광원을 가상의 시점으로 해서 그 씬의 깊이값을 구하는 Z버퍼 렌더링으로 얻어진다.

                     깊이 그림자 기법의 동작 개념도

< 그림설명 >
광원、시점
 --  광원으로부터의 빛이 닿는 곳
      광원으로부터의 빛이 닿지 않는 곳
(버블) ① 「광원으로부터의 빛이 닿고 있는가?」아닌지를 그림자맵용 버퍼에 써넣는다(광원으로부터의 깊이정보만을 렌더링)
(↓)그림자맵을 만들었으면 실제 씬을 렌더링하는 곳으로
②시점으로부터 렌더링을 할 때 그림자맵을 참조해서 그림자로 보이는 부분은 그림자를 그려준다.


이 광원으로부터의 거리 정보를 모은 Z버퍼(깊이버퍼)의 내용은 실질적으로 「차폐의 분포」를 나타내므로, 이것을 특히 「그림자맵」이라고 부른다. 이 기법을 「깊이 그림자 기법」「깊이 버퍼 그림자 기법」「그림자 맵 기법」이라고 부르는 것은 이 부분에서 온 것이다. 덧붙여 이 그림자맵은 Z버퍼가 아닌 텍스처(최근에는 부동 소수점 텍스처등)로 생성하는 경우도 있다.

최종씬을 렌더링할 때는, 그릴 대상 픽셀에 대해서, 빛이 닿고 있는 픽셀인지, 그렇지 않은지(=그림자가 된다)를, 그 그림자맵을 참조해 판정하면서 그려 나간다.

그릴 대상 픽셀과 그림자맵과의 대응은, 그 그림자맵을 앞에서 기술한 투사 텍스쳐 매핑의 요령으로 씬에 매핑 해 줌으로써 실현된다.

그릴 대상 픽셀이 3D 공간 상에서, 광원으로부터 어느 정도의 거리에 있는지를 계산해서 구하고, 그것과 대응하는 그림자맵의 값을 비교해 준다.

이 비교는, 이미지적으로는, 그릴려는 그 픽셀에 빛이 도착했는지 안했는지의 판정에 해당한다. 도착한 경우, 그 픽셀의 광원으로부터의 거리와 그림자맵의 값은 일치하게 된다. 즉, 이 경우는 빛이 비치고 있다고 판단 한다.

한편, 그림자 맵쪽의 값이 작을 경우는, 그릴 대상 픽셀까지 빛이 도착하지 않았다(=즉 차폐되고 있다)는 것을 나타내므로 그림자가 된다.

                        그림자인지 아닌지의 판정


< 그림설명 >
d : 렌더링하려는 픽셀의 광원까지의 거리
s : 그림자맵의 내용. 광원으로부터의 빛이 차폐되는 곳까지의 거리
(좌 버블) 여기는 d = s이므로 빛이 닿고 있다.
(우 버블) 여기는 d > s이므로 그림자가 되어 있다.
d > s는 그릴 픽셀까지 빛이 전해지지않았다는 것에 해당된다.


빛의 차폐구조가 제대로 고려되어지므로, 이 기법에서도 셀프 그림자 표현은 된다. 그리고 물론 상호 투사그림자의 표현도 자동으로 이루어진다.

그림자 맵의 생성은, 실제로 그 씬에 등장하는 모든 폴리곤(3D모델)을 광원 방향에서 렌더링 하는 것이므로, 부하는 큰 것 같다. 그러나, 텍스처 적용이나 특별한 픽셀셰이더에 의한 라이팅을 실시하지 않는 Z값 출력만의 Z버퍼 렌더링은 최신 GPU는 배속으로 처리하므로 비교적 고속으로 완료할 수 있다.

이 그림자 맵 생성의 Z버퍼 렌더링 시에, 폴리곤에 붙여지는 텍스처의 내용을 고려한 그림자 맵을 생성하는 것도 가능은 하다. 그러면 스텐실 그림자 볼륨 기법에서 문제가 된 사각형 폴리곤에 잎 텍스처를 붙인 경우에 대해서도, 제대로 잎의 형태로 그림자를 떨어뜨리는 것이 가능해진다.

그림자 맵 기법 채용의 대표작이라고 하면 「Tom Clancy's Splinter Cell」(UBI SOFT,2002)이다. 잎 텍스처가 그려진 폴리곤도, 제대로 그림자가 그 잎의 형태로 떨어져 준다.
(C) 2002 Ubi Soft、 Inc. All rights reserved. Ubi Soft Entertainment and the Ubi Soft logo are registered trademarks of Ubi Soft、 Inc. Splinter Cell is a trademark of Ubi Soft Entertainment、 Inc. All Rights Reserved. All other trademarks are the property of their respective owners Xbox is a trademark of Microsoft Corporation in the United States and/or other countries. Unreal Engine is a trademark of Epic Games Inc.

깊이 그림자 기법의 문제점

이 기법의 키포인트는, 그 씬의 빛의 차폐 구조를 나타내는 그림자 맵의 정밀도에 있다. 그렇게 생성되는 그림자의 품질이나 정밀도는 그림자 맵의 해상도에 많이 의존해 버린다.

넓은 씬의 차폐구조를 해상도가 부족한 그림자 맵으로 생성했을 경우, 그림자는 매우 대략적으로 되기는 커녕, 강한 Jaggies(artifacts, 경계면에 톱니모양이 생기는 현상)이 나와 버린다.

예를 들면, 100m×100m로 되는 씬의 모든 그림자를 256×256 텍셀의 그림자 맵으로 나타냈다고 하자. 그러면, (100m÷256 텍셀)이고, 약 40cm×40cm의 영역의 차폐구조가 불과 1텍셀에 떨어져 버린다. 요컨데, 어느 정도 좁은 실내와 같은 씬이라면 그런대로 괜찮지만, 실외 등의 넓은 공간에서는, 고해상도의 그림자 맵을 생성하지 않으면, 그림자의 품질은 상당히 떨어져 버린다.

 

그림자 맵 해상도가 충분한 경우

 그림자 맵 해상도가 불충분한 경우. 그림자
  외곽이 톱니처럼 들쭉날쭉해진다.

이  Jaggies를 없애기 위해서는 그림자 맵의 해상도를 올리지 않으면 안 된다

< 그림설명 >
이 사각형이 그림자맵의 해상도에 해당된다.


그림자 맵 해상도가 불충분하면, 이 깊이 그림자 기법은 톱니처럼 들쭉날쭉한 그림자가 되어 버리는데 반해서, 스텐실 그림자 볼륨 기법에서는 이런 문제는 일어나지 않는다. 이 그림자의 Jaggies를 없애려면 , 단편적인 방법으로는 고해상도의 그림자맵을 만들면 되겠지만, 그것은 실제로 어렵다.

이 깊이 그림자 기법의 진화의 역사는, 이 Jaggies를 없애기 위한 연구의 역사이고, 지금도 여러가지 개량형의 깊이 그림자 기법들이 나오고 있다.

다음회 부터는 그런 개량버전들의 전형을 몇가지 소개해 나가기로 하겠다. (계속)




 

Posted by 노을삼킨별
,