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

  1. 2009.12.07 개량형 깊이 그림자 기법


아래에서 퍼옴

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



개량형 깊이 그림자 기법 : PSM

2008-07-11 19:00:00
現在は、影生成技法の主流になりつつあるデプスシャドウ技法だが、シャドウマップの解像度を十分に高くしないと、生成した影にジャギーが出やすいという弱点があることを前回でも指摘した。研究が進むにつれて、こ ...... >> Read more
 

(C) Mainichi Communications Inc. All rights reserved.



 

오늘날, 그림자 생성 기법의 주류가 되고 있는 깊이 그림자 기법이지만, 그림자 맵의 해상도를 충분히 높게 하지 않으면 생성한 그림자에 Jaggies(artifacts)가 나오기 쉽다는 약점이 있다는 것을 지난회에서도 지적했다.

연구가 진행됨에 따라서, 이 그림자의 Jaggies를 지우는 여러가지 아이디어가 발표되고 있다. 여기에서는, 이 깊이 그림자 기법의 대표적인 개량형 몇가지를 소개해 나가고 싶다.


 

깊이 그림자 기법의 약점을 근본적으로 해결하려면?

깊이 그림자 기법의 Jaggies의 문제를, 이 기법의 근본으로부터 개량해서 줄여 나가려고 하는 아이디어도 여러가지 제안되었고, 그 몇개는 실제로 3D게임 타이틀에도 활용되기 시작했다.

깊이 그림자 기법의 Jaggies는, 차폐분포를 나타내는 그림자맵의 해상도가 모자란 것이 주된 원인으로 되어 있다.

예를 들면, 전에 설명한 것처럼 100m×100m의 씬의 차폐분포을 256×256 텍셀의 그림자맵에 생성했다고 하면, 약 40cm×40cm의 차폐구조가 1텍셀로 모아져 버린다. 파악하려는 차폐 구조의 정밀도와 그 대상 범위의 밸런스가 맞지 않아서 오는 것이다.

한편, 최신 세대의 다이렉트X 10 / SM 4.0 대응 GPU에서의 텍스처 최대 사이즈는 8192×8192 텍셀이나 되므로,  앞의 100m×100m의 예로 보면, 이 경우 1텍셀에서 약3cm×3cm의 차폐구조를 나타낼 수 있다.

그러나, 시점에서 먼 부분의 차폐구조를 3cm×3cm로 취하는 것은 지나친 것이다. 100m 앞의 3cm의 차폐구조는 1픽셀도 되지 않는다. 광원으로부터 그림자맵을 생성할 때의 그림자맵의 해상도는, 시점으로부터 씬을 렌더링 할 때 필요한 그림자맵의 정밀도와는 균형이 맞지 않는 것이다.

깊이 그림자 기법의 약점은 원하는 그림자 맵의 해상도와 생성되는 그림자 맵의 해상도의 불균형에서 생겨난다.

< 그림설명 >

광원、시점,시계(시야)

(좌) 이 예에서는 시점에 가까운 곳의 그림자맵은 2텍셀로 밖에 표시되지 않는다.
(우) 시점에서 먼 곳의 그림자맵에서는 5텍셀로 표현된다.


그렇다면, 이 불균형의 관계를 해소해 주면 되지 않을까?

이러한 발상으로부터 여러가지 깊이 그림자 기법의 개량판이 제창되어 왔다.


Perspective Shadow Map 기법 ~ 깊이 그림자 기법의 개량판 그 첫번째

그 하나가, 2002년, 독일의 에를랑겐 뉘른베르크 대학(University of Erlangen-Nuremberg)의 Marc Stamminger씨 등이 SIGGRAPH 2002에서 발표한 「  투시 그림자 맵 기법」(PSM:Perspective Shadow Maps)이다.

깊이 그림자 기법에 의한 그림자의 Jaggies는, 차폐구조를 취하는 방법이 아무래도 거칠어져 버리는 시점 근처의 영역에서 눈에 띈다. 거기서 「시점에 가까운 위치의 그림자 맵을 고해상도로 생성하고, 멀어지는 것에 따라서 그나름의 해상도로 처리한다 」라는 발상으로 그림자 맵을 생성하면 되지 않을까?

