'스텐실 그림자 볼륨'에 해당되는 글 1건

  1. 2009.12.07 스텐실 그림자 볼륨 기법(Stencil Shadow Volume)



아래에서 퍼옴

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



2008-06-20 13:30:00
ステンシルシャドウボリューム技法 結局のところ、セルフシャドウ表現までを含んだ正確な影を出すためには、どうしても光源からの光を何がどう遮蔽しているか、という情報を求めなければならない。つまり、そのシー ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.



 

스텐실 그림자 볼륨 기법(Stencil Shadow Volume)

결국, 셀프 그림자 표현까지를 포함한 정확한 그림자를 만들어 내기 위해서는, 아무래도 광원으로부터의 빛을 무엇이 어떻게 가리고 있는가? 라는 정보를 구하지 않으면 안 된다. 즉, 그 씬의, 빛에서 본 차폐구조를 구하지 않으면 안되는 것이다.

비교적, 호환성이 높고, 범용성이 높은 기법으로 최근에도 채용예가 많은 것이 「 스텐실 그림자 볼륨 기법 」(Stencil Shadow Volume)이다. 이 기법은 2004년을 대표하는 3D PC게임인 「 DOOM3 」(id software,2004)가 채용한 것으로도 화제가 되었다.

스텐실 그림자 볼륨 기법에 의한 그림자 생성의 대표작이라고도 할 수 있는 「 DOOM3 」(id software,2004)
(C)2004 Id Software, Inc. All rights reserved. Distributed by Activision Publishing, Inc. under license. DOOM and id are registered trademarks of Id Software, Inc. in the U.S. Patent and Trademark Office and in some other countries. Activision is a registered trademark of Activision, Inc. and its affiliates. The ratings icon is a registered trademark of the Interactive Digital Software Association. All other trademarks and trade names are the properties of their respective owners.


이 기법에서는, 씬을 우선 렌더링해서 그 씬의 시점으로부터 본 깊이정보를 Z버퍼에 생성한다. 덧붙이면, 씬의 깊이정보는 그림자 생성을 위해서만 …… 이 아니라, 뒷 단계의 렌더링이나, 여러가지 포스트 효과에 활용하기 위해, 먼저 씬의 깊이정보만을 렌더링 해 버리는 테크닉이 사용되는 경우가 많아졌다.

그다음 , 광원에서 보고, 그 씬의 3D모델의 윤곽이 되는 정점들을 빛의 진행 방향 …… 즉 광선(Ray) 벡터 방향으로 잡아늘인다. 이 잡아늘여서 생겨난 영역이 「그림자가 되는 영역」이며, 이것이 기법의 이름에도 있는 「그림자 볼륨」이다.

스텐실 그림자 볼륨 기법에 의한 그림자 생성의 동작 개념도

< 그림 설명 >
광원、시점그림자볼륨
(버블) ①오브젝트의 윤곽을 광원방향(광원으로부터 나오는 빛의 방향)으로 잡아 늘린다.
(버블) ②시점위치로 부터의 깊이정보(z버퍼)와 그림자볼륨을 비교해서 그림자인지 아닌지를 판정하고 그 결과
를 스텐실버퍼에 기록한다.
(원) 시점에서 보면
(버블) ③스텐실버퍼의 데이터를 기준으로 그림자(그림자색 픽셀)을 그린다.

이어서, 이 그림자 볼륨을 렌더링하고 그림자를 구해야 하지만, 이 렌더링은 조금 기교적이어서, (화면)표시용 프레임버퍼(frame buffer)가 아니고, 「스텐실 버퍼」(Stencil Buffer)라는 다목적으로 활용되는 산술처리용 프레임버퍼에 한다. (스텐실 버퍼는 미리"0"으로 초기화해 둔다).

빛에서 보고 윤곽이 되는 정점을 잡아늘여서 생성한 그림자 볼륨을 가시화한 그림

이 그림자 볼륨의 렌더링은 2단계로 실행하는 것이 특징이다.

1단계에서는, 시점에서 봤을 때, 이 그림자 볼륨의 앞면(表面, 표면)이 되는 폴리곤(시점 방향으로 면이 향해 있는 그림자 영역)만을 스텐실 버퍼에 "+1" 연산으로 렌더링한다.

광원이 다수 있는 경우나 3D오브젝트가 서로 겹쳐 있을 때는, 이 그림자 영역의 전면이 되는 부분은 "+1" 이 중복되 렌더링 되어, 스텐실값은 커지기도 한다.

1단계. 우선은 그림자 볼륨의 표면이 되는 부분을 "+1" 로서 스텐실 버퍼에 렌더링