이 그림자맵을 생성할 때, 특수한 바이어스를 거는 방법으로서 「 시야로부터의 좌표계를 고려해서 생성하자 」라고 하는 아이디어를 도입한 것이 PSM기법이다.

구체적으로는, 그림자맵을, 투시투영변환(Perspective Projection)해서 생성하면 된다. 물론 「투시 그림자 맵 기법」의 "Perspective"는 여기서 왔다.

이것으로 가까운 위치의 그림자맵은 고해상도가 되고, 안쪽으로 들어가면서 그나름의 해상도가 된다. 이것으로 생성되는 그림자의 퀄리티가 시점으로부터의 거리에 좌우되는 것은 개선되는 것이다.

                                            PSM기법의 개념도

< 그림설명 >

(좌) 이런 씬이 있을 때 이 시계(시야)에 대응하도록....
(우) 그림자맵을 생성한다.
(버블) 이렇게 해서 시점에 가까운 위치의 그림자맵의 해상도가 향상된다.


이 투시 그림자 맵 기법은, 업계표준의 벤치마크 소프트웨어 「 3DMark05 」(Futuremark,2004)에 채용되어 주목 받았다.(계속)



개량형 깊이 그림자 기법 : LiSPSM



Light Space Perspective Shadow Map 기법 ~
Depth Shadow 기법의 개량판 그 두번째

지난회에서 다룬 개량형 깊이 그림자 기법인 PSM기법에도 약점은 있다.

시점보다 뒤(배후)에 있는 것 같은 「3D오브젝트 본체는 시야에 들어 오지 않지만 그림자 만은 시야에 들어 오는 경우」에서는, 투시투영변환한 좌표계로 그림자 맵을 생성해도 원리 상 잘 되지 않는다.

또, 시선과 광원이 서로 마주보는 위치 관계(완전 역광 상태)일 때에는, 통상의 깊이 그림자 기법의 그림자 생성에서 그다지 변하지 않고, 그런 조건에서는 역시 Jaggies가 생겨 버린다.

시야와 광원으로부터의 빛이 서로 대립되는 경우에서는 모처럼의 PSM만이 가능한 착상이 쓸모가 없어 진다
「 3DMark05 」로 부터. 시야와 광원과의 위치가 악조건인 상항에서는 PSM에서도 그림자에 보풀이 일어나는 것이 눈에 띤다

거기서 개량형 PSM기법이, 2004년의 Eurographics Symposium on Rendering에서 빈 공과대학의 Michael Wimmer씨 등에 의해서 발표되었다. 그것이 「라이트 공간 투시 그림자 맵 기법」(LSPSM:Light Space Perspective Shadow Maps)이다.

LSPSM기법에서는 PSM기법이 최상의 상태를 얻을 수 있도록, 그림자맵 생성시의 좌표계를 조정하는 것으로, 상당히 기교적인 생각들이 들어가 있다.

조정 조건이란, 첫번째는, 「시점의 배후에 있는 3D오브젝트의 그림자가 시야에 들어오는 것과 같은 경우」에 대처하기 위해서, 그림자맵을 생성하는 범위(광원으로부터의 가상적인 시야)를 「그림자가 될 수 있는 모든 3D오브젝트를 포괄한다」처럼 조정하고, 또한 「시점으로부터의 시계(시추대 : View Frustum) 전체를 포함하도록 한다」라는 것.

조건의 두번째는, 「 가능한 PSM기법의 장점을 취하기 쉽도록 그림자맵을 생성하기 」위해서 적합한 좌표계를 구한다는 것. 이 적합한 좌표계란, PSM의 특징인 「 그림자 맵의 해상도가 시점에서 가까운 영역에 대해서는 세밀하고, 멀어지는 것에 따라 그에 맞게 한다 」…… 라고 하는 그림자 맵의 바이어스을 걸어 주는 방법을  일정하게 유지할 수 있는 좌표계이다. 이것은 「시점으로부터의 시계에 가능한한 가까울 것」(그림 참조) 이 조건이 된다.

V는 시점으로부터의 시계(시추대 : View Frustum).  L은 광원. 그림자 맵을 생성하기 위한 좌표계 P는, 이와 같이 「시선으로부터의 시계 V를 포함」「그림자를 떨어뜨릴 가능성이 있는 3D오브젝트를 모두 포함」, 또한 「시점으로부터의 시계에 가깝다」라고 하는 조건을 계산해서 구한다
실제의 그림자 맵("□" 로 둘러싸여 있는 부분)은, 이와같이 변형된 좌표계로 생성된다. 이 그림자 맵을 생성하기 위한 좌표계의 변형에 착안하고 있는 것만으로 기법으로서의 방침은 PSM과 같다고 할수 밖에 없다.

이 2개의 조건을 동시에 만족하는 좌표계로 그림자 맵을 생성하면, 나머지 처리는, PSM기법이나 깊이 그림자 기법과 같다.(계속)

 
통상의 깊이 그림자 기법. 앞의 그림자가 상당히 대충 그려져 있다.    이 때의 그림자 맵의 내용

 
 
PSM기법. 앞쪽의 그림자는 상당히 세밀하게 나와 있지만 뒤쪽의 그림자가 반대로 대충 그려져 있다.
    이 때의 그림자 맵의 내용


 
LSPSM기법. 앞의 그림자도 안쪽의 그림자도 양쪽 모두 정밀하게 나와 있다   이 때의 그림자 맵의 내용


개량형 깊이 그림자 기법 : Cascaded LSPSM



Cascaded LSPSM 기법 ~ 깊이 그림자 기법 개량판 그 3번째

LSPSM기법으로 깊이 그림자 기법의 약점을 많이 극복할 수 있지만, 그래도, 먼 곳까지가 그려지는 광대한 옥외 씬에서는, 역시 1장의 그림자맵으로 차폐구조를 생성하고 있기 때문에 해상도 부족 현상이 생겨 버리는 경우가 있다.

1장의 그림자맵으로 부족하다면, 복수의 그림자맵을 이용하면 어떨까 …… 라는 간결 분명한 개선책으로서 자연스럽게 생겨난 것이 「Cascaded LSPSM 기법」이다.

하나의 광원으로부터의 차폐구조를 기록하는데 복수의 그림자 맵을 이용하는 것인데, 복수의 그림자 맵을 어떻게 생성할 것인가가 이 기법의 포인트가 된다.

여러가지 방법을 생각할 수 있지만, 제일 알기 쉬운 것은, 시점으로부터의 시계(시추대: View Frusum)를 시점 위치에서 가까운 위치에서 먼 곳으로 향해서 적당하게 분할해서, 분할된 시계 각각에 대해, 앞에서 기술한LSPSM기법에서의 2개의 조건을 만족 시키는 좌표계에서 그림자 맵을 생성하면 된다.

개념적으로는 아래 그림과 같이 된다. 이 그림은 시야를 시점으로부터 근거리, 중거리, 원거리의 3단계로 분할하고, 각각 그림자 맵을 생성한다……라는 예를 나타낸 것이다.

                 Cascaded LSPSM의 개념도(cascade가 3개인 경우)

< 그림설명 >

광원、시점,시계(View Frustum)
(박스) 근거리 그림자맵 생성용 좌표계,
(박스) 중거리 그림자맵 생성용 좌표계,
(박스) 원거리 그림자맵 생성용 좌표계


3개로 분리한 각 시계(View Frustum)의 경계 부근이 서로 겹쳐져 있는 것을 알 수 있는데, 이 부분에 대한, 그림자맵은 중복해서 생성된다. 그런 의미에서는 이 방법은 다소 장황성이 있고, 그것이 불필요한 부하가 된다.

최종적으로 렌더링 할 때에는, 이 복수개로 생성한 그림자 맵을 나누어 사용함으로써 그림자를 생성하게 된다.

깊이 그림자 기법에서는, 어느 픽셀을 렌더링 할 때, 그 픽셀과 광원까지의 거리를 산출해, 이것과 그 픽셀에 대응하는 그림자 맵에 들어 있는 값과 비교를 한다. 어떤 픽셀을 렌더링 할 때 , 당연히, 깊이값(Z치)을 구하게 되므로, 이 깊이값을 키로 해서 복수 생성해 둔 그림자 맵으로부터, 어떤 것을 선택해 참조하면 좋을지를 결정한다.