< 그림 설명 >
광원、
(원)
스텐실버퍼
(박스) 시점에서 보았을 때의 그림자 영역의 앞면을 +1로 렌더링


2단계에서는, 이번에는, 이 그림자 볼륨의, 시점에서 봤을 때 뒷면(裏面, 이면)이 되는 폴리곤을, 똑같이 방금전의 스텐실 버퍼에 렌더링 하지만, 이번에는 "-1" 연산으로 실행한다.

아무런 차폐물이 없는 그림자 영역에서는, 1단계에서 표면을 렌더링 한 부분의 "+1" 된 횟수만큼만, 이번에는 "-1" 되므로, 스텐실 값은 "±0" 으로 돌아온다. 스텐실 값이 제로가 된 부분은, 즉 그림자 영역이 아니다 …… 라는 것이 된다.

그러나, 어떠한 차폐물이 있으면, 이 그림자 영역의 뒷면 폴리곤이 그려지지 않는다 …… 즉 "-1" 되지 않게 되어, 그 스텐실 버퍼의 내용은 "0"이 되지 않고 "1" 이상의 값을 남긴 상태가 되어 버린다.  또한 차폐물이 있는지 없는지의 판단은, 사전에 렌더링 해 두었던 Z버퍼의 내용(씬의 깊이정보)를 통해서 한다.

스텐실 버퍼의 픽셀 중 "0"이 되지 않았던 부분의 픽셀은, 「그림자가 되는 픽셀이다」라는 것을 나타낸다.

2단계. 이어서 그림자 볼륨의 뒷면이 되는 부분을 "-1" 옵션으로 스텐실 버퍼에 렌더링

< 그림 설명 >
광원、스텐실버퍼
시점에서 보았을 때의 그림자영역의 뒷면을 -1로 렌더링


그림자 영역의 전면과 후면을 다 그린 스텐실 버퍼는, 그 프레임의 어느 픽셀이 그림자인지 아닌지를 나타내고 있으므로, 최종적인 렌더링에서는, 이 스텐실 버퍼의 내용을 참조해서, 그림자이면 그림자색을 첨가해 주면 된다. 스텐실 버퍼는, 특정 값으로 그림을 마스크 처리 하는 것도 가능하기 때문에, 전체적으로 그림자색으로 칠해도 확실하게 그림자가 되어야 할 부분만을 "그림자색"으로 찍는 것이 가능하다. "그림자색"은 아주 까맣게 해도 되고, 그 씬을 평범하게 렌더링해서 구해진 픽셀색에, 적당한 투명도로 어두운 색을 믹스해서 어두운색을 내도록 해도 된다. 이 부분은 아티스틱한 센스에 좌우되는 부분이다.

연산해서 +1이상이 된 부분이 그림자로 보이는 부분이다

< 그림 설명 >
광원、
앞면과 뒷면의 스텐실버퍼의 값을 합했을 때 +1 이상이 되는 곳이 그림자가 된다.

이 기법에서는, 결과적으로, 광원 하나하나 마다 생성된 그림자 볼륨이, 그 광원으로부터의 빛의 차폐구조를 스텐실 버퍼에 기록하는것이므로, 셀프 그림자 표현도 올바르게 되고, 3D모델이 서로 그림자를 떨어뜨리는 상호 투사 그림자 표현도 올바르게 된다. (계속)

스텐실 그림자 볼륨 기법의 문제

스텐실 그림자 볼륨 기법의 약점은, 그림자의 생성 단위가 폴리곤(다각형) 단위로 한정되어 버린다는 점에 있다.

어디까지나 폴리곤 단위의 그림자 생성이 되므로, 텍스처의 내용을 고려한 그림자는 생성되지 않는다

< 그림 설명 >
폴리곤、
그림자가 폴리곤 모양(사각형)으로 나와 버린다.


예를 들면, 잎의 텍스처를 붙인 사각형 폴리곤이 있다고 하자. 눈에는 「잎」처럼 보이지만, 실제로는, 잎의 외부는 투명색일뿐 , 사각형 폴리곤이다. 이 잎의 그림자를 생성하면, 이 기법은 정점 단위의 그림자 생성 기법이 되므로, 사각형 폴리곤 모양의 그림자가 나와 버린다.

「EVERQUEST2」(Sony Online Entertainment,2004)에서. 왼쪽의 야자나무 잎에 주목. 잎 그 자체는 제대로 잎의 형태를 하고 있지만, 그 그늘은 네모진 폴리곤의 형태가 되어 있다.
EverQuest is a registered trademark of Sony Computer Entertainment America Inc. in the United States and/or other countries. (c) 2004 Sony Computer Entertainment America Inc.All Rights Reserved.