덧붙여 어느 정도로 분할할지, 몇개로 분할할지……는, 그림자에 요구되는 퀄리티 레벨, 혹은 GPU의 처리 능력, 비디오 메모리의 용량등의 여러가지 조건에 따라 그때 그때 결정할 필요가 있다.(계속)

「로스트 플라넷」(캡콘)은 캐스케이드 LSPSM기법을 채용하고 있다. 로스트 플라넷에서는, 1024×1024 텍셀의 그림자 맵 3장을, 시점으로부터의 거리를 근중원(近中遠)으로 분리해서 생성하고 있다.
Character Wayne by (C)Lee Byung Hun/BH Entertainment CO., LTD, (C)CAPCOM CO., LTD. 2006, 2007 ALL RIGHTS RESERVED.
   
위 씬의 근거리 그림자 맵    같은 씬의 중거리 그림자 맵    같은 씬의 원거리 그림자 맵


개량형 깊이 그림자 기법 : Blurred Depth Shadow


Blurred Depth Shadow 기법 ~ 간편하게 소프트 그림자를 얻는다

깊이 그림자 기법의 약점은, 그림자 맵의 해상도가 불충분하면, 그림자에 Jaggies(artifacts, 윤곽 부분에 톱니모양이 생기는  현상)가 생겨 버리는 것이었다.

다른 것은 해상도가 높은데, 그림자에만 Jaggies가 생기는 것은 부자연스럽다. 그렇다고  비디오 메모리 사용 예산 때문에 그림자 맵의 용량을 마구 늘릴 수도 없는 경우가 있다.

그림자의 Jaggies가 눈에 띄는 것은 그림자의 윤곽 부근이므로, 그럼, 이 jaggies를 적극적으로 블러해서 지워 버리면 어떨까? 즉, 그림자 생성 기법 그 자체를 개량하는 것이 아니라, 생성된 그림자의 jaggies를 후처리(post-process)로 지우려는 아이디어이다.

「버추얼파이터5」(세가, 2006)에서. 깊이 그림자 기법을 그대로 구현해서 생성하면 이와같이 그림자에 보풀 같은 에일리어싱이 생겨 버린다 (가슴 근처에 주목)
(C)SEGA


이 테크닉의 경우, 그림자 생성 자체는 통상의 깊이 그림자 기법도 상관이 없다. 다만, 이 때, 그림자만 화면프레임과 똑같은 해상도의 텍스처에 생성한다. 이것으로 만들어 낼 수 있는 것은 화면상의 「음과 양」의 0 아니면 1의 2진값으로 된 화상텍스처이다.

깊이 그림자 기법으로 그림자 프레임을 생성.이 시점에서는 보풀이 일어나고 있다                  그 그림자 프레임을 blur한다

블러처리를 한 그림자프레임을 화면프레임과 합성한다. 앞서 나왔던 화상과 비교하면 그림자의 보풀들이 적어진 것을 알수있다.

이번에는 이 「음과 양」의 2진값 화상 텍스처를 바이리니어(Bilinear) 필터를 사용한 축소버퍼나 가우스필터등을 사용해서 블러해 버린다. 이렇게 함으로써, 그림자의 상세정보는 잃게 되지만, 그 대신 그림자의 윤곽의 Jaggies는 줄어든다.

그리고는, 평범하게 각종 셰이더를 동작 시켜 렌더링한 통상의 화면용 프레임과 이 블러해서 만들어진 그림자 프레임을 합성해서 완성한다.

이러한 희미한 그림자 표현은 「소프트 쉐도우 표현」(Soft Shadow)이라고 불린다.

현실 세계에서도 그림자가 선명하게 나오는 것은 드물기 때문에 약간 흐려진 것이 리얼하게 보인다. 그래서, 이 테크닉은 Jaggies도 사라지고 리얼하게 보여 일석이조의 방법이라고 할 수 있다.

그러나 현실 세계에서 그림자가 흐린 것은, 그림자 자체의 투사 거리가 길 때에 빛의 산란에 의해서 그림자 둘레에 빛이 들어와 버리는 것에 의한 것이거나, 혹은 빛을 만들어 내는 광원 자체에 크기가 있어서 흐린 경우도 있고, 그 원인은 여러가지이다. 이 테크닉에서는, 그림자의 블러 처리를 이차원적인 …… 정확히 말해 스크린 좌표계에서 해 버리기 때문에, 그림자의 블러처리 방법은 물리량적으로는 올바르지는 않다.

                                        소프트쉐도우

< 그림설명>

(점)광원、선광원이나 면광원、산란광、환경광、그림자영역、
반영(소프트쉐도우)、본영(하드쉐도우)
(버블) 엣지가 뭉개진다.

본영(本影): 빛이 전혀 닿지 않는 영역
반영(半影): 빛의 일부가 닿는 영역

그렇다고는 해도, 비교적 단순한 구현으로 보기 싫은 Jaggies를 지울 수 있고, 소프트 그림자의 효과를 얻을 수 있는 것은 효과가 크다.

단, 이 테크닉에는 약간 문제가 있다.

이 테크닉에서는 그림자를 블러할 때의 처리를 이차원적으로 해 버리기 때문에, 이 블러처리를 한 그림자를 합성하면, 흐리게 처리된 그림자 엣지가, 3D그래픽스의 전후관계를 무시하고 흘러나와 버린다.

예를 들면, 뒤쪽의 블러처리된 그림자 부분이 앞의 3D오브젝트의 밝은 부분에 흘러 들어와 버리거나 한다.

이것을 개선하는 아이디어 또한 몇개정도 있기는 있다.

예를 들면 그림자 프레임의 블러처리를 씬의 깊이값을 보고서, 씬의 전후관계를 고려하면서 한다는 것이 하나이고 또는 블러처리 때, 어느 깊이값의 그림자인가 …… 에 해당하는 정보를 블러처리한 그림자 프레임에도 저장해서, 이것을 합성시에 고려하는 것도 괜찮을 것이다.

또한, 그림자 맵의 해상도가 너무 낮으면, 아무리 그림자 프레임을 희미하게 한다고도 해도 Jaggies를 지우지는 못한다. 이 테크닉을 사용하는 경우에는, 「그림자 맵의 해상도」와「어느 정도 블러처리를 할까」의 조정을 신중하게  할 필요가 있다. 비교적 시점이 모이거나 멀어지거나 하는 3D게임에서는, 일정한 그림자 맵 해상도나 일정한 블러량에서는 「거칠어짐」이 눈에 띄어 버리는 경우가 있을 지도 모른다. 비교적 시점 위치가 안정되어 있는 삼인칭 시점의 액션 게임이나 실시간 전략게임, RPG 같은 3D게임에는 상성(相性)이 잘 맞을 지도 모르겠다.(계속)




개량형 깊이 그림자 기법 : VSM

분산 그림자 맵 기법 ~ 효율적으로 소프트 그림자를 얻는다

깊이 그림자 기법의 그림자의 Jaggies를 블러처리해서 소프트 그림자를 표현 하려는 아이디어는 이외에도 있다.

최근에, 갑자기 채용하는 예가 많아지고 있는 것이 「 분산 그림자 맵 기법 」(VSM:Variance Shadow Maps)이다.

VSM 기법에서도, 그림자 맵을 생성하는 부분은 깊이 그림자 기법과 같다. (그야말로 PSM,LSPSM 기법으로 생성해도 된다). 다만, 실제의 최종씬의 픽셀을 그릴 때, 그림자인지 아닌지의 판정에서, 약간 특수한 계산을 실행하기 때문에, 그림자맵은 부동 소수점 텍스처를 사용한다. 게다가 그림자 맵을 생성할 때에, 광원에서 차폐물까지의 깊이값 뿐만이 아니라, 그 깊이값의 제곱값도 저장한다. 따라서, 한개의 성분값만 저장할 수 없는 1성분 텍스처가 아닌, 일반적인 αRGB로 나타내는 복수성분으로 된 컬러 텍스처 포맷으로 할 필요가 있다.

마지막에 시점에서 바라 본 씬을 그릴 때, 그릴 각 픽셀에 대해서, 그 픽셀로부터 광원까지의 거리를 구하고, 그림자맵으로 부터 그 픽셀과 대응하는 광원과 차폐물까지의 거리를 비교해, 「 그림자인지 아닌지 」의 판정하는 것까지는 같다.