그리고, 이 기법의 구현에 있어서의 고민스런 부분은, 정점을 연장해서 그림자 볼륨을 생성하는 처리단계이다.

한마디로 「그림자 생성을 위해서 잡아 늘인다」라고는 하지만, 본래의 정점과 잡아 늘린 후의 정점을 구하지 않으면, 그림자 영역, 즉 쉐도우 볼륨을 생성할 수 없다. 게다가 3D캐릭터가 돌아 다니고, 광원이 움직이는 동적인 씬에서는, 그 순간에서의, 씬 속의 어느 정점이 그림자 영역으로서 길게 늘려질지 모른다.

그 때문에, 이 기법을 채용하는것에 맞쳐서는, 3D모델을 구성하는 각 정점에 대해서, 그림자 생성 전용의 볼륨용 정점(실제로는 폴리곤)을 미리 넣어 두는 식의 고안이 필요했다. 어느 정점이 언제 길게 늘어질지 모르기 때문에 3D모델의 정점 모두에 볼륨용 폴리곤을 넣을 필요가 있다.  또한 길게 늘어났다/않았다 와는 관계없이, 정점셰이더는 들어온 모든 정점에 대해서 처리를 하므로, 필연적으로 정점셰이더의 부하가 심해져 버린다.

그림자 볼륨을 생성할 때의 전용 정점(폴리곤)을 어떻게 3D모델에 넣어 둘지가 포인트이다. 알고리즘은 심플하지만 다이렉트X 9 / SM 3.0까지의 GPU에서는 구현이 의외로 번거로웠다.

 

「DOOM3」의 한장면에서. (좌) 아무렇지도 않은 씬이지만…….(우) 생성된 그림자 볼륨을 가시화하면 이와 같이 되어 있다. 스텐실 버퍼에 렌더링 하면 "±0" 되어 그림자는 되지 않아도, 실제로는, 이만큼의 그림자 볼륨이 생성되고 있다.
(C)2004 Id Software, Inc. All rights reserved. Distributed by Activision Publishing, Inc. under license. DOOM and id are registered trademarks of Id Software, Inc. in the U.S. Patent and Trademark Office and in some other countries. Activision is a registered trademark of Activision, Inc. and its affiliates. The ratings icon is a registered trademark of the Interactive Digital Software Association. All other trademarks and trade names are the properties of their respective owners.

< 그림 설명 1 >
광원、폴리곤、정점、그림자볼륨
잡아늘려진 정점
(버블) 3D 모델에 볼륨용 정점을 넣어 두지 않으면 원래 폴리곤이 단지 늘어져 변형되 버린다.


3D모델을 디자인 할때도, 미리 그림자 영역(볼륨)용의 정점을 폴리곤 계산에 넣어 두지 않으면 안되어, 외형 표현에 이용되는 다각형수는 (그만큼) 줄어 들 수 밖에 었었다. 앞에 나왔던 「 DOOM3 」의 사진을 봐도 알수 있듯이 2004년에 등장한 타이틀에 비해서는 묘하게 3D모델이 그저그런 것은 이러한 이유 때문이다.

그래픽스 엔진쪽(CPU쪽)에서, 어느 정점이 지금 길게 늘어지는지를 판정해 늘어지는 정점을 넣어 주는 식의 아이디어를 구현한 경우도 있지만 그런 경우에는 CPU에 고부하가 걸려, (CPU 성능이 충분하지 않으면) 이쪽에 병목현상이 발생하기 쉽다.

호환성이 높고, 알고리즘도 비교적 심플한 기법이지만, 이 볼륨을 만드는 정점을 어떻게 구현할지가 성가셨기  때문에, 다이렉트X 9 / SM 3.0 시대에서는, 채용예가 감소하는 경향으로 가고 말았다.

그런데 , 다이렉트X 10 / SM 4.0 시대에 돌입한 지금은 상황이 바뀌어 가고 있다. 그것은 동적으로 정점을 증가 감소 시킬 수 있는 지오메트리셰이더가 추가 되었기 때문이다.

지오메트리셰이더를 활용하면, 이 기법의 포인트가 되는 그림자 영역용 정점을, 렌더링시에 그때그때 맞게  생성하는 것이 가능하다. 지오메트리셰이더의 활용에 의해 이 기법도 다시 각광 받게 될지도 모른다.(계속)



 

Posted by 노을삼킨별
,