가장 큰 차이는, 이 「그림자인가 아닌가」의 판정에 확률론에서 자주 사용되는 「체비쇼프 부등식」(Chebyshev's inequality)이라 불리는 방정식을 사용하는 것이다.

통상의 깊이 그림자 기법에서는, 「 그림자인지 아닌지 」의 YES OR NO의 2진값 판정을 하지만, VSM 기법에서는 여기서 「체비쇼프 부등식」을 사용해 「빛이 비칠 최대 확률」을 계산해 내는 것이다. 3D그래픽스에 확률론의 방정식을 가져오는 것이 독특하다. 이 그림자인지 아닌지를 판정한 결과인 최대확률은 0~1로 표시되기 때문에, 이 값을 그대로 그림자의 색(≒그림자의 농도)으로서 이용할 수 있다.

통상의 깊이그림자 기법에서 그림자 영역의 윤곽에 Jaggies가 나오기 쉬운 이유는, 이곳에서의 「그림자인가 아닌가의 판정」이 어려운데도 「그림자(0)인가? 빛이 닿고 있는(1)인가?」의  2가지 선택만으로 해 버리기 때문이다. 여기를 확률, 즉 실수로 나타낼 수 있게 되기 때문에 부드럽게 할 수 있다. 그림자의 본체에 가까우면 가까울수록 그림자의 확률은 높아져 그림자는 진해지고, 멀면 멀어질수록 그림자의 확률은 낮아져 연해진다 …… 라고 하는 이미지다. 이와 같이 그림자의 윤곽 부근이 부드럽게 된다 …… 라고 하는 것은  정확히 소프트 쉐도우 표현이 된다. 물론, 물리적으로 올바른 결과의 소프트 쉐도우는 아니지만, 시각적으로는 강한 설득력이 있다.
통상의 깊이 그림자 기법(Shadow Map)과 VSM(Variance Shadow Map) 기법의 비교

그런데, 체비쇼프 부등식은 이렇게 나타낸다.

이것은, " 분산 σ2과 평균값 E(x)이 있을 때 「 x ≥ t 」일 때의 확률 P()의 최대값은 이렇게 계산된다" 라는 것을 나타낸 수식이다.

깊이 그림자 기법에서, 「그림자 맵에 기록되어 있는 값(차폐물에서 광원까지의 거리)」>「렌더링 하려는 픽셀의 광원까지의 거리」가 된 곳은 빛이 닿고 있다고 판단한다.

거기서, 구하고 싶은 확률 「P(x≥t)」에서 , t를 「렌더링 하려는 픽셀의 광원까지의 거리」로 하고 이 부등식을 사용하면, 확률 P(x≥t)는 빛이 비치고 있을 확률을 구하는 것이 된다.

분산 σ2는 아래와 같이 표시되고, 평균값 E(x)는 그림자 맵에 기록된 값을 사용해 계산한다.

이 기법은 그대로 사용해도, 그림자의 엣지가 부드러워지지만, 생성한 그림자 맵에 대해서 블러를 걸어 주면, 한층 더 그림자 경계가 부드러워진다. 다만, 이 블러를 극단적으로 걸면, 그림자의 윤곽이 서로 겹치는 곳에서, 빛이 새어 나오고 있는 것 같은 "줄기(筋)" 가 생겨 버린다. 그림자 맵에 블러를 거는 방법은, 이 "줄기"가 나오는 것을 의식하면서 조정할 필요가 있다.

그런데, 이 VSM 기법은, 「그림자인지 아닌지의 판정」에 대한 연구가 핵심인 기법이기 때문에, 앞에서 기술한 PSM, LSPSM, Cascaded LSPSM라는 그림자맵 생성에 대한 기법들과 조합해 사용할 수도 있다. 가까운 곳에서 먼 곳까지는 고품질로, 거기에 소프트 그림자까지 넣고 싶을 때는, 그런 하이브리드(hybrid) 기법을 활용하면 좋을 것이다.

VSM 기법의 대표격이라고 하면 Unreal Engine 3.0이 있다. 화면은 UE3 기반의 게임 「Gears of War」(EPIC GAMES,2006)의 화면


 

Posted by 노을삼킨별
,