아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/표면下%20산란과%20스킨표현

2009-04-17 19:25:10
ハーフライフ2の方法はあくまで簡易的でそれらしく見せるための工夫であった。実際の人間の皮膚の陰影は、表皮に当たった光が単純に反射したり拡散したりするだけで決まらない。入射した光は表皮で反射、拡散するだ ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.


하프 라이프2의 방법은 어디까지나 간이적이고 그럴 듯하게만 보이기 위한 방법이였다.

실제의 인간의 피부 음영은, 표피에 닿은 빛의 단순한 반사나 확산만으로 결정되지는 않는다. 들어온 빛은 표피에서 반사, 확산할 뿐만 아니라, 피부 밑으로 침투해 피부 밑에서 난반사해서 다시 표피로부터 튀어 나오는 것도 있다. 피부 음영은 매우 복잡한 빛의 경로들이 모여서 이루어진다(집대성된다).

이 빛이 피부 밑에서 산란하는 현상을「피하 산란」(皮下算亂, Subskin Scattering)이라 하고, 이렇게 반투명 물체에 빛이 들어와 내부에서 산란하고 나서 (다시) 튀어 나오는 일반적인 현상을「표면하 산란」(表面下 散亂, Subsurface Scattering)이라고 한다.

또, 인간의 피부의 음영 처리용으로 특별하게 설계된 셰이더를「스킨 셰이더」라고 부르고, 이 스킨 셰이더의 구현에는 표면하 산란에 대한 몇가지 구현은 불가피하다고 말하여 진다.

덧붙여, 지난회까지 소개한 하프 램버트 라이팅과 경면반사 분포의 조정에 의한 의사적인 피부 표현은, 피하 산란은 무시하고 있지만, 피부 표현용으로 튜닝했다는 점에서 광의적으로는 스킨셰이더라 해도 틀리지는 않을 것이다.

표피에서의 반사, 피하에서의 산란

표면하 산란을 정식으로 구현한 피부 음영처리는 매우 복잡할 것이라고 생각되어 진다.

하지만, 요소 하나하나를 나누어서 생각해, 각각의 요소를 근사모델이나 간이적으로 재현해 나가면 어떤식으로든 실현될 수 있을지도 모른다. NVIDIA는 이런 생각을 가지고, GeForce 8800 시리즈 데모인 「Adrianne」의 스킨셰이더 개발을 시작했다고 한다.

그런데, 피부는 대략적으로 생각하면, 밑그림과 같이 얇은 지방질, 표피, 진피라는 층들로 나누어진다.

                                              인간의 피부 단면도

<그림 설명>
피부의 층
좌:
얇은 지방질층,
표피,
진피,
우:
지방질,
표피,
지극히 작은 사이즈


측정에 의하면 입사한 빛의 6%까지가 지방질층까지에서 반사가 되고, 나머지 94%는 피하(皮下)의 영향을 받는다고 한다.

대략적으로, 피부의 최표층(最表層)에서의 반사와 피부 밑에서의 산란 2개의 처리로 나누어 생각하면 구현 가능하지 않을까? 라고 생각되어 진다.

                              피하(皮下) 산란의 개념도

지방질층에서의 반사

우선은 지방질층까지에서 일어나는 반사에 대해서 생각해 본다.

지방질층에서의 반사 음영 처리는, 실시간 3D그래픽스에서는, 퐁(Phong)쉐이딩이나 블린(Bling, 블린-퐁)셰이딩이라고 하는 반사 방정식을 이용하는 것이 일반적이다.

그러나, NVIDIA에 의하면, 피부면을 수평적으로 보는 경우에 하이라이트가 나오는 모습이, 블린 셰이딩이나 퐁 셰이딩에서는, 피부의 실물과는 많이 다르기 때문에,「피부의 표현에는 적합하지 않다」라고 하고 있다.

거기서, NVIDIA가 선택한 것은 Csaba Kelemen, Laszlo Szirmay-Kalos등이 2001년에 발표한 「A  Microfa cet Based Coupled Specular-Matte BRDF Model with Importance Sampling」논문의 베이스인 KS BRDF방법이다. KS는 Kelemen과 Szirmay-Kalos의 머리글자이고, BRDF는 Bidirectional Reflectance Distribution Function의 약어로, 일본어 번역에서는 쌍방향 반사율 분포 함수가 된다.

BRDF라는 것은 간단하게 말하면, 빛이 어떻게 반사할지를 광학 현상에 따라서 일반화한 것이다. BRDF의 실제 구현방법으로서는 「어떻게 반사할까?」를 하나의 방정식으로 나타내는 것이 곤란한 경우에는, 측정기를 사용해 측정해서 데이터 테이블(텍스처 데이터)을 작성하고, 이것을 렌더링 시에 참조해서 음영 계산에 이용하는 방법을 자주 볼 수 있다. NVIDIA가 구현한 경면반사의 BRDF는 표면에 매우 미세한 요철을 가진 재질의 표현에 적합한 베크만 분포(Beckmann Distribution)이고, 계산 부하 절감을 위해서 베크만 분포를 사전에 계산해서 텍스처 데이터로 넣고 있다.

빛과 3D모델의 위치관계는 동일하고, 보는 위치를 바꾸었을 경우의 퐁 셰이딩과 KS BRDF법을 비교한 그림. 정면에서 보았을 경우(상단)는 별로 차이가 없지만, 하이라이트가 나오는 면을 옆에서 보았을 경우(하단)는  분명하게 하이라이트의 모습이 다르다. KS BRDF 쪽이 (더) 리얼하다

결국, NVIDIA의 구현에서는, 피부 표면의 음영 계산에 법선벡터(N), 시선 벡터(V), 광원 벡터(L)의 3대요소  외에, 경면반사 강도(ρs), 면의 거친 정도(m), 굴절률(η)을 고려해 준다.

ρs와 m은 앞절에서도 등장했는데, 경면반사 강도(ρs)는 하이라이트의 강도에 해당하고, 면의 거친정도(m)는 초미세면의 기울기를 나타낸다. 감각적이로는 미세면의 기울기 값이 작을 수록 하이라이트가 좁고 날카로워지는 경향이 있다. 굴절률 η은 뒤에서 기술할 프레넬 반사의 계산에 사용된다.

ρs와 m은 앞절에서 소개한 「Analysis of Human Faces using a Measurement-Based Skin Reflectance Model」(Tim Weyrich, SIGGRAPH 2006)에서의 얼굴의 10개의 영역에 대한 측정 정보를 참고하면 되겠지만, NVIDIA의 구현에서는, 상당히 대략적으로 이 측정 결과로부터 적당하게 구한 평균값, (각각) ρs = 0.18, m = 0.3 이라는 정수(定數, 상수)을 사용했다고 한다.

왼쪽이 경면반사 강도 ρs의 분포 텍스처,
오른쪽이 면의 거칠기 m의 분포 텍스처

왼쪽이 적당하게 설정한 평균치를 이용한 정수(定數) ρs, m에 의한 결과. 오른쪽은 측정치 베이스의 ρs, m의 분포 텍스처를 사용한 결과. NVIDIA의BRDF 베이스 구현에서는 별로 큰 차이는 없다고 판단했다

<그림 설명>
상:
(좌) Specular량
(우) 거친 정도, m
하:
(좌) 일정한 거칠기, m = 0.3
(우) 「Weyrich et al. 2006」논문으로부터 측정된 값

프레넬 반사는, 이 연재에서는 수면편(水面編)에서 해설했지만, 한번더 간단히 개념을 복습하면, 수면이 보이는 방식으로 이야기를 하면, 「수면 상에 비치는 영상과 물밑의 보이는 상태를 조정하는 것」이라고 하는 처리에 해당된다. 일반적으로는 입사 한 빛이 시선에 대해서 어떤 각도일 때에 얼마나 반사할까/굴절할까를 표현한 것이다.

사람의 얼굴에서도 빛과 시선의 각도 관계에 의해서 하이라이트가 나오는 상태가 다르므로 이것을 고려하자고 하는 것이다. 이 계산에는 굴절률 η이 크게 관련된다, 실제의 인간의 얼굴에서는 사람에 따라서, 부위에 따라서도 다르다고 한다. NVIDIA의 구현에서는 전체의 평균으로  η=1.4 (법선 입사 일때 반사율로는 0.028)을 사용했다고 한다. 좀더 자세히 말하면, 프레넬 반사의 방정식은 정의 그대로가 아니라, 자주 이용되는 프레넬 반사의 고속 근사형인 Schlick 근사식을 사용하고 있다.

왼쪽이 정의 그대로의 프레넬 반사 계산을 실시한 결과. 오른쪽이 Schlick의 프레넬 근사 계산에 의한 결과.

또한, 산출한 하이라이트의 색은, 얼굴의 화상 텍스처의 색을 고려할 필요는 없고 광원색 그대로도 괜찮다고 한다. 즉, 광원이 흰색광이라면 하이라이트는 밝은 피부색이 아니라, 그냥 흰색으로 해도 괜찮다는 것이다.(계속)




피하(皮下)에서의 빛의 산란을 어떻게 다루어야 하는가?

그러면 나머지 94%, 즉, 피하 산란에 대해서는 어떻게 할것인가? 이것에 대해서는 지방질층에서의 반사와는 완전히 다른 접근방법을 취할 필요가 있다.

빛이 피부 밑으로 어떤 식으로 이동했는지를 고려하지 않으면 안되고, 그것을 한가지 의미로만 구하는 것은 곤란하다. 지금 그릴려고 하는 피부의 픽셀이 다른 위치로부터 입사한 빛의 산란빛을 포함하고 있을지도 모르고, 반대로 여기에 입사하고 있는 빛이 흡수되고 있는 영향도 생각하지 않으면 안된다. 온전히 서로 배합되어 있어서는 실시간으로 계산하는 것은 우선 무리이다.

거기서, 이 어려운 계산을 간략 근사화하는 접근법을 생각한다.

우선「빛이 산란해 다시 나올 때까지의 평균 거리는 어느 정도인가?」「빛이 흡수되어 버리는 평균 빈도는 어느 정도인가?」라는 것만 주목하기로 한다.

그런데, 입사광의 약10%는, 실은 최초의 지방질층을 돌파하지만, 이 시점에서 빛의 지향성(指向性)은 잃어버려서  확산광으로 되어 버린다. 그리고, 그 나머지 빛은, 앞에서 기술한 것 처럼 KS BRDF와 프레넬 반사를 고려한 반사광이였거나, 혹은 지방질을 지나 표피에 도달한 시점까지에서 (모두) 흡수되어 버린다.

결국, 이 지방질을  빠져 나온 10%의 확산광에 대해서만 피하 산란을 생각해주면 된다는 것이다. 그렇다면, 이것은, 단순하게 입사광에 대해 확산 반사의 음영 처리를 실시해서, 화상의 피부 텍스처와 곱하고, 앞에서의 KS BRDF + 프레넬 반사의 결과와 합성하기만 하면 되는 것이 아닐까?

실은, 이것에 상당하는 구현을 한 것이 앞절의 하프 라이프2의 피부 표현이다.

이것으로도, 그럭저럭 괜찮지만, 다만, 상당히 건조한 느낌으로 보여 버린다.

KS BRDF + 후레넬 반사의 결과 + 확산 반사 × 화상텍스처이면 이렇게 된다. 이것은 실은 하프 라이프2식 스킨셰이더와 거의 같다. 약간 건조한 느낌으로 보여 버린다

이 건조한 느낌이 들어 버리는 것은 잘 생각해 보면 어쩌면 당연한 일이다.

어떤 픽셀을 주목해서 보면, 여기에서 나오는 확산빛은 그 픽셀에 입사한 빛만 확산한 것이 아니다. 인접하는 다른 픽셀에 입사 한 빛이 피부내에서 산란해서 나온 확산빛도 포함되어지기 때문이다.

그렇다, 이것이 피부의 촉촉한 투명감 표현과 깊은 관계가 있는 것이다. 그럼 어떻게 하면 좋을까?

NVIDIA가 인용한 것은 Craig Donner, Henrik Wann등이 SIGGRAPH 2005에서 발표한 「Light Diffusion in Multi-Layered Translucent Materials」라고 하는 논문에서의 방법이다.

이 논문에서는 「3층의 피부 모델」이라고 하는 개념을 채용해, 의료 업계, 광학 업계에서 측정된 산란 파라미터를 이용해, 3D모델의 디지타이즈 서비스 기업인 XYZRGB회사의 고정밀도 두부(頭部)모델을 활용해서, 몇분의 렌더링 시간으로 리얼한 얼굴을 렌더링하는 기술을 발표하고 있다.

NVIDIA가 이 논문에서 주목한 점은, 피부의 광산란은 단층이 아닌 복수층으로서 처리하는 것이 리얼하게 보인다라고 하는 부분이다.

단층의 광산란은 대리석이나 납과 같은 것을 표현 할 때는 그 나름대로 효과가 높지만, 다른 산란 파라미터를 가진 복수층으로 된 재질에 대해서는 결과가 별로이다. 인간의 피부는 앞에서 나왔던 단면도를 봐도 알수 있듯이 지방질층, 표피층, 진피층이라는 3층으로 되어있다. 이것에 의해서 깊게 침투한 빛은 감퇴 하면서도 광범위하게 산란하는 경향이 있다. 이것이 피부의 리얼한 광산란 표현의 중대한 포인트가 되는 것이다……라고 NVIDIA는 주목한 것이다.(계속)

왼쪽이 단층의 피부 모델로 렌더링 한 결과. 오른쪽이 3층의 피부 모델로 렌더링 한 결과. 왼쪽은 약간 납인형과 같이 보여 버린다.



reserved.


결국, 음영 처리를 하는 것은 얼굴 모델의 표면 폴리곤 상의 픽셀 뿐이기 때문에, 거기서, 어느 점에 입사(入射) 한 빛이, 그 주변에 대해서 어떤 확산광이 되어서 돌아오는지를 조사해 본다.

이것은, 하나의 광선을 피부에 수직으로 조사(照射)했을 때에 그 조사점(照射点)으로 부터의 반경 r에서는 어떤색의 빛이 어느 정도의 밝기가 되어 있는지를 구해서 계측(計測)한다. 이 결과를 특히 「반사율 확산 프로파일」(RDP: Reflectance Diffusion Profile)이라고 부른다.

피부에 비춘 한개의 광선이 피부 밑에서 어떻게 산란해서 나오는지 그 분포를  측정한다

<그림 설명>
집속(集束)한 입사 광선
거리 r에서의 확산은 어느정도일까?

실제의 계측 모습. 전방위(全方位)로 같은 결과를 얻을 수 있다고 가정하고 있기 때문에 계측기는 일차원(선분) 모양의 센서로 되어 있다.「Analysis of Human Faces using a Measurement-Based Skin Reflectance Model」(Tim  Weyrich, SIGGRAPH 2006)로 부터.


아래의 그림은 「반사율 확산 프로파일」(RDP:Reflectance Diffusion Profile)을 그래프화한 것이다. 세로축이 반사율(출사광의 휘도), 가로축이 빛을 조사한 위치로부터의 거리를 나타낸다. 즉 멀리 가면 갈수록 빨간색이 강하게 남는 것을 의미하고 있다. 여기에서는 특히 빛의 빨강(R), 파랑(B), 녹색(G)에서의 반경과 반사율의 관계는 완전히 다르게 된다는 점에 주목해 두고 싶다.

「반사율 확산 프로파일」(RDP:Reflectance Diffusion Profile)을 그래프화한 것

<그림 설명>
반사율
반경 방향 거리

「반사율 확산 프로파일」(RDP)을 이차원 평면 상에 가시화한 것

필터 지름을 달리하면서 가우스 블러를 여러번 실시해 복수층에 의한 광산란을 근사적으로 구현

표피상의 모든 픽셀이 이 RDP에 따라 피하 산란을 하고 돌아온다고 가정해 주면, 복잡한 피하 산란을 이것으로 간이적으로 구현할 수 있는 것 아닐까?

그러나, 이 논리가 잘 맞는 것은, 그 표피면 픽셀에 빛을 수직으로 비쳤을 때 뿐이다. 하지만, 만일, 이 조건을 사용할수만 있다면, 피하 산란은 모든 표피 픽셀에 대해서, 이 RDP에 따라 블러를 해주면 된다.

표피면에 수직으로 들어가는 빛이라는 것은, 엄밀하게는 구할 수 없지만, 그래도 대부분은 지방질층을 빠져 나온 확산광이라고는 말할 수 있다. 이것은 결국, 확산반사의 음영처리를 해서 일반적인 화상 텍스쳐 매핑을 해준 결과라고 가정할 수 있는  것이다.

그리고 RDP에 따른 블러는, 각 안면 상의 픽셀에 대해서 균등하게 실시할 필요가 있다. 이 블러를 실행하기 위해서는, 조금 변형된 프로세스를 취한다.

픽셀 음영 처리(실제의 렌더링) 계산은 3D실공간에서 하지만, 그 출력(그려져 나오는)은, 그 3D모델의 가죽을 절개해 2D종이에 붙인 것 같은 좌표계에서 하는 것이다. 입체를 종이에 전사(轉寫) 하는…… 이미지적으로는 어탁(魚拓), 혹은 지구의 지도와 같은 느낌이다.

확산반사 계산과 화상 텍스처링은 3D공간상에서 실시하지만, 렌더링 결과를 이처럼 3D모델을 절개한 것 같은 2D공간 상에 한다


이것을, 이번은 2D좌표계(텍스처 좌표계)에서, RDP에 따르는 형태로 블러해 주는 것이다. 이것으로 아직 작은 문제는 남지만 표피는 피하 산란한 음영 결과에 가까워진다.

텍스처 좌표계에서, 평면으로서 RDP에 따라 블러를 해 준다


이대로는 단순한 어탁과 같은 화상이므로, 이번에는 이것을 3D모델에 제대로 다시 텍스쳐 매핑해 준다. 이것으로 피하 산란 라이팅을 종료한 얼굴 모델이 완성된다. 다만, 단순히 블러하는 것만으로는 불충분하고, 그 블러를 하는 방법에는 좀더 생각이 필요하다.

왜냐하면 전단락에서 다룬 RDP를 한번 더 보면 알겠지만, 산란하는 방식이 빛의 RGB 각 성분에 따라서 (서로) 다르기 때문이다. 그 때문에, 각 블러의 반경마다, RGB의 각 성분들을 서로 다른 감쇠율로 블러해서, 그것들을 모두 합성해 줄 필요가 있는 것이다.

NVIDIA의 구현에서는 블러 처리는 가우스블러 (가우스필터)를 사용했고, 가우스 필터의 특성을 활용해서 좌우로 한번, 상하로 한번, 즉 2회로 나누어 하는 방법을 사용했다. 또한 그 블러 시에는 각 RGB 마다 가중치을 붙이고, 또한 블러의 반경을 바꾸어 주면서, 총 6회 실시하고 있다 . 이것이 이전회의「복수층」개념을 재현한 것에 해당되는 것이다.

텍스처 좌표계에서의 블러의 개념도. 가우스 블러(가우스 필터)는 좌우와 상하로 2회로 나누어 하는 것이 특징으로, GPU용 처리라고 할 수 있다(여기의 영상의 결과는 어디까지나 개념 설명을 위한 예이고, 실제의 블러의 결과와는 다르다)

<그림 설명>
블러 가중치 붙임
좌우방향의 블러(↓),
일시적인 버퍼,
상하방향의 블러(→),
최종버퍼에서 사용한 텍스처
다른 블러 세팅을 구축해서 몇회정도 반복한다(↖)

블러의 반경 마다 다르게 RGB 각각에 가중치를 붙여 가우스블러를 6회 실시하고 있다. 이 표는 RDP에 따라 생성된 가우스 필터의 지름 마다의 RGB 가중치 계수. 상단이 중심부에 해당되고, 하단으로 갈수록 외곽 부분. 외곽 일수록 빨간색 성분이 강하게 남는 RDP를 이 표로부터도 확인할 수 있다

<그림 설명>
(좌~우) 블러 폭(mm),
블러의 가중치 적용,  빨강(Red), 녹색(Green), 파랑색(Blue),
최종 리니어(linear) 합성

다른 필터지름으로 6회 블러했을 때의 각각의 결과. 맨 좌측이 가장 좁고, 맨 우측이 가장 넓다. 맨 좌측이 앞 표의 최상단의 가중치 계수로 블러한 결과이고, 맨 우측이 표의 최하단의 가중치 계수로 블러 한 것이다

블러를 하지 않은 원래 화상과 6매 분량의 블러 결과들을 모두 합성한 것


피하 산란 블러에 의해 생성된 복수의 블러 결과는 리니어(linear)로 합성된다. 이 합성 결과가 피하 산란 성분이며, 이것을 한번 더 3D모델에 대해서, 맨처음 구한 지방질층에서의 반사의 결과(KS BRDF+프레넬 반사)와 함께 텍스쳐 매핑을 적용하면 완성이 된다.(계속)

여기까지의 프로세스의 흐름도. 좌하(左下)의 스트레치 보정에 대해서는 뒤에 서술

<그림 설명>
시작 -> 블러 -> 블러 -> .... -> 블러
리니어 합성
텍스처 매핑
최종패스: blur + specular 합성
좌하:
맵에 스트레치를 건다



텍스처 좌표계에서 블러 시킨 것에 의한 폐해(1)~ 왜곡

텍스처 좌표계……즉, 이차원 공간에서 일률적으로 블러 해 버리면, 3D공간 상에서 (깊숙한) 안쪽이 되는 부분은 넓고 강하게 블러되어 버린다. 아래의 그림의 흰"□"들은 이차원상에서는 서로 같은 크기이지만, 3D실공간 상에서는 귀가 더 안쪽에 있기 위해서 더 작아지므로 이것을 앞의 코와 같은 지름으로 블러해 버리면 지나치게 강하게 블러되 버린다. 즉 지나친 피하 산란이 일어나게 된다.

코끝의 "□"과 귀 부분의 "□"과는, 텍스처 좌표계에서는 같은 크기이지만, 3D실공간상에서는 귀가 더 깊숙한 안쪽에 있기 위해서 더 작아진다. 이것을 앞의 코와 같은 필터지름으로 블러 해 버리면 지나치게 강하게 블러되 버린다. 즉 지나치게 피하산란해 버린 것이 된다.

<그림 설명>
균일한 블러, 왜곡을 보정한 블러


이것은 텍스처 좌표인 U,V 좌표계와 실3D공간과의 어긋남에서 오는 일그러짐이다. 보다 올바른 광산란을 얻기 위해서는, 이 일그러짐에 대한 보정을 생각해 주지 않으면 안 된다.

이것에 대해서는, 미리, 텍스처 좌표와 실3D공간과의 어긋남의 정도를 사전에 계산해서 텍스처 데이터(일그러짐 보정맵)로 가지고 있다가, 텍스처 좌표계에서의 블러 처리 시에, 이 어긋나는 정도를 블러 반경의 스케일값(축소율)으로 이용하면 된다.

사전 계산으로 깊이 정보로부터 계산한 스트레치 보정 계수(스케일값)를 저장한 텍스처를 준비해 둔다. 이 그림의 좌상이 옆(U)방향의 일그러짐 보정맵, 좌하가 세로(V)방향의 일그러짐 보정맵. 가로 방향의 가우스 블러를 걸 때는 전자를, 세로 방향일 때에는 후자를 참조한다

격자 모양으로 어느 정도 일그러짐의 보정이 걸려 있는지를 검증한 결과(상단과 하단에서 블러 지름이 서로 다르다). 좌측이 스트레치 보정을 하지 않았던 경우의 결과, 우측이 스트레치 보정을 해준 경우의 결과

텍스처 좌표계에서 블러 시킨 것에 의한 폐해(2)~ 연결선(Seam)

텍스처 좌표계에서 가우스 블러를 하면, 텍스처의 경계 부분에 텍스처 메모리상의 초기화색(검은색)이 스며들어 와 버려, 최종 렌더링 결과에서 텍스처의 경계선이 「연결선」으로 가시화 되는 문제가 발생한다.

이것에 대해서 NVIDIA에서는 몇가지 해결의 방법이 있다고 하고 있다.

예를 들면, 앞의 일그러짐 보정맵을 수정해 윤곽 부근에서는 특별한 값을 넣어 초기화색을 참조하지 않게 하는 방법을 고안하거나, 혹은 블러 대상인 원래 텍스처의 α채널을, 엣지 부근인지 아닌지의 플래그적으로 활용하는 아이디어도 있다. 이것은, NVIDIA의 「Adrianne」와「Froggy」의 2개의 데모에서 문제없이 잘 적용되었다고 한다. 다만, 픽셀셰이더에서의 조건 분기 처리가 필요하게 되어 퍼포먼스 임펙트는 작지가 않다.

블러 대상인 원래의 텍스처는 이와 같이 출력되고 있다.

 

이 때문에 텍스처 좌표계에서 단지 블러 해 준것 만으로는 텍스처의 초기화색이 블러 처리에 의해 안으로 스며들어 와 버려, 3D모델에 텍스쳐 매핑 했을 때에 「연결선」이 드러나 버린다.

  가장 간이적인 구현으로서는, 그 텍스처의
  초기화색을 피부의 평균색으로서 해 버리는
  방법도 있다. NVIDIA에 의하면 이것으로도
  충분히 효과가 있다고 한다.

텍스처 좌표계에서 블러 시킨 것에 의한 폐해(3)~ 디테일의 소실

피하 산란 블러의 원(元) 텍스처는, 3D모델에 대해서 확산반사의 음영처리를 실행해서, 화상 텍스처맵을 적용해, 이것을 텍스처 평면에 그려낸 것이다.

문제는 피부의 모양이나, 미세 요철을 기록한 법선 맵의 음영처리(범프매핑) 결과를 어떻게 해 줄까?……라는 점이다.

범프매핑까지 적용하고 텍스처 평면에 렌더링 해서, 이것에 피하산란 블러처리를 적용해 버리면, 이 범프매핑에 의한 미세 요철의 음영이 얇아져 버린다.

그러면, 반대로,「초기의 확산반사 라이팅과 피하산란 블러처리」, 「화상 텍스처 처리, 법선맵 처리」를 각각 분리해서 실행하는 방법은 어떨까? 즉, 3D얼굴 모델의 라이팅에서는 확산반사의 음영 처리만 해주고, 이것을 텍스처 평면에 그려 내고, 이것에 대해서 피하산란 블러를 실시해서, 그 결과에, 화상 텍스처나 법선맵을 곱해서 합성해주는 방법이다.

그러나, 이 방법에서는 미세 요철이나 주름이 너무 강하게 남아 버려 , 피하 산란 블러에 의한 촉촉한 라이팅과의 상성이 안맞아 부자연스럽게 보여 버리는 경우가 많다고 한다.

정지화면 사진에서는 이해하기 어렵지만, 가장 먼저 확산 반사 성분만을 피하산란 블러를 시켜 나중에 텍스처 처리를 실시하면 디테일이 너무 남는 경향이 있다

NVIDIA에 의하면 이 방법은, 사진등으로 부터 작성한 텍스처와는 상성(相性)이 좋다고 한다. 이것은 사진 베이스의 피부 텍스처는 피부의 살결이나 주름의 미세 요철이, 촬영 시점에서 피하 산란을 하고 있기 때문에 적당히 희미해져 있어서, 피하산란 블러의 결과와 상성이 잘 맞기 때문인 듯 하다.

그러면, 적당히 디테일을 남기고, 적당히 디테일을 잃는 그런 방법이 좋은 것이 아닐까? 그래서, NVIDIA는 중간적인 방법을 고안 했다.

처음의 피하 산란 블러에 이용하기 위한 텍스처를 작성하는 단계에서는, 확산반사의 라이팅을 보통으로 하는 경우와, 이것과 텍스처색을 곱하는 단계에서는 텍스처 색을 감쇠 시켜서 실시해 준다. 그리고, 이 피하 산란 블러의 결과에 대해서 다시 한번, 감쇠 시킨 텍스처 색을 곱해 준다. 피하 산란 블러의 전후에 감쇠 시킨 텍스처 처리를 해준다고 하는 그런 이미지다.

연산의 관점에서 보면 텍스처 색이 2회 곱해지게 되므로, 이 감퇴의 시키는 방법이 중요하게 된다. 예를 들면 앞단계(피하 산란 블러 전)에서 절반하고, 뒷단계(피하 산란 블러)에서 절반해서,  단지 1/2로는 1/2×1/2 로 1/4이 되버린다. 2승해서 원래대로 돌아가면 되므로, 예를 들면 "반으로 감쇠 시킨다"라고 하면 제곱근(√)을 이용하면 된다.

단지 「1/2로 결정」이라는 정수처리로서는 확장성이 너무 없으므로, 이것을 일반화 시키기 위해서 「제곱근 연산」(pow함수)을 이용한다. 예를 들면 X의 제곱근은 X의 1/2승이다. NVIDIA의 실험에서는 앞단계에서 텍스처 색을 0.82승을 하고, 뒤단계에서 0.18승한 감쇠율 파라미터를 이용했다고 한다.

이 피하 산란 블러의 전후로 재질감을 처리 해주는 방법은 얼핏, 황당무계한 것으로 생각될 수도 있지만 NVIDIA에 의하면 실은 물리적으로도 의미가 있다고 한다.

빛은, 피부의 살결이나 주름을 포함한 미세 요철을 가지는 디테일층(광흡수층)에 입사도 하지만, 내부에서 산란해 다시 돌아와 여기로부터 나오기도 하기 때문에, 실제로 빛은 2회, 이 디테일층과 관련된다. 이 앞뒤로 텍스처 색이 곱해지는 것은 정확히 이 현상을 근사 한 것과 같다고 한다.(계속)

빛이 입사(入射)와 출사(出射)로써 디테일층(흡수층)을 통과하는 것의 의사적인 재현이, 피하 산란 블러 전후에 텍스처 처리를 하는 것에 해당된다.

<그림 설명>
위에서 아래로:
얇은 지방질층,
흡수층의 디테일,
표피,
혈관이 통하는 피부,
피부층

대국(大局)적인 피하 산란은 어떻게 해 줄 것인가?

국소적(局所的)인 피하 산란은 어떻게든 그 나름대로 재현할 수 있었다. 그러면, 대국(大局)적인 피하산란은 어떻게 다루면 좋을 것인가?

국소적인 피하 산란이란, 피부상의 픽셀에 들어 온 빛에 대한 광산란이다.

한편, 대국적인 피하 산란이란, 시점과 광원이 대립하는(마주보는) 관계에 있고, 그 사이에 3D얼굴 모델이 있는 …… 즉 역광과 같은 관계가 되었을 때에, 피부 층의 얇은 부분으로부터 빛이 스며 나오는 것처럼 보이는 현상을 가리킨다. 바꾸어 말하면, 대국적인 피하 산란이란, 광원으로부터의 빛이 직접적으로 3D모델 전체에 대해서 미치는 표면하 산란이다.

예를 들면 귀와 같은 두께가 없는 부위는, 빛이 역광의 각도에서 귀가 빛을 차폐하고 있는 경우에서도, 빛이 귀를 침투하고 이쪽으로 관통해 오고, 음영 상으로는  "음(陰)"이 되는 부분도 희미하게 밝아진다. 이것은 피부가 투명도는 낮지만 반투명 재질이기 때문에 일어나는 현상이며, 이것도 피하 산란 현상의 하나이다.

2D공간 베이스 블러를 사용한 피하 산란 테크닉에서는, 인체(얼굴) 그 자체에서 차폐하고 있는 맞은편 빛에 대한 산란에는 대처할 수 없다. 이 대국적인 피하 산란에 대해서는, 인체의 두께 정보를 렌더링 해서 그 두께에 따라서 「빛이 스며 나오는」것을 추가해 줌으로써 대처할 수 있다.

NVIDIA는, 이 렌더링의 구조를 반투명 그림자 맵(TSM:Translucent Shadow Maps)이라고 부르고 있는데, 이 방법은 NVIDIA GeForce 7800용 데모 「Luna」에서 활용된 테크닉과 같은 것이다.

이 방법에서는, 우선 처음에, 캐릭터 모델의 두께를 산출한다. 산출법은 광원으로부터의 깊이 정보와, 시점으로부터의 깊이 정보와의 차분(差分)을 구함으로써 얻을 수 있다.

렌더링시에는 그 픽셀에 대응하는, 광원 방향까지의 거리, 광원 방향에의 두께 정보를 참조하고, 그 "두께값"에 따라서 광량이 새어 나오도록 픽셀색을 결정한다. 구체적으로는 두께값이 작으면, 얇다는 것이므로, 배후의 빛이 이쪽으로 스며 나오는 것이므로 밝게 한다. 반대로, 두께치가 크면 큰 만큼, 두껍다는 것이므로 빛의 투과량은 작아지고, 어느 두께 이상은 이쪽으로는 전혀 투과되지 않게…… 한다.(계속)

시점에서, 광원으로 부터의 빛을 차단하고 있는 차폐물의 두께를 구할 때는, 광원으로 부터의 3D오브젝트의 등까지의 깊이와, 시점으로부터 3D오브젝트 앞면까지의 깊이와의 차이값으로 구한다

그렇게 구한 두께 정보를 가시화한 것(영상은 NVIDIA의 데모 「Luna」의 메이킹 영상중에서)

그 정보를 바탕으로, 배후로부터 이쪽으로 투과되어 오는 빛의 양을 의사적(疑似的)으로 구한다



 

그림자 처리는 어떻게 할까?

NVIDIA의 구현에서는, 데모 자체가 한정적인 씬이기도 했기에, 그림자 생성은 극히 평범한 깊이 그림자 기법(쉐도우매핑)을 사용했다고 한다. 그래서, 코의 그림자가 볼에 지거나, 이마의 불룩함의 그림자가 눈의 움푹한 곳에 지거나 하는 셀프 쉐도우 표현이 구현되어 있다.

이 그림자에 대해서는, 지금까지 다루어 온 피하 산란의 재현과 어떻게 조합하면 좋을까?

실은, 이것은 피하 산란 블러의 대상이 되는 원(元) 텍스처를 렌더링할 때에, 함께 이 실시간 셀프 쉐도우를 생성해 버리고 있다고 말한다. 그림자의 엣지는 피하 산란 블러 처리로 인해서 희미해지지만, 이것은 마침, 그림자의 엣지 부근에도, 빛이 닿고 있는 부분으로부터 피하 산란한 빛이 스며 나오고 있는 것을 재현한 것이 되므로 문제가 없고, 그 뿐만 아니라 물리적으로도 의미가 있다고 한다.

셀프 그림자의 엣지 부분이 희미하게, 독특한 그라데이션으로 희미해지고 있는 것도 확실히 자연스럽고 리얼하게 보인다

실제의 최첨단 3D게임에서 안면이나 피부의 구현은 어느 정도 레벨일까?

NVIDIA의 「Adrianne」데모나 안면 데모는 꽤 화려하게 구현이 되어 있어,  이대로 게임에 가져 가는 것은 렌더링 부하적으로 어려울 것이다.

현행의 GPU를 타겟으로 해서 3D게임에 구현하려면 , 피하 산란 블러를 NVIDIA 구현에서는 6회하는 것을  절반으로 한다든지, NVIDIA 구현에서는 텍스처 처리를 피하 산란 블러의 전후에 하고 있는 것을 어느 한쪽으로만 한다든지, 또는 대국적(大局的)인 피하 산란은 무시한다든지 하는……등의 여러가지 간략화를 해 나갈 필요가 있을 것이다.

실제로 발매된 게임 타이틀이나, 실용화된 게임 엔진에서는 독일 CRYTEK이 개발한 「CRYSIS」(2007년)가, 꽤 선진적인 스킨셰이더를 실용화하고 있어 주목을 끌었다. CRYETK은 NVIDIA와의 관계도 강하기 때문에 NVIDIA의 이런 방법에 가까운 접근방법도 응용되고 있다고 보여진다.

                 독일 CRYTEK의 「CRYSIS」에 있어서의 리얼타임 안면 렌더링의 일례


또, 안면의 경우는, 피부의 질감의 표현 뿐만이 아니라, 표정 표현의 리얼리티 향상도 중대한 테마가 되어 지고 있다.

이 분야에 대해서는, 인간의 표정을 실제로 넣어 3D모델에 적용하는 얼굴 모션을 캡쳐해서 이용하는 방법과, 해부학이나 정신의학의 이론을 베이스로 표정을 인공적으로 합성해서 3D모델에 적용하는 2개의 접근법이 있다. 리얼리티면에서는 전자가 우위고, 후자는 애니메이션 개발비의 절약에 우위……라고 하는 것이 현재의 인식이지만, 후자의 진화는 현저하고, 리얼리티의 면에서 모션 캡쳐식에 육박 하는 수준까지 와있다.

AVID사로부터 등장한 인공 표정 합성 개발 소프트웨어「FACE ROBOT」은, 그 최첨단 실례이고, 실제의 게임이나 영상 제작 현장에서 적극적인 이용이 시작됬다.

최근 몇년의 게임에서, 후자의 인공 합성 표정 방식을 채용하고 있는 것은, VALVE SOFTWARE의 하프 라이프2시리즈다. 여기서는 캐릭터의 표정 제어에는, 캘리포니아 의대 정신의학 교수이며, 심리학 분야에서도 저명한 Paul Ekman박사의 이론을 구현하고 있는데, 파라미터의 편성과 그 파라미터의 추이만으로, 리얼한 표정 변화나 감정 표현을 실현하고 있다.

하프 라이프2시리즈 「하프 라이프2:에피소드2」(2007년)으로 부터


 

Posted by 노을삼킨별
,

아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/표면下%20산란과%20스킨표현


2009-04-04 17:59:00
3Dゲームグラフィックスでは人間のキャラクタ取り扱うことが多く、その際に避けられないのが人肌の表現だ。ただ、肌色に塗ったテクスチャを貼り付けて拡散反射のライティングを行っただけでは素焼きの焼き物かプラ ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.


3D게임 그래픽스에서는 인간형 캐릭터를 다루는 경우가 많으며, 그 때 피할 수 없는 것이 피부의 표현이다.

단지, 피부색의 텍스처를 붙여서 확산반사 라이팅을 해 준 것 만으로는 설익은 구이나 플라스틱처럼 보여 버린다. 신선한 살아 있는 피부의 느낌을 내기 위해, 지금까지 다양한 수단들이 시도되어 왔다.

이번회 부터는, 가장 기본적인 의사(疑似, 유사)방법과 비교적 물리적으로 올바르게 처리해서 리얼한 결과를 낼 수 있는 방법을 소개해 가려고 한다.

하프라이프2에서 사용된 유사 라디오시티(radiosity) 라이팅
「하프
램버트 라이팅」(Half Lambert Lighting)

미국 VALVE SOFTWARE가 개발한 「하프 라이프2」(2004년)에서는, 인간 캐릭터등의 동적 캐릭터에는 이 회사가 독자 개발한 「하프 램버트 라이팅」(Half Lambert Lighting)이라 불리는 특별한 라이팅을 사용했다.

이 방법은, 물리적으로는 전혀 올바르지 않은 완전한 모의방법이지만, 복잡한 상호반사에 의한 라이팅(라디오시티:Radiosity) 처럼 부드러운 음영이 나오기 때문에, 부드러운 빛으로 가득 찬 공간에서의 라이팅 구현을 가능하게 해준다. 하프라이프2에서 이것은 포토 리얼리스틱한 비주얼 이미지 실현에 큰 역할을 했다.

하프 램버트 라이팅의 원형은, 물론「램버트 라이팅」이다.

램버트 라이팅은 확산반사의 음영처리로 많이 알려진 일반형으로, 시선 방향에 의존하지 않고 광원의 입사방향과 면의 방향(법선 벡터)만으로 계산되는 음영처리 기법이다. 이 기법에는 「그 지점의 밝기는, 면의 방향과 빛의 입사 방향이 이루는 각도θ의 cosθ값에 비례한다」라는 「램버트 코사인법칙」이 정의되어 있지만, 실제로 이것으로 라이팅을 하면 명암이 매우 강렬하게 나오는 특성이 있다.

                             램버트의 코사인 법칙

<그림 설명>
광원(光源)、
L: 광원벡터(光源ベクトル)
N: 법선벡터(法泉ベクトル, 노말벡터)、
I = Ii * kd * cosθ = Ii * kd * (N · L)
I: 반사광의 세기(反射光の強さ)、
Ii: 입사광이 세기(入射光の強さ)、
kd: 확산반사율(拡散反射率)


하프라이프2에서는, 이 심하게 변하는 코사인 곡선에 바이어스를 걸어 어두운 부분의 계조(단계영역)를 들어 올리는 생각을 했다. 램버트 코사인 법칙의 코사인 곡선이 절반이 되도록 "1/2"을 곱한 다음, "1/2"을 더하고, 다시 이것을 제곱해서 완만한 곡선으로 변환해서 음영처리를 실시하기 때문에 「"하프" 램버트 라이팅」이라고 한다.(계속)

빨간색의 커브가 램버트 코사인 법칙의 기본 코사인 곡선. 파랑색이 하프 램버트 라이팅의 곡선. 왼쪽 화상이 통상의 램버트 라이팅의 결과, 오른쪽이 하프 램버트 라이팅의 결과


 

하프 라이프2의 속편인「하프 라이프2 에피소드1」(2006년)에서는, 이 하프 램버트 라이팅에 추가해서 씬 광원에 대하여 실시간 퐁 경면반사(鏡面反射, 거울반사, 정반사) 라이팅(Phong Specular Lighting)을 해 주고 있다.

퐁 경면반사는 광택이 강하게 나오는 경면반사의 일반형으로, 법선벡터 방향과 광원벡터 방향 외에 관측자의 시선 방향도 고려되는 음영처리이다. 퐁 경면반사에서는 시선 방향 E와 법선벡터 방향 N의 2개 벡터로 계산한 반사방향 R과 광원방향 L이 이루는 각도 θ의 코사인(COSθ)값을 구해, (이것을) 시선으로부터 보이는 빛의 세기로 정의하고 있다. 직관적으로는 (아래) 그림 안의 R과 L의 각도가 작아지면 작아질 수록 강한 반사가 된다는 이미지이다.

                        퐁 경면반사 (Phong Specular Reflection)

<그림 설명>
광원(光源)、
시선벡터(視線ベクトル) E、
법선벡터(法泉ベクトル) N
접선(接線),
광원벡터(光源ベクトル) L、
반사벡터(
反射ベクトル) R



피부에 한결같이 퐁 경면반사를 적용해 버리면 금속처럼 보이게 되므로, 약간의 방법을 고안하고 있다.

그것은, 그 3D 캐릭터상의 "표현하고 싶은 물질"이 어느 정도 강도의 하이라이트(광택)를 내는지를 나타낸 분포도(텍스처)와, 어느 곳에 어느 정도 강도의 경면반사를 해 줄 것인가의 분포도(텍스처)를 준비해서, 렌더링 시에는 이 2개의 정보를 고려해서 퐁 경면반사의 음영 처리를 해 준다는 것이다. 개발팀에서는 이 2개의 추가 텍스처 정보를, 전자는 경면반사 지수(Specular Exponent), 후자는 「경면반사 마스크」(Specular Mask)라고 불렀다고 한다.

경면반사를 하는 방법의 분포를 담은 텍스처를 준비하고, 이것을 참조하면서 퐁 경면반사의 음영 처리를 해 간다


이것은 예를 들면 입술, 코, 이마등은 강한 하이라이트가 나오지만, 뺨이나 입 주위에서는 확산반사가 지배적이다……라고 하는 분포도이다. 이 분포도는 물리적인 측정 결과에 의한 것을 이용하거나, 혹은 아티스트가 그러한 물리 측정 데이터를 본따 리얼하게 보이도록 인공적으로 만든 것을 사용한다.

아래 그림은 Tim Weyrich씨등이 SIGGRAPH 2006에서 발표한 「Analysis of Human Faces using a Measurement-Based Skin Reflectance Model」안에 포함되어 있는 것이다. 세로축 ρs는 경면반사 강도를 나타내고, 가로축 m은 면의 거친 정도를 나타내고 있고, 안면을 10개의 영역로 나누어 ρs와 m에 대한 분포를 집계한 것이다. 실제의 구현에서는 이러한 실측 데이터를 참고로 분포도를 작성 해 나간다.
(역자: Torrance-Sparrow BRDF 모델을 사용한 것으로 Torrance-Sparrow (T-S)는 반사되는 표면은 미시적으로  /\/\/\  과 같은 굴곡들(grooves)로 이루어 졌고, 이런 굴곡면들(microfacets, perfect reflectors)에 의해서 빛이 반사하고 있다고 가정한다.)

안면의 10군데에서의 경면반사 강도 ρs(세로축)와, 면의 거친 정도 m(가로축)의 분포.「Analysis of Human Faces using a Measurement-Based Skin Reflectance Model」(Tim Weyrich,SIGGRAPH 2006)로 부터

나아가 프레넬 반사도 고려해, 하이라이트가 나오는 모습을 시선과 면의 방향을 고려해 결정한다. 프레넬 반사에 대해서는 54회를 참조해 주었으면 하지만, 간단하게 말하면 면과 수평이 되는 각도로 보는 경우에 하이라이트가 나오기 쉽고, 면과 시선이 수직에 가까워지면 가까워질수록 확산 반사의 결과가 지배적이 되는…… 처리를 해 주는 것이다.

이렇게 만들어진 하프라이프2 에피소드1의 인물 캐릭터 영상은, 텍스처와 경면반사, 확산반사의 조합만으로 만들어진 것 치고는 상당히 리얼하게 보인다.(계속)

하프 램버트 라이팅에 경면반사 분포를 적용하는 것만으로 피부의 라이팅은 여기까지 리얼하게 보여질  수 있다.


 

Posted by 노을삼킨별
,


아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/수면%20표현



수면(水面) 표현 : 수면 표현의 역사


2009-02-27 16:30:09
水面を使ったシーンは3Dゲームグラフィックス等で出現頻度が高い。リアルに描くには非常に難しいテーマだが、とはいってもプログラマブルシェーダ時代に突入してから、著しく進化した部分でもある。今回からは、こ ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.


 

수면(水面)을 사용한 씬은 3D게임 그래픽스등에서 출현빈도가 높다. 리얼하게 그리는 건 매우 어려운 테마이지만,  프로그래머블 셰이더 시대에 돌입하고 부터, 현저하게 진화한 부분이기도 하다.

이번회 부터는, 이 「수면(水面)」의 트렌드를 소개해 나가고 싶다.

잔물결 표현으로 본 수면 표현의 역사

수면 표현은, 지금이나 옛날이나, 3D게임 그래픽스에서는 빠뜨릴 수 없는 요소가 되어 있다.

프로그래머블 셰이더가 등장하기 이전에는, 적당한 잔물결 모양을 그린 "잔물결" 반투명 텍스처를 붙인 폴리곤으로 표현한 수면이 주류였다. 이 반투명 잔물결 텍스처를 스크롤 시킴으로써, 물이 흐르고 있는 느낌을 주는 표현도 자주 사용되었다. 보다 리얼하게 하기 위해서, 복수의 반투명 잔물결 텍스처들을 멀티 텍스처링으로 다른 방향으로 스크롤 시켜서 수면이 복잡하게 일렁이는 느낌을 표현한 것도 있었다.

「GIANTS: CITIZEN KABUTO」(PLANET MOON  STUIOS, 2000)으로 부터. 반투명의 "잔물결" 텍스처의 스크롤에 의한 수면 표현은 비(非)프로그래머블 셰이더 시대의 3D게임 그래픽스에서는 기본이었다


프로그래머블 셰이더가 등장하고 나서는, 잔물결의 미세 요철을 표현하는데 법선맵을 활용한 범프매핑을 이용하게 된다.

법선 맵 자체에는 애니메이션이 없고, 움직이지 않지만, 그 수면의 폴리곤 자체에 천천히 요철(凹凸) 시키는 애니메이션을 시키는 것으로, 겉보기에는 꽤 리얼한 수면을 표현할 수 있게 되었다.

「Tom Clancy's Splinter Cell」(UBI SOFT,2002)으로 부터. 수면의 잔물결 표현을 법선맵으로 하는 것이 기본이 되었다

반투명의 잔물결 텍스처를 스크롤 시켜 "흐름"을 표현하고 있던 테크닉과 완전히 같은 발상으로, 이 법선맵을 스크롤 시켜, 수면의 일렁이는 느낌을 표현하는 응용예도 볼 수 있게 되었다.


「3DMark2001SE」(Futuremark,2001)로 부터. 수면의 잔물결은 법선 맵에 의하는 것. 1개 1개의 잔물결은 형태를 변화시키지는 않지만, 다만, 스크롤은 하고 있다. 이것으로도 나름대로 리얼하게 보인다


GPU의 성능도 오르고 ,GPU에 탑재되는 비디오메모리의 용량이 커지면서, 이 잔물결에 움직임을 주려는 접근방법들이 생겨난다.

우선 최초로 구현된 것은, 루프(loop)하는 법선맵의 애니메이션을 오프 라인으로 생성해서, 이것을 렌더링시에 재생해 나가는 것이었다. 다이렉트X 9 세대에서는, 이 방법을 사용한 3D게임 타이틀이 많았던 것 같다.

「AGE OF EMPIRESIII」(ENSEMBLE STUDIOS,2005)로 부터. 오프 라인으로 생성한 법선맵의 애니메이션을 이용해 일렁이는 잔물결을 표현하고 있다


이 방법은, 유저가 좁은 근거리 밖에는 볼 수 없는 수면이라면, 눈에 띄는 흠은 없었지만, 파노라마적으로 광범위한 수면을 내려다 보는 경우는 법선맵의 애니메이션 반복 패턴이 보이기도 했다.

 

「HALFLIFE2」(VALVE,2004)로 부터. 먼 곳까지 바라 볼 수 없는 경우에는 오프라인 생성의 법선맵 애니메이션도 그렇게 부자연스럽지 않지만……

 「HALFLIFE2」(VALVE,2004)로 부터. 반대로 
  먼 곳까지 바라볼 수 있는 씬에서는 그 애니메
  이션의 규칙성이 드러나 버리는 경우가 있다


이 방법은, 수면의 움직임만은 그 나름대로 리얼하지만, 다른 캐릭터가 수면에 준 인터렉션을 반영할 수는 없다라는 약점도 있었다. 예를 들면, 수면을 배가 횡단해 가도, 수면은 주어진 잔물결 애니메이션을 반복할 뿐이다. 이 오프라인으로 생성한 법선맵 애니메이션에서는, 배가 물을 밀쳐서 만들어 내는 잔물결의 변화를 표현할 수 없었다.

이런 경우는, 수면에 물보라 파티클이나, 동심원 형태의 파문을 그리거나 하는 간이적인 표현으로 대응하는 방법들을 많이 볼 수 있었다. 다만, 이 방법들은 법선맵에 의한 잔물결 표현과 일체감이 없고,  아무리 봐도 거짓말 같아 보이는 것이 문제였다.

거기서, 보다 리얼하게 캐릭터와 수면의 상호 간섭을 재현하기 위해서, 이 잔물결 표현용의 법선맵을 실시간으로 생성하는 접근방법이 고안된다.(계속)




수면(水面) 표현 : 동적인 잔물결 (Verlet Integration)


베를레 적분(Verlet Integration)에 의한 Full Interactive한 동적인 잔물결

움직이는 잔물결을 법선맵을 움직여서 표현하던 것을 동적인 것으로 바꾸기 위해서는, 요컨데 법선맵 자체를 동적으로 생성하면 된다.

법선맵은, 요철을 농담(濃淡)으로 표현한 높이맵으로부터 생성하면 된다고, 이 연재의 「법선맵」부분에서 소개했다. 그렇다면, 잔물결이 되는 요철을 표현하는 높이맵을 어떤 방법으로 (동적으로) 생성해, 이 높이맵으로부터 법선맵을 생성하면 될 것이라는 방향이 눈에 보인다 .

이 잔물결의 높이맵 생성에는, 어떤 동적인 파동 시뮬레이션을 실시할 필요가 있는데, 지금도 잘 볼 수 있는 것이, (바로) 베를레 적분법(Verlet Intergration)이다.

베를레(Verlet) 적분은 이전 상태와 현재 상태의 차분(差分)정보로부터 속도를 산출해 다음 상태를 구하는 이산적인 적분 방법으로, GPU가 텍스처에 대해 실행하는 연산모델에 매우 적합하기 때문에 많이 이용된다.

「어떤 잔물결을 일으킬까?」라는 테마에 대해서도 여러가지 이론이나 아이디어가 있지만, 주파수가 높은 세세한 잔물결은 복수의 동심원 형태의 파문을 다수 발생시키는 방법이 자주 이용되는 것 같다.

베를레 적분을 매프레임(혹은 매프레임이 아니어도 정기적인 프레임 간격으로), 반복해 실시함으로써, 다음 상태의 하이트 맵(≒다음 상태의 잔물결)이 구해진다.

이 수면에 대해, 다른 캐릭터가 간섭을 미치거나 무엇인가를 던져 넣거나 하는 간섭이 있었을 경우는, 거기에 새로운 물결의 "파원"을 높이맵 텍스처에 그려 넣으면 된다. 그럼, 다음 상태는 베를레 적분을 실시해서 자동적으로 구해진다.

이 방법으로 동적인 잔물결을 실시간으로 구현해서, 널리 공개한 것이 NVIDIA의GeForce 4 Ti 시리즈용의 데모 「Tidepool」이였다.(계속)

NVIDIA의GeForce 4 Ti시리즈용의 데모 「Tidepool」(2002)로 부터. 데모는 NVIDIA의 사이트로부터 다운로드 할 수 있다.




수면(水面) 표현 : 수면 라이팅(Fresnel Reflection)


수면 라이팅(1) ~ 프레넬 반사(Fresnel Reflection)

법선맵을 사용한 범프맵핑으로 "잔물결"을 표현하는 것과는 다른 문제로, 수면 표현에서 키포인트가 되는 요소가, 그 라이팅에 대한 것이다.

수면이라고 하면, 역시, 주위의 정경이 비치는 「화면반사 표현」이 포인트가 되는 것은 쉽게 상상이 갈 것이다. 따라서, 라이팅은 법선맵을 이용해 단지 경면반사(鏡面反射, 정반사, 거울반사)나 확산반사(拡散反射)의 라이팅을 실시할 뿐만 아니라, 주위의 정경을 그려 넣은(혹은 동적으로 생성한) 환경맵의 텍스처를 적용할 필요가 있다.

다만, 환경맵+범프매핑이라는 표현에서는, 수면(水面)이라 하기 보다도 액체가 거울이 된 것 같은……말하자면 수은(水銀)과 같은 표현이 되어 버린다. (즉) 수면다운 라이팅이 필요한 것이다.

「물」은 투명하고, 적당히 투과되는 것이 바람직하다. 투과되는 투명이라는 것이다. 투명은 수면보다 아래의, 물밑의 모습을 투과 시키는 것이 된다.

결국, 이미지로서 수면은 「물밑의 모습」과「환경맵」의 혼합 상태를 조정하는 것이 리얼리티를 높이는 것과 연결된다는 것을 상상할 수 있다.

거기서 응용하는 것이 「프레넬 반사」(Fresnel Reflection)라는 개념이다.

그림1: 프레넬 반사의 개념도

<그림 설명>
A : 물 밑이 잘 보인다.
B : 물 밑과 풍경의 비침이 아주 엷게 보인다.
C : 풍경의 비침이 잘 보인다.

수면과 시선의 위치 관계에 따라서, 수면에 대해서 시선이 직각에 가까우면 가까울 수록 물밑이 보이기 쉽고, 수면에 대해서 시선이 스치듯이 얕은 각도가 되면 될수록 주위의 정경이 잘 비쳐 보인다.

먼 수면이 주위의 정경을 잘 비치게 하고, 발밑의 수면은 물밑이 잘 보인다……라는 체험은 누구라도 있다고 생각되는데, 그것을 재현해 주면 되는 것이다(그림1).

이 프레넬 반사의 개념은, 광택을 수반한 차의 몸체나, 인간의 피부 표현 등에도 응용된다.(계속)

  

「HALFLIFE2」(VALVE,2004)로 부터. 발밑
의 수면은 투과되어 보여 물밑의 폐타이어가
잘 보인다. 그러나, 먼 곳의 수면은 거의 주위
의 정경을 반사시키고 있을 뿐 물밑은 안보인
다.이것이 프레넬 반사이다

   「F.E.A.R.」(MONOLITH,2005)으로 부터.
    씬의 안쪽의 수면에서는, 물밑의 모습이
    완전히 사라져 100% 주위의 정경이 비치고
    있으면 수심이 깊은 느낌이 나지만, 반대로
    씬의 안쪽에 있어도 물밑의 모습(이 영상에서
    는 콘크리트)이 보이고 있으면 얕은 느낌이
    든다



 

반사와 굴절

수면에 비치는 주위 정경의 환경맵을, 동적으로 생성하고 싶은 경우에는, 시점 위치를 수면에 대해서 반전시킨 가상 시점으로부터 정경을 텍스처에 그리면 된다.

그리고 물밑의 모습은 보통처럼 시점에서 수면 아래의 정경을 그리면 된다.

수면에 비치는 정경의 렌더링은 시선을 수면에 대해서 반전시킨 위치로부터 상하
역전시킨 가상시점으로부터 그린다

수면의 렌더링 시는, 잔물결의 미세 요철을 표현한 법선맵으로부터 꺼낸 법선벡터를 고려해서, 픽셀 단위의 반사 벡터를 구하고, 이것에 따라서 환경맵을 샘플링 한다.

앞에서 기술한 프레넬 반사의 방정식을 계산해서 그 결과에 따라서, 환경 맵으로부터 샘플링 한 텍셀과 렌더링 한 물밑 모습을 혼합하는(blend) 상태를 조정한다.

물밑의 모습을 수면에서 시선이 굴절한(=물밑의 모습이 굴절해서 눈에 닿는)모습을 시뮬레이션 하면 한층 더 리얼리티가 증가한다.

아래 그림은 반사 벡터와 굴절 벡터를 도식화한 것이다. 굴절 변수 r은 0~1의 범위에서 적당하게 주면 된다.

수면에 반사되는 정경 뿐 아니라, 이 굴절 벡터도 법선맵으로부터 가져온 법선 벡터로 픽셀 단위로 계산해 주는 것으로,  굴절한 물밑의 모습도 잔물결로 비뚤어지게 된다.

                                        반사 벡터와 굴절 벡터

<그림 설명>
시선 E, 법선 N,
반사 E' = 2N(E·N)-E,
N(E·N)-E,
굴절: R = r · N(E·N)-E 


물의 색

수면의 라이팅에 필요한 요소에, 한가지 더, 「물의 색」이 있다.

그렇다, 물 그 자체의 색이다.

물이 진흙으로 더러워져 있는 경우나, 쥬스와 같은 특정의 채색을 수반하고 있는 "물"도 있다. 그러한 요소들도 고려한다.

구체적으로는 반사나 굴절로 얻은 텍셀에 일정한 색변조를 실시하는 간이적인 방법도 있지만, 프레넬 반사의 요령으로, 시선 각도가 수면에 대해서 수직인(정도)만큼 투명도가 높고, 시선 각도가 수면에 수평인 정도 만큼 물의 색이 지배적이 되도록 밸런스 제어를 해주는 방법도 있다.

또, 물은 수심이 깊을 수록 불투명도가 증가하고 물의 색이 진하게 보이므로, 수면 부근은 가장 물의 색이 연하게 투명도를 높이고, 수심이 깊은 곳 일수록 물의 색이 진해지도록 제어하는 방법도 자주 이용된다.

물의 불투명도를 연출할 때, 「3DMark06」(Futuremark,2006)에서는, 수면 이하의 아래방향으로 가면 갈수록 진해지는 포그(높이 포그, Y포그 등으로 불린다)를 발생시켜, 수심이 매우 깊은 느낌을 표현했다.(계속)

「3DMark06」(Futuremark,2006)로 부터. 수면에서 물밑 방향으로 포그를 발생시킴으로써, 수심이 깊은 곳은 정경을 희미하게 보이게 해 수심이 깊은 느낌을 표현할 수 있다. 호수나 대해와 같은 수면의 표현에는 효과적일지도 모른다



수면(水面) 표현 : 큰 물결 (Gerstner Wave)


큰 물결 ~ 지오메트리 레벨의 물결

바다나 호수 연안의 수면에는, 잔물결 보다도 규모가 큰 물결을 볼 수 있다. 해상을 무대로 한 3D게임등에서는 이러한 수면을 다루는 상황이 많다.

이러한 대해의 물결에 대해서는 이전부터 학술적인 분야에서는 여러 각도로 연구를 하고 있었는데, NVIDIA가 GeForce 6800시리즈용의 데모 「Clear Sailing」(NVIDIA,2004)에서 거스너 파동(Gerstner Wave)모델을 구현한 이래로, 이 방법이 자주 사용되게 되었다.

큰 물결은, 법선맵에 의한 범프맵핑으로 실현하려면 무리가 있기 때문에, 실제로 정점 레벨에서 움직이는(지오메트리레벨의) 물결로 구현할 필요가 있다.

구현 방법은 여러가지가 있지만, 미리 적당한 해상도로 분할해 둔 다각형 그리드의 정점들을, 거스너(Gerstner) 파동 함수로 얻은 물결의 정점 정보들로 변위시키는 방식이 심플하고 구현하기 쉽다고 여겨진다. NVIDIA의 「Clrear Sailing」데모에서는150×150으로 분할한 다각형 그리드에 대해서 45개의 거스너파를 발생시키는 구현이였다. 덧붙여 거스너파의 발생에는 CPU를 활용했다.

앞에서 기술한 것처럼, 이러한 지오메트리 레벨의 물결을 추가하면, 법선 맵을 사용한 범프 맵핑에 의한 잔물결 표현의 주기성을 알기 어렵게 만드는 효과가 있다. 수면의 표현에 그리 무게를 두지 않은 그래픽스 설계인 경우는, 잔물결 표현은, 고정의 복수 법선맵으로 잔물결을 적당하게 스크롤 시키는 것만 하고, 지오메트리레벨의 물결을 수면에 적용하는 것은 대강하는 경우도 가끔 보여진다.「3DMark06」(Futuremark,2006)의 수면 표현은, 확실히 이 패턴이었다. 3DMark06의 잔물결 표현은 2장의 법선맵을 스크롤 시키면서 중첩 시킬 뿐이고,  여기에 4개의 거스너파를 지오메트리레벨로 발생시킨 것이였다.

「3DMark05」(Futuremark,2004)의 수면 표현은, 2개의 법선 맵을 스크롤 시키는 것 뿐인 잔물결 표현만 있었다. 기복이나 변화가 부족했다

「3DMark06」(Futuremark,2006)의 거의 동일한 씬으로 부터. 이쪽은 거스너파에 의한 지오메트리레벨의 물결이 더해진 것으로  외형적으로 복잡성이 증가했다.

시점 위치가 수면에 대해서 다이나믹하게 가까워 지거나 멀어지거나 하는 3D게임의 그래픽스에서는, 픽셀 단위의 잔물결 표현과 정점 단위의 큰 물결을 시선과의 위치 관계에 맞추어 그때 그때 구분해서 사용하는 구현도 재미있을지 모르겠다.

예를 들면, 텍스처 상에서 적당한 파동 시뮬레이션을 시행해, 물결의 높낮이를 농담(濃淡) 정보로 나타내는 높이맵을 생성해, 시점 위치에서 봤을 때 이 높낮이가 미세하다고 볼 수 있는 높낮이 정보에 대해서는 여기서부터 법선맵을 생성해 범프맵핑의 잔물결로 표현해 준다……라는 구현이다.

반대로, 시점으로부터 가까워 높낮이가 크게 보이는 높낮이 정보에 대해서는, VTF(Vertex Texture Fecth)기능을 활용해, 정점셰이더로부터 높이맵에 액세스 해 이 정보를 바탕으로 수면의 정점을 변위시켜 지오메트리 레벨의 물결로 한다.

이렇게 함으로써 물결 표현의 화질과 리얼리티, 처리의 부하 밸런스를 평균화 할 수 있을 것이다.

덧붙여 이 구현을 실행하려면 GPU에 VTF기능이 필수가 된다. 다이렉트X9 세대 / SM3.0 대응 GPU에서는 GeForce 6000시리즈 이상, 다이렉트X10 세대 / SM4.0 대응 GPU에서는 모든 GPU가 VTF에 대응하고 있다.

이 방법을 구현한 3D게임 타이틀에 「버추얼파이터5」(세가, 2006)가 있다. 버추얼파이터5에서는, FP32-128비트의 부동소수점 텍스처에 대해서 파동시뮬레이션을 실시해 높이맵을 생성한다. 이 높이맵으로부터 지오메트리 레벨의 물결을 생성하고, 나아가 법선맵까지 생성해서, 이것을 사용해 잔물결 표현까지 해주고 있다.

「버추얼파이터5」(세가,2006)로 부터. 이 작품에서는VTF)를  활용한 물결 생성을 구현하고 있다. 오른쪽 화면은 파동 시뮬레이션을 실시한 뒤의 높이맵. 왼쪽이 이 높이맵으로부터 생성한 법선맵이다

 

높이맵을 바탕으로 정점 레벨의 물결을 생성.

    나아가 법선맵에 의한 픽셀 단위의 잔물결
    음영처리까지 실시해 최종 화면을 생성.



 

Posted by 노을삼킨별
,


아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/지오메트리%20셰이더




지오메트리셰이더 : 새로운 표현(Motion Blur)


2008-10-10 10:00:00
ジオメトリシェーダを活用した新表現(1)~モーションブラージオメトリシェーダの活用方針の二つ目、「ジオメトリシェーダを活用した新表現」とは、ジオメトリシェーダを用いることで、これまでのGPUでは難しかった ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.



 

지오메트리셰이더를 활용한 새로운 표현(1) ~ 모션블러(Motion Blur)

지오메트리셰이더를 활용하는 방침의 두번째인 「지오메트리셰이더를 활용한 신표현」이란 것은 지오메트리셰이더를 이용해 지금까지의 GPU에서는 어려웠던 표현을 가능하게 하는 것을 말한다.

서서히 독특한 테크닉이 등장하기 시작하고 있지만, 여기에서는 가장 기본적인 것들을 소개하고 싶다.

비교적, 구현이 간단하고 효과가 큰 것이 지오메트리셰이더를 활용한 모션블러이다.

실은, 지오메트리셰이더를 사용한 모션블러에는 몇가지 종류들이 있다. 여기에서는 그 중 3가지 패턴을 소개한다.

우선 모션블러란 무엇인가? 이 기본을 정리해 두자.

리얼타임 컴퓨터 그래픽스는 어떤 의미에서는 셔터속도 1/∞초의 카메라로 촬영하고 있는 것과 같기 때문에 , 아무리 피사체가 고속으로 움직이고 있다고 해도, 생성한 프레임이 흐려지지는(번지지는) 않는다. 이것이 「그야말로 CG」같은 느낌인 것이 사실이고, 이것을 마치 카메라로 촬영한 것 처럼, 포토 리얼리스틱하게 보이게 하기 위해, 빠른 움직임에 대해서 "흐림(흔들림)" 효과를 추가해 주는 테크닉을 「모션블러」라고 부른다.

모션블러의 부차적인 효과로서는, 표시 프레임수가 일정하지 않아도, 보는 것 만으로는 알 수 없도록 해주므로, 최근의 많은 3D게임등에서 채용되어져 왔다.

결국, 모션블러는 어떠한 기법으로 "흐림(흔들림) 효과"를 그려갈지 ……가 키포인트가 된다.

가장 기본적인 것은, 영상 프레임 전체에 한결같이 걸어 버리는 「카메라블러」이다.

이것은, 현재의 렌더링 프레임을, 시점(카메라)의 이동 벡터에 따라 형태를 확대, 축소, 혹은 회전등을 시켜서, 반투명하게 중복합성하는 것으로 실현될 수 있다.

이 카메라블러는 레이싱 게임과 같은 화면 전체가 주로 움직이는 케이스에는 잘 맞는다. 말에 타서 달린다거나, 돌아 다니는 거상에 매달린, 카메라 전체가 drastic하게 움직이는 액션이 눈에 띄었던 PS2용 「완다와 거상」에서는 이 기법을 활용해, 매우 높은 효과를 얻었다.

가로방향으로 2차원적인 처리를 하는 카메라블러의 개념도

원래 프레임(좌)과 블러 처리한 프레임(우) ※「원다와 거상」에서 인용

깊이 방향으로 2차원적인 처리를 하는 카메라 블러의 개념도

원래 프레임(좌)과 블러처리한 프레임(우) ※「완다와 거상」에서 인용

그러나, 이 카메라블러에서는, 씬내에 존재하는 하나 하나의 3D오브젝트가, 각각의 임의의 빠른 움직임을 실시한다고 해도, 그 움직임 각각에 맞는 블러 처리를 해줄 수는 없다. 이것은 카메라 블러가 표시 프레임(2D영상)을 단지 화상처리 해주는 것 뿐인 「2D블러」이기 때문이다.

뒤에 소개하는 3개의 모션블러 기법은, 각각의 캐릭터들에게 개별적으로 입체적인 블러를 해 줄 수 있는, 이른바 3차원 베이스의 모션블러를 실현한다. 그리고, 이 3차원적인 흐림(흔들림) 생성에 지오메트리셰이더를 이용한다.


그 캐릭터의 움직임에 블러를 실시하는「 액션블러


캐릭터가 펀치나 킥등의 고속 액션을 했을 때에 일어나는 블러 표현에 적합한 기법이다. 굳이 이름을 붙힌다면 「액션블러」라는 느낌의 기법이다. 최근에는 「오브젝트 모션 블러」(OMB, Object Motion Blur)로도 많이 불린다.

이 기법에서는, 3D의 캐릭터의 정점 정보에 속도벡터(속력, 움직이는 방향) 값을 갖게해 이 정보를 바탕으로 지오메트리셰이더에서 정점을 잡아 늘리는 그런 이미지로 폴리곤을 새로 생성한다. 덧붙여 그 동작의 과거의 궤적 뿐만이 아니라, 미래의 진행 방향으로도 폴리곤을 생성하는 것이 특징이다.

지오메트리셰이더를 활용해서, 움직이고 있는 속도와 그 방향으로 폴리곤을 생성함. 현재 위치를 중심으로 과거의 궤적과 미래의 궤도에도 생성해 주는 것이 특징임.

<그림 설명>
(검은선) 현재 타임에서의 트라이앵글
(녹색선) 이전과 다음 타임들에서의 extruded 트라이앵글
(빨간선) 트라이앵글의 모션 라인

그리고, 생성한 다각형에 대해서, 현재를 기준으로서 멀리 떨어지면 떨어질 수록 α값(0~1 사이의 값을 취해, 0은 완전히 투명, 1은 완전히 불투명)을 낮게 설정한다. 이 α정보는 근사적으로는 「화면상의 각 픽셀 단위의 속도정보의 분포에 해당된다」고 볼 수 있으므로, 원래 폴리곤에 붙이는 텍스처에 대해서, 이 정보에 따라 조금 옮겨서 텍셀을 참조해 적용해 간다. 현재 시간에서 멀면 멀수록, α값이 제로(투명)에 가까워지므로 샘플링 한 텍셀의 색은 연하게 합성된다. 이것에 의해 가장 먼 과거와 제일 먼 미래의 픽셀은 연하고, 현재에 가까울 수록 진하게 …… 라는 그림이 되어 속도감을 연출할 수 있게 된다.(계속)

현재 위치에서 멀면 멀수록 α값은 0으로. 이것은 근사적으로 화면상에서 픽셀 단위의 속도를 나타내고 있다. 이 값을 오프셋값으로 해서, 텍스처로부터 샘플링 해서 블러를 표현한다

다이렉트X10의 데모로 부터. 풍차는 항상 등속 회전운동을 하고, 몬스터는 격투 액션을 선보임. 각각의 속도와 방향에 맞는 블러가 잘 나오고 있는 점이 카메라 블러와는 크게 다른 점



지오메트리셰이더 : 새로운 표현(2.5D Blur)



지오메트리셰이더를 활용한 새로운 표현(2) ~
입체적인 모션블러를 화상처리로 실현시키는 2.5D 블러기법

지난회에서 다룬 오브젝트 모션블러(액션블러)와 매우 흡사하지만, 미묘하게 구현방법이 다른 기법이 2003년 의 게임 개발자 회의 「GDC 2003」에서 NVIDIA의 Simon Green씨에 의해 발표되었다. 그것이 「2.5D 블러」라고 불리는 기법이다. 이것은 캡콘의 「로스트 플라넷」이나 크라이텍의 「CRYSIS」에서 효과적으로 구현되었던 것으로, 그 유효성이 널리 알려진 것이다.

기본방침은 아래의 수순과 같다.

우선, 씬을 통상대로 렌더링하고, 이것을 뒤의 렌더링 패스에서 참조하기 위한 소재로 한다.

블러를 하고 싶은 3D 대상 오브젝트의 정점에는 앞 프레임에서의 화면상의 좌표를 저장해 두고, 정점셰이더에서, 현재 프레임의 화면 좌표를 계산해서, 보관하고 있던 이전 프레임의 화면 좌표와의 차분(差分)을 산출해 속도와 방향을 계산해, 이 값들을 텍스처에 렌더링한다. 폴리곤을 색 정보가 아닌 이 속도와 방향 정보를 그린다 …… 라는 이미지이다. 이 처리에 의해서 생성되는, 화면상의 모든 픽셀의 속도 정보들을 이 기법에서는 특히 「속도맵」(Velocity Map)이라고 부른다.

최종 렌더링 패스에서는, 이 속도맵을 참조해 속도 정보를 가져와 처음에 렌더링 한 씬 텍스체에서 이 속도 만큼 옮겨서 샘플링(읽어 내다)함으로써 최종 프레임을 생성한다.

                               속도맵의 개념

                       속도맵을 참조한 블러생성의 원리


<그림 설명>
상:
이전(前)、현재、
(박스 상) A의 속도와 방향은 (A의 위치 - A‘의 위치) ÷ dt 로 구한다. B,C도 같다.
※dt는 앞프레임에서 현재 프레임까지 경과한 시간
(박스 중) 속도정보와 방향 정보로 폴리곤을 렌더링
(박스 하) 모든 픽셀의 속도와 방향정보 이것이 속도맵
하:
(박스 좌) 이 □<픽셀>이 이 방향(화살표방향). 이 속력(화살표의 길이)이라고 하면
(박스 중) 이 속도벡터 만큼 되돌아간 위치의 씬 텍스처의 텍셀을 샘플링
(박스 중) 실제로는 샘플링 지점을 많이 추가해서 파란색□, 녹색□도 샘플링한다.


씬 텍스처로부터의 샘플링은 1개만이 아닌, 현재 프레임에서의 위치와 이전 프레임에서의 위치까지의 거리를 N등분 한 각 지점에서 총 N개의 값을 읽어 오는 것이 일반적이다. 현재 위치와 이전 프레임에서의 위치가 많이 떨어져 있는 경우는 속도가 그만큼 빨랐음을 의미하고, 씬 텍스처로부터 샘플링한 텍셀은 연하게 블렌드 하는 방법도 자주 사용된다. 이렇게 해서 현재위치에 가까운 곳의 잔상은 진하게 보이고, 먼 곳의 잔상은 연하게 할 수 있어, 보다 약동감이 있다.

이 방법에서 포인트가 되는 것은 속도맵을 작성하는 부분이다.

어떤 점이 다른 위치로 움직였을 때에는 그 전후의 위치 정보의 차분(差分)만으로 속도와 방향을 산출할 수 있지만, 이것이 폴리곤이면 좀더 까다롭다. 어떤 폴리곤이 어떤 위치로부터 다른 위치로 움직였을 때에, 이전 위치에서 현재 위치까지의 그 폴리곤의 "면(面)"으로서의 궤적과 방향을 구하고 싶은 것이다.

이것은 이미지적으로 말하면, 움직이고 있는 폴리곤에 대해, 이전 프레임에서의 위치로부터 현재 위치까지 "붕~"하고 잡아늘인 것 같은 폴리곤으로 변형함으로써 구할 수 있다.

이 변형처리에는 미국 브라운 대학의 Matthias M. Wloka씨등이 「Interactive Real-Time Motion Blur」(1995)에서 발표한, 움직임에 맞는 폴리곤 변형처리 기법를 응용한다.

이것은, 각 정점에 주목해서, 그 방향(법선벡터)이, 진행 방향에 가까우면 가까울수록 현재 상태에 가까운 정점좌표로 하고, 차이가 나면 차이가 날수록 과거의 정점좌표로 정점을 변위시킨다 ……라고 하는 처리를 통해 실현된다.

즉, 이 처리에서는 원래부터 가지고 있던 현재 위치의 정점과, 이전 프레임에서의 위치에 새로운 정점을 생성해서 새로운 폴리곤을 만들 필요가 생긴다. 그래서, 지오메트리셰이더가 여기서 활약하는 것이다.

이동벡터와 폴리곤의 법선 벡터와의 관계성을 보고, 그 폴리곤의 궤적을 생성. 실제의 속도맵은 이 폴리곤의 궤적에 대해서 행해지는 것이 된다.

<그림 설명>
1:
현재、이전、폴리곤법선벡터
이 폴리곤이 이렇게 움직였다고 했을 때
2:
(버블 상) A의 법선벡터는 이동 벡터와 같기(가깝기) 때문에 현재 위치를 사용한다.
(버블 하) B와 C는 이동벡터와 방향이 다르기 때문에 앞 타임에서의 위치에 정점을 생성해서 결합한다 -> B‘, C‘
지오메트리셰이더의 활약!
3:
폴리곤의 궤적이 완성됨
4:
이 폴리곤의 궤적에 대한 속도, 방향 정보를 생성 -> 속도맵


또한, 지오메트리셰이더를 가지고 있지 않은 다이렉트X 9세대 SM3.0대응 GPU에서, 이 2.5D 블러 기법을 구현하려면 , 이전 위치로 잡아늘이기 위한 정점을, 3D모델 쪽에 넣어 두는……고안이 필요했었다. 정확히 스텐실 그림자 볼륨 기법의 그림자 생성에서, 그림자 영역 생성을 위해 잡아 늘이는 용도의 정점을 (사전에) 넣어 두는 것과 매우 비슷하다.

캡콘의 「로스트 플라넷」에서는 폴리곤 궤적 생성을 위한 더미 폴리곤(축퇴 폴리곤)이 3D모델에 넣어져 있었다. 지오메트리셰이더가 사용 가능한 GPU라면 이런 사전 처리는 필요가 없다. 그런 의미에서는, 이 2.5D 블러 기법에 있어서는, 지오메트리세이더를 가속화를 위해서 활용한다고도 말할 수 있다.(계속)

왼쪽이 축퇴 폴리곤이 없는 12,392 폴리곤이고 오른쪽이 축퇴 폴리곤이 있는 17,765 폴리곤이다. 이 차이 만으로도 이 모션블러 생성을 위한 불필요한 정점 처리 부하가 생길 수 있다.




지오메트리셰이더 : 새로운 표현(Line-Based Blur)


지오메트리 셰이더를 활용한 새로운 표현(3) ~ 라인베이스 블러

지난회에서 다룬 2.5D 블러 기법에는, 한가지 문제가 있다.

그것은, 최종적으로는 화상처리적으로 블러 처리를 하므로, 속도가 다른 물체들이 서로 겹쳐 있는 곳에서는, 부자연스러운 블러가 나와 버리는 것이다. 예를 들면, 움직이고 있는 물체 보다 정지해 있는 물체가 더 앞에 있을 경우(시점에서 더 가까울 경우), 이 정지물의 픽셀이 뒤의 움직이는 물체의 블러로 들어가 버리거나 하는 것이다.

이것에 대해서는, 조금만 생각해 보면 대처가 가능하다고 여겨진다.

속도맵을 생성할 때에는, 지난회에서 말한 3D모델을 잡아서 늘리는 처리를 하는데, 이 처리가 끝났을 때는, 잡아 늘린 3D모델을 포함하는 씬의 깊이 정보(Z버퍼)가 완성 되어 있게 된다. 블러 생성 단계에서 씬 텍스처를 읽어 올 때, 이 Z버퍼를 참조해서, 그 참조하려는 곳이 보다 앞이면(시점에서 더 가까우면), 이것은 잔상 생성을 위해 참조할 대상으로는 적합하지 않다고 판단을 내린다. 이것에 의해 부적절하게 블러 픽셀이 흘러 들어오는 것을 피할 수 있다.

「로스트 플라넷」(캡콘)으로 부터. 씬 텍스처

         씬 텍스처의 깊이 정보

                          속도맵

방법을 고안하지 않으면 이와 같이, 블러가 되는 곳에 씬의 전후관계를 무시한 픽셀의 침입이 일어나 버린다

속도맵의 깊이 정보를 구해서, 이것을 비교해, 앞에 있는 오브젝트의 픽셀이 뒤의 블러에 영향을 주지 않도록 해 주면……

픽셀의 침입을 큰폭으로 감소 시킬 수 있다


덧붙여, 캡콤의 「로스트 플라넷」에서는, 먼 곳의 움직임에 대해서는, 이 2.5D 블러를 해줘도 눈에 잘 띄지 않기 때문에, 평범한 카메라 블러로 대신 할 수 있다라는 근사 개념을 도입해서, 모션 블러의 생성 부하를 감소 시키고 균일화를 도모하고 있다.

하지만 앞에서 기술한 이론 그대로 카메라 블러를 도입해 버리면, 화면 전체가 너무 움직여, 2.5D 블러와의 친화력이 좋지 않기 때문에, 카메라 블러를 2.5D블러에 통합하는 형태를 취한다.

여기에는 씬의 깊이정보를 이용한다. 씬의 깊이정보는 씬의 각 픽셀의 원근 정보가 기록되어 있으므로, 각각의 픽셀에 대해, 이 원근 정보와 카메라의 이동 벡터 정보를 이용해 계산해서, 속도맵용의 값을 출력해 버리는 것이다. 예를 들면 카메라가 옆으로 이동했을 경우, 가까운 픽셀은 옆으로 많이 이동하고, 먼 픽셀은 옆으로 조금 이동한다. 이러한 정보를 속도맵에 그려 넣어 버린다. 이렇게 해서, 카메라 블러와 2.5D블러를 통합시킬 수 있다.

지오메트리셰이더에 의한 라인베이스 블러

「로스트 플라넷」의 다이렉트X 10 패치 적용 후에는, 앞에서 기술한 2.5D 블러에, 한층더 지오메트리셰이더를 효과적으로 활용한 라인 베이스의 모션 블러를 추가 합성하고 있다.

라인 베이스의 모션 블러에서도, 속도맵을 생성하는 곳과 블러 생성원이 되는 통상적으로 렌더링 한 씬 텍스처를 준비하는 곳까지는, 2.5D 블러와 같다.

그리고, 속도맵을 참조해서, 꺼내 온 속도와 같은 방향의 선분(라인)을 지오메트리세이더를 이용해 생성한다.

이 선분의 색은, 씬 텍스처로부터 꺼낸 색을, 선분의 시점에서의 색으로 하고 종점으로 갈수록 색을 연하게 해서 그린다. 라인이 길면 길수록 색이 연해져, 그 연해지는 정도를 α값으로 넣어 간다. 나중에 이 α값은 2.5D 블러와의 합성 마스크로 이용한다.

덧붙여, 라인을 그리는 것은 스크린좌표계에서 하지만, 제대로 씬의 깊이값을 비교하면서 실시하므로, 씬의 차폐구조를 고려한 블러가 그려지게 된다.

                                    라인 블러의 개념도

<그림 설명>
(박스 좌) 속도맵으로 부터
(박스 중) 라인을 생성한다. 그릴 때에는 씬 텍스처에서 대응하는 위치의 색을 샘플링해서 가져온다
(원) 씬텍스처
(박스 우) 꺼내온 색에서 라인의 시작점에서 끝나는 점까지 그라디에이션해서 그린다.(점점 연하게)
(원) 라인블러 출력 버퍼
(버블)                  현재위치     이전 위치
             색           진하다         연하다
            알파값      불투명         투명
이 처리를 속도맵의 모든 텍셀에 대해서 해준다.


이 공정을 속도맵의 모든 텍셀에 대해서 하게 되지만, 이것을 렌더링 해상도로 하면 선분이 너무 많아 지므로 , 선분 생성용 속도맵은 적당한 저해상도로 하고, 라인블러를 생성하는 버퍼도 똑같이 적당한 저해상도로 한다.

최종적으로는 저해상도의 라인블러 결과를 확대해서, 렌더링 해상도와 똑같은 해상도인 2.5D 블러 결과와 해상도를 일치시켜서 합성해서 완성한다.(계속)

 

「로스트 플라넷」에서. 2.5D 블러만 한 경우.
블러에 면의 경계와 같은 것이 나와 버린다.

  2.5D 블러에 라인블러를 추가한 경우.
  면의 경계감이 사라져, 움직임의 약동감을
  강조하는 극적인 효과선(效果線)으로 보인다.




지오메트리셰이더 : 새로운 표현(Displacement Mapping)


지오메트리셰이더를 활용한 새로운 표현(4) ~
변위매핑(Displacement Mapping)

완전히 평평한 평면(단일 폴리곤)에 대해서, 미세한 요철이 있는 것처럼 음영 처리를 하는 테크닉을 범프 맵핑이라 부르고, 이것의 주류 기법은 법선맵을 활용한다고 본연재의 14회~ 16회에서 이미 말했다.

법선맵을 활용한 범프매핑에서는 실제로 요철이 생기는 것이 아니라, 요철이 있는 것처럼 음영 처리를 할 뿐이므로, 그 폴리곤면에 시점을 접근 시켜서 그 요철을 보면, 실제로는 요철이 없는 것이 드러나 버린다.

이것을 보다 발전시켜, 텍스처에 기재된 요철정보(높이맵)에 따라서, 실제로 3D모델을 지오메트리 레벨로 변위(displace) 시켜 버리는 기술을 「변위매핑」(Displacement Mapping)이라고 부른다.

이미지적으로는, 이미 존재하는 기본 모델에 대해서, 텍스처에 기재된 요철 정보로 디테일을 변형시킨다(정형한다)……는 그런 느낌이다.

텍스처에 쓰여져 있는 요철 정보로 3D모델을 변형시키는 것은 「정점셰이더에서 텍스처를 읽어내 정점을 변위시킨다」라고 하는 작업이 필요하게 된다. 즉, 정점으로부터 텍스처를 참조하는 「Vertex Texture Fetching」(VTF:정점 테크스체링)이라고 불리는 기능에 GPU가 대응하고 있어야 한다. VTF는 다이렉트X 9 세대 SM3.0 대응 GPU에서는, 지원되고 있는 GPU가 혼재했기 때문에, 호환성면에서 적극적으로 활용되는 국면이 적었지만, 다이렉트X 10 세대 SM4.0 대응 GPU에서는 모든 GPU가 대응해야 할 필수기능이 되었기 때문에 적극적으로 이용해도 문제가 없다.

여기에서는, 범프맵핑(법선매핑)보다 좀더 앞선, 변위매핑을 실현하는 두가지 방법을 소개해 나간다.

                                         법선맵에 의한 범프매핑과 변위매핑의 차이

<그림 설명>
平面 (평면)
상:
(제목) 법선맵을 활용한 범프매핑
(박스 좌) 법선맵을 활용했다.
(버블 좌) 법선벡터를 텍스처화 한 것이 법선맵
(박스 우) 픽셀단위의 라이팅을 해서 요철이 있는 것처럼 보이게 한다.
(버블 우) 실제로는 요철(凹凸)이 있을리 없기에 시선을 접근시켜 보면 요철이 없는 것이 드러난다.
하:
(제목) 변위매핑
(버블 좌) 요철을 농담(濃淡)으로 표현한 텍스처가 높이맵(Height Map)
(박스) 이 높이맵을 활용해 실제로 지오메트리 레벨의 요철(凹凸)을 생성하는 것이 변위매핑
(버블 우) 실제로 요철을 생성하기 때문에 시점을 가까이해서 봐도 확실하게 요철이 보인다.

폴리곤을 분할해서 변위매핑을 해 주는 방법

이미 존재하는 3D모델에 대해서 변위매핑을 실행하는 경우, 디테일의 요철(凹凸)을 기재한 높이맵 해상도와, 그것을 적용하는 쪽의 3D모델의 정점 해상도와, 균형이 맞지 않으면 변위매핑의 품질은 떨어져 버린다. 그런 해상도 밸런스를 신경쓰지 않으면 안되는 경우에는, 변위매핑은 활용하지 않고 , 모델제작(othoring) 단계에서 처음부터 그 디테일을 적용한 3D모델을 준비하는 것이 실행시의 부하도 적어 지고 덜 귀찮다.


변위매핑을 하려면 , 높이맵 텍스처와 3D모델의 폴리곤수의 밸런스가 중요하다

<그림 설명>
높이맵、광원
(버블) 이런 요철을 높이맵化
(박스 상좌) 평면이 적절한 폴리곤 수로 구성되어 있으면..
(박스 상우) 그대로의 요철 품질로 변위매핑이 가능하지만...
(박스 하좌) 평면이 충분한 폴리곤 수가 아니면...
(박스 하우) 요철이 정확하게 폴리곤 모델에 반영되지 않는다.

그러나, 만약, 정점수가 적은 폴리곤모델에 대해서, 해상도가 높은 요철(凹凸) 정보를 적용해서, 필요에 따라서 정점을 증가시켜서 변위매핑이 가능하다면, 매우 편리하다. 시점에서 멀 때는 저폴리곤으로, 법선맵으로 요철을 표현하고, 시점에 가까워지는 정도에 따라서 폴리곤 분할수를 올리고, 요철 정보의 반영량도 늘리고, 정밀도가 높은 정형(변형)을 실시하도록 하면, 지오메트리의 LOD(Level of Detail)를 실현할 수 있다.

시점으로부터의 거리에 따라 필요한 폴리곤 분할을 실시하고 나서 변위매핑을 실시하는 것이 이상적

<그림 설명>
높이맵、광원
(박스 좌) 시점이 가까울 때는 하이폴리곤으로 변위매핑
(박스 중) 시점이 멀 때는 로우폴리곤으로 변위매핑
(박스 우) 변위매핑
(버블 상) 변위대상의 정점이 적으면 변위매핑 후의 요철의 품질이 떨어지지만 멀기 때문에 눈에 띄지 않는다.
(버블 하) 하이폴리곤의 변위매핑에서는 요철의 품질은 향상된다. 3D모델이 크게 그려지는, 시점이 가까울 때 사용

이 구조를 실현하기 위해서는 적용하는 요철 정보의 정밀도에 맞추어, 3D모델의 정점을 늘려주는 구조가 필요하다.

3D모델의 정점의 증가……는 좀더 자세히 말하면, 원래의 3D폴리곤 모델을 세세하게 분할해 줄 필요가 있다는 것이다.

이 「폴리곤 분할 처리」(Subdivision)를 실현하는 것이 「테셀레이션」(Tessellation)이라는 테크닉이다. 테셀레이션을 실시하는 기능 모듈을 특히 「테셀레이터」(Tessellator)라고 부른다.

                   테셀레이터는 폴리곤을 분할해 주는 상점

<그림 설명>
테셀레이터、
(버블 좌) 사각형(삼각형 두개)를 분할 레벨2로
(버블 중) 예~ 분할할게요~♪
(박스 상) 테셀레이터는 폴리곤을 주어진 조건으로 분할하는 기계
(박스 하) 폴리곤분할이란 정점이 증가하는 것
(버블 우) 지오메트리셰이더에서 구현 가능해?


ATI의Radeon HD 2000/3000시리즈에는, 실제로 이 테셀레이터의 구조를 하드웨어적으로 구현한 기능블럭이 탑재되어 있지만, 다이렉트X 10에서는 표준기능으로 지원되지 않기 때문에, 호환성의 측면에서는 사용하기가 약간 어렵다. 덧붙여서, 테셀레이터 기능의 다이렉트X에의 편입은 다이렉트X 11에서 실현되는 것이 거의 확실히 약속되어 있다.(계속)

민간 전용GPU로서 세계에서 처음으로 하드웨어 테셀레이터를 탑재한 것은, Matrox가 2002년에 발표한 「Parhelia-512」였다

   최근에는 AMD가 2007년에 발표한「Radeon
   HD 2000」시리즈가 하드웨어 테세레이터를
   탑재했다. 사진은 최상위모델의 「Radeon
   HD 2900 XT」



 

지오메트리셰이더를 활용한 새로운 표현(5) ~ Displacement Mapping

테셀레이션은, 단적으로 말하면 정점의 증가, 즉 폴리곤을 늘리는 것이다. 그렇다는 것은, 「지오메트리셰이더를 사용할 수 있는 것 아닌가?」라는 것이 된다.

ATI는, Radeon HD 2000/3000 시리즈에 테셀레이터 하드웨어가 있음에도 불구하고, 이 테셀레이터를 지오메트리셰이더로 구현하는 예을 제시했다.

ATI의 샘플에서는, 3D모델의 애니메이션이나 스키닝 처리는 통상대로 정점셰이더에서 해 버리고, 한차례, 좌표변환을 끝낸 정점 데이터들을 지오메트리셰이더로 보내, 여기서 테셀레이션을 한다.

ATI의 구현 샘플에서 테셀레이션은 지정한 1에서 9까지의 테셀레이션 레벨(분할 레벨)로 가변적으로 할 수 있는 구조로 되어 있었다.

분할 레벨을 2로 설정했을 때는, 본래의 삼각형의 변들을 2등분 한다. 3이면 변이 3등분,4면 4등분이다. 이 구현에서는 분할 레벨은 정수만 가능하다. 덧붙여, 이런 분할 레벨을 정수로 주어지는 테셀레이터의 구조를 「이산형 테셀레이션」(Discrete Tessellation) 이라고 한다. 그리고 부동 소수점으로 주어지는 구조는 「연속형 테셀레이션」(Continuous Tessellation)이라고 부르고, 한층더 삼각형의 변마다 다른 분할 레벨을 설정할 수 있는 구조는 「적응형 테셀레이션」(Adaptive Tessellation)이라고 부른다.

                                              테셀레이션의 종류(이산형, 연속형, 적응형)


막연히 「분할한다」라고 이야기 하지만, 지오메트리셰이더에서 「어떻게 폴리곤을 생성하면 좋을까?」쉽게 떠오르지 않을지도 모르겠다.

ATI의 구현에서는, 프로그램 루프로 돌리는데도 괜찮은, 심플하고 독특한 분할 방법을 구현하고 있다.

우선, 분할 레벨이 몇 개라 할지라도 최초의 삼각형은 최소 사이즈로 1개 생성하고, 이어서,3개를 서로 엇갈리게 나열해 생성하고, 이어서 5개, 7개…… 로 홀수개로 서로 엇갈려서 나열해 간다. 이것으로 지오메트리셰이에서 삼각형 한변을 분할레벨의 값으로 분할한 형태의 삼각형을 생성할 수 있게 되는 것이다.(계속)

지오메트리세이더를 사용한 폴리곤 분할. 분할이라고 하기 보다는, 분할한 사이즈의 폴리곤을 지오메트리셰이더를 사용해 생성한다는 이미지

<그림 설명>
상:
(제목) 분할레벨이 3인 경우
(박스) 각변을 3등분
분할완료
하:
(제목) 실제의 구현에서는...
(박스 좌) 분할레벨이 3인 경우라면...
(박스 우) 우선 여기부터 1개 생성 -> 다음은 3개 생성 -> 다음은 5개 생성
             분할레벨이 3이라면 1개, 3개, 5개의 3단계 분할처리로 완료
             다른 분할레벨에서도 똑같은 형태의 수순

지오메트리셰이더를 활용한 새로운 표현(6) ~ 변위매핑

분할만 한 3D모델에, 직접 변위매핑을 해도 좋지만, 모처럼 폴리곤 분할을 했으므로, 이 분할한 3D모델을 보다 부드럽게 보이게 하는 방법도 고안하면 고품위의 렌더링을 기대할 수 있다.

ATI의 지오메트리셰이더를 사용한 테셀레이션 기능은, 그러한 아이디어까지 구현되어 있다.

테셀레이션 시에 새롭게 생성된 폴리곤에 대해서, 그 정점 좌표를 고차 곡면 생성 기법인 「베지에 곡면」(Bezier Curved Surface) 방정식으로 산출된 위치로 근사하는 것이다. 베지에 곡면의 좌표나 법선벡터의 계산 방법이나, 그런 정보들을 분할된 삼각형의 정점 정보에 넣어주는 구체적인 수단에 대해서는,ATI의 개발자 사이트에 논문이 게재되어 있으므로, 그 쪽을 참조하기 바란다.

간단히 개념만 설명하면, 분할 대상인 삼각형의 세정점을 지나는 베지에 곡면을 생성해서, 그 곡면에, 분할한 삼각형을 적용시켜 가는 그런 이미지다. ATI의 구현에서는 세개의 정점을 베지에 곡면의 제어점으로 해서 삼차 베지에 곡면을 사용하고 있다. 덧붙여 이 법선 벡터를 부드럽게 뽑아 나가는 곡면 분할 방법은, 「법선벡터(Normal Vector)」의 "N"과, 「모직을 짠다」 「덧댄다」의 "PATCH"를 취해서 N-PATCH법, 혹은 「PN Triangle」(PN=Point Normal)법이라고 불린다.

                     삼차 베지에 곡면

                   입력 정점

 

왼쪽이 각 정점을 직선으로 묶고 나서 음영 처리를 실시한 것. 오른쪽은 각 정점을 삼차 베지에 곡면으로 묶어 음영 처리를 실시한 것

  다각형 분할 레벨(상단)과, 그
  분할 레벨로 베지에 곡면을 적용했을
  때의 렌더링 결과(하단)


세정점을 지나는 베지에 곡면은 몇개의 패턴을 생각할 수 있는데, 제어 파라미터로서 각 정점의 법선 벡터를 도입하면 적합한 베지에 곡면은 저절로 결정되어져 온다. 그림은 세정점의 법선벡터에 따라서 달라지는 세개의 베지에 곡면을 나타낸 것

이와 같이 해서, 폴리곤을 분할하고, N-PATCH로 변위시켜서 생겨난 3D모델을, 다시 정점셰이더에 되돌려 VTF에서 요철 정보로 변형해 변위매핑을 실행……이것으로 지오메트리 관련 처리는 완료 된다. 이 이후의 것은 픽셀셰이더 phase로 이행한다

로우폴리곤 모델을 적당하게 폴리곤을 분할해서, 높이맵으로 변위매핑한다……라는 것이 이상적인 구현. VTF와 테셀레이션의 기능을 구현하면 이것이 가능하게 된다

더욱더 이 기능를 고도로 한다면 , 시점으로부터의 거리에 따라서, 볼룩한 상태나 오목한 상태가 어떤 일정 레벨 이상인 요철에 대해서만, 변위매핑으로 지오메트리 레벨에서의 변위를 해주고, 그 이하의 요철에 대해서는, 법선 맵에 의한 범프 맵핑으로 표현하면 좋을 것이다. 이러한 적응형 처리로 변위매핑과 법선맵에 의한 범프매핑을 나누어 사용하면, 지오메트리 부하와 픽셀 부하의 균형을 맞출 수 있을 것이다.(계속)

이상적인 것은 시점으로부터의 거리에 따라 범프 맵핑과 변위매핑을 동시에 사용하는 하이브리드 방식

<그림 설명>
(버블 좌) 이런 크고 작은 요철(凹凸)이 있다고 가정했을 때
상:
광원, 법선맵
(박스 상) 범프매핑
(박스 하) 시점에서 멀 때는 범프매핑만으로 요철을 표현
하:
법선맵, 높이맵
(버블 상) 그 시점에서 눈에 띄지 않는 것은 범프매핑
(버블 하) 그 시점으로 부터 확실하게 만들지 않으면 부자연스러운 요철은 확실하게 변위 맵핑
(박스 좌) 시점에 가까워지는 것에 따라 폴리곤을 분할해 감...
(박스 우) 시점으로 부터 실제로 요철이 없으면 부자연스럽게 보이는 요철은 변위매핑하고, 눈에 띄지 않는 요철은 범프매핑한다.



지오메트리셰이더를 활용한 새로운 표현(7) ~

폴리곤 기둥을 세워 국소적으로 볼륨렌더링을 하는 변위매핑 

형태가 크게 바뀌지 않는, 이를테면 디테일한 장식 정도의 3D모델의 형태 변형이라면, 테셀레이터를 구현하지 않는 변위매핑(Displacement Mapping)의 실현방법 쪽이 더 무게가 실린다.

그것은 기본 형태의 3D모델의 외피(外皮)에 각주(角柱, 각이 진 기둥 모양의 폴리곤)를 세워, 거기에 대해서만 국소적으로 볼륨 렌더링을 실행해주는 방식이다.

각주(角柱)를 세우는 것은 계산량 면에서 베지에 곡면을 계산하는 것보다는 부하가 낮다. 그러나, 실제로 지오메트리레벨의 볼록다각형을 만는 것이므로 입체적인 요철(오목과 볼록) 표현이 가능하다.

이 방법에서는, 대상 3D모델을 구성하고 있는 폴리곤(삼각형) 중에, 변위매핑을 할 대상에 대하여, 지오메트리셰이더를 이용해 그 폴리곤을 바닥면(밑면)으로 하는 각주(角柱)를 세우는 것 부터 시작한다.

폴리곤 기둥을 세우고, 국소적으로 볼륨 렌더링을 해주는 변위매핑의 개념

<그림 설명>
(박스 좌) 지오메트리셰이더에서 법선벡터 방향으로 3개의 옆면(변)을 만든다.
(박스 우) 삼각 기둥을 생성
(버블) 이 삼각 기둥에 대해서 국소적으로 볼륨 렌더링을 한다.
완성

접근방법에 대한 이미지로서는, 각주(角柱)로 대략적인 볼록(凸)을 만들고, 거기서 부터 높이맵을 이용해서, 픽셀 단위의 요철을 볼륨 렌더링이라는 조각칼로 깎아 나가는 느낌을 연상하면 될 것이다.

앞에서 말한 것처럼, 삼각기둥의 바닥면(밑면)은 3D모델의 폴리곤이다. 이 바닥면으로부터 세운 세 옆면은, 이 바닥면 폴리곤의 세정점들의 법선 벡터 방향으로 세운다. 이렇게 함으로써, 인접한 3D모델의 폴리곤으로부터 차례차례로 각주를 세워 갈 때에도  틈새 없이 끝난다.

바닥면 폴리곤의 세정점의 각각의 법선벡터의 방향으로 옆면들을 세워 삼각기둥을 만든다.

이 바닥면 폴리곤의 법선 벡터 방향으로 늘린 삼각기둥을 지탱하는 세변의 길이는, 만들어 낼 볼록부분의 최대 높이값으로 한다.

삼각기둥의 옆면들은 두개의 삼각형으로 만들어지므로, 이것을 이용하면 이 삼각기둥들은 3개의 사면체로 분할할 수 있다.

삼각기둥은 옆면 폴리곤을 한면으로 하는 세개의 사면체로 분할할 수 있다

이후는 이 3개의 사면체에 대해서, 각 사면체의 밑면의 깊이값과, 요철(凹凸)을 기록한 높이맵으로부터 꺼낸 높이값을 비교해서 시선이 충돌하고 있는지 아닌지를 판단해 볼륨 렌더링을 해 나간다. 이 부분은 본연재 제17회 「시차 차폐 매핑」과 거의 같다.

시선을 조금씩 늘려 가면서 그 위치에서의 사면체의 밑면의 깊이값과 높이맵의 높이값를 비교해 충돌하고 있는지를 판정. 충돌하고 있으면 거기에 대해서 픽셀 음영 처리를 실시한다. 아니면 시선을 좀더 늘리고……이후 반복. 마지막, 세번째 사면체를 빠져 나오는 시점에 처리를 종료한다

이 방법의 경우, 맨처음 방법과 비교해 정점셰이더나 지오메트리셰이더의 부하는 적지만, 그 만큼 픽셀셰이더에서의 부하는 높아진다.

변위매핑에서 생성된 요철(凹凸)의 셀프 그림자 표현도, 시차 차폐 매핑에서 소개한 셀프 그림자를 추가하는 방법을 응용하면 불가능하지는 않지만, 부하와 난이도는 높아진다.

 

이 방식의 변위매핑 데모(다이렉트X SDK의 데모로 부터). 변위매핑에 의해 등지느러미와 가시가 추가되어 있다.

  끄면(Off) 등지느러미와 가시가 사라진다


 

Posted by 노을삼킨별
,

아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/지오메트리%20셰이더



지오메트리셰이더 : 가속을 위한 활용(Stencil Shadow Volume 가속)

2008-09-15 22:05:00
2007年1月、Windows Vistaの登場と共にDirectX 10がリリースされ、同時にプログラマブルシェーダ仕様(SM:Shader Model)は4.0へとバージョンアップがなされた。このSM4.0で最大のトピックといえるのが「ジオメトリシ ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.



 

2007년 1월, 윈도우즈 비스타의 등장과 함께 다이렉트X 10이  릴리즈됨과 동시에 셰이더 사양(SM:Shader Model)은 4.0으로 버전업 되었다. 이 SM 4.0에서 최대 토픽이라 할 수 있는 것이 「 지오메트리셰이더 」(Geometry Shader)이다. 이것은 지금까지 GPU 내부에서는 할 수 없었던 정점을 증가 또는 감소 시킬 수 있는 획기적인 기능이다.

아직 나온지 얼마 되지 않은 기능이라서, 그 응용방법은 현재도 각 개발씬들에서 연구들이 진행되고 있는 상황인데, 서서히 독특한 사용법들이 계속해서 등장하고 있다.

여기에서는 지오메트리셰이더의 대표적인 활용방법 몇가지를 소개한다.


지오메트리셰이더란?

본연재 초반에서도 말한 것처럼, 지오메트리셰이더는 다이렉트X 10 / SM 4.0 환경이 아니면 사용할 수 없다. 다이렉트X10은 윈도우즈 비스타 전용으로 공급되므로, 즉 윈도우즈 비스타 환경이 아니면 사용할 수 없다.

지오메트리셰이더가 하는 일은 프로그램에 따라서 정점을 증가 또는 감소시켜주는 것이다. 정확하게 말하면 선분, 폴리곤(삼각형), 파티클 같은 「프리미티브」를 증가 혹은 감소 시킬 수 있다. 덧붙여서 여담이지만, 지오메트리셰이더는 다이렉트X 10 개발 초기에는 「 프리미티브셰이더 」(Primitive Shader)라고도 많이 불렸다.

                              지오메트리셰이더의 개념


<그림 설명>
정점、지오메트리셰이더프로그램
(버블 상) 지오메트리셰이더는 셰이더프로그램에 따라 정점을 증가/감소 시키는 일을 한다.
ポリゴン(폴리곤)
(버블 하) 실질적으로 지오메트리셰이더는 폴리곤이나 선분등을 만들어 낼 수 있다.


그런데, 이 지오메트리셰이더를 사용하면 대체 어떤것이 가능한 걸까?

지금까지 등장한 여러가지 지오메트리셰이더의 활용들을 분류해 보면 2종류로 나눌 수 있다.

하나는 「렌더링 가속을 위한 활용」이고, 또 하나는 「새로운 표현을 위한 활용」이다.
전자는 표현된 결과는 똑같지만, 지오메트리셰이더에 의해서 렌더링 퍼포먼스를 크게 증가 시키기 위한 것이다. 후자는, 지금까지는 실현이 어려웠던 표현이 지오메트리셰이더를 활용해서 쉽게 실현될 수 있다 ……는 것이다.

현재는, 앞에서 이야기 한 것처럼 등장한지 얼마 않되서, 말하자면 지오메트리셰이더의 여명기라고도 할 수 있는 시기여서 어느쪽이라고 말한다면, 전자의 가속을 위한 활용쪽이 더 많은 것 같다.

우선은, 이 「 가속을 위한 활용 」쪽 부터 보도록 하자.


지오메트리셰이더의 가속을 위한 활용 그 첫번째 ~
스텐실 그림자 볼륨 기법의 그림자 생성을 가속한다

지난회까지의 「 그림자 생성 」부분에서 다룬 「 스텐실 그림자 볼륨 」기법에서는  광원에서 봤을 때 윤곽이 되는 정점을 광원 벡터 방향으로 잡아 늘여서 그림자 볼륨(그림자 영역)을 생성하는 것부터 시작했다.

SM 3.0 세대까지의 정점셰이더와 픽셀셰이더 밖에 없던 GPU에서는, 이 그림자 영역 생성용의……즉, 잡아 늘일 정점들을 그림자를 생성할 3D모델에 넣어 줄 필요가 있었다. 이 방법에서는 그림자 생성과 아무 관계 없어도 그림자 영역(볼륨)을 위한 정점 계산에 정점셰이더가 사용되기 때문에 부하가 높다. 부하를 감소시키기 위해 그림자 볼륨 생성 전용의, 화면에는 표시하지 않는 로우폴리곤 모델을 준비해서, 이것에 대한 그림자 볼륨을 생성하는 테크닉도 있다. 그러나 이 최적화에서는 그림자의 생성원이 로우폴리곤이기 때문에, 그저 그런 컬리티의 그림자가 생기기 쉽다는 약점이 있다.

근본적으로 문제를 해결하기 위해서는, 동적으로 광원 방향에서 보고 윤곽인가 아닌가를 판단하고, 만일 그렇다면 여기서 그림자 영역용의 정점을 동적으로 생성하면 된다.

지오메트리셰이더를 사용하면 이런 처리가 가능하다. 지금까지 귀찮았던 「볼륨생성용 정점」을 3D모델에 넣어줄 필요가 없고, 또 그림자 영역(볼륨)과 관계 없는 불필요한 정점처리로부터도 해방되어 개발 작업 효율도, 데이터 레벨에도, 퍼포먼스적으로도 가속화가 실현된다. (계속)

그림자 볼륨을 가시화한 예. 광원에 대해서 윤곽이 되는 정점들을, 동적으로 지오메트리 셰이더에서 복제해서, 이것을 잡아늘리는 처리를 하도록 처리를 개선



지오메트리셰이더 : 가속을 위한 활용(Fur Shader 가속)

3D캐릭터에 털(毛)을 만들어 주는 「 퍼셰이더 」(Fur Shader)라고 불리는 테크닉이 있다.

이 퍼셰이더에는 크게 두가지 방법이 있고, 한쪽 또은 양쪽을 조합해서 사용하는 것이 일반적이다.


가속을 위한 활용(2) ~ 퍼셰이더를 가속한다

하나는 털(毛)을 그린 텍스처를 붙인 폴리곤을 3D캐릭터에 심는 접근방법인 「핀」(Fin:지느러미) 방법이다.

 

"털 Fin"을 심어서 털을 재현하는 핀법. 털 Fin을 연결시켜 장발(長髮)을 표현하는 경우도 있다

 


이 기법에서는, 사전에 3D캐릭터에 모를 심듯 털 Fin들을 3D캐릭터 본체에 심어 둘 필요가 있다.

이 방법에서는 털의 유무를 알기가 어려운, 시점에서 멀리 위치한 3D캐릭터에도, GPU는 심은 털을 위한 정점 처리나 픽셀 그리기를 해야 할 필요가 있기 때문에 낭비가 심하다.

지오메트리셰이더를 이용하면, 미리 3D모델에 털을 만들 필요가 없고, 렌더링 시에 리얼타임으로 동적으로
 " 털을 심는 " 것이 가능하다.

동적 생성으로 인해 이차적인 메리트도 생긴다.

예를 들면, 3D모델 정보를 만지지 않고도 , 하나의 3D모델을 재사용해 털의 길이나 털의 밀도를 바꾼 3D캐릭터를 렌더링 할 수 있다.

또, 시점에서 멀리 있는 캐릭터에 대해서는 털 Fin을 심는 개수를 줄여서 대충하거나 너무 먼 경우는 털 Fin을 심지 않는 LOD(Level of Detail:시점에서의 거리에 따라 고부하의 처리와 저부하의 처리를 나누어 처리)적인 기능을 구현할 수도 있다.

                               Fin법의 개념도


< 그림 설명>
제목: 핀(Fin)법의 퍼셰이더
상:
털(毛)을 그린 텍스처 폴리곤을 심는다.
(버블) 단, 사전에 3D모델에 심어두지 않으면 않된다.
하:
지오메트리셰이더,
지오메트리리셰이더를 활용하면 런타임 때 털을 심을 수 있다.


핀법의 Fur 표현에서의 라이팅에 대해서는 여러가지가 고안되어 있지만, 가장 단순한 것은 털 Fin에 대해서 간이적인 정점 단위의 라이팅을 하는 것이 비교적 부하가 적고, 자주 사용되는 것 같다.

이것은, 털 Fin에 대해서 광원 방향에 가까운 방위각 부터 명→암의 그라데이션을 걸기만 하는 간단한 방법이다. 털의 밑부분은 다른 털에 의해서 빛이 차단되지만, 이 간이 방법에서는 거기까지 대처할 수가 없기 때문에, 하이라이트가 털의 밑부분 쪽에서는 별로 나오지 않도록 방법을 고안해 줄 필요가 있다.(계속)

                              핀법에서의 털에 대한 간이 라이팅

<그림 설명>
상:
(박스 좌) 그대로 사용하지 않고
(박스 우) 정점단위의 라이팅을 해준다
명,
털 Fin에 대해서 정점단위의 라이팅을 해주면 씬에 동화된 털의 표현이 가능하다.
하:
(버블 좌) 털의 밑부분이 밝게 보일리는 없음에도...
(버블 중, 우) 털의 밑부분이 지나치게 밝지 않도록 바이어스를 걸어두는 게 좋을지도




지오메트리셰이더 : 가속을 위한 활용(Shell법 Fur Shader)


퍼셰이더(Fur Shader)를 가속한다 / 그 두번째~ 쉘법(Shell法) 퍼셰이더

핀법(Fin法)으로 생성된 퍼(Fur, 毛)는, Fur Fin을 측면에 가까운 방향에서 바라볼 경우에는 탐스럽게 많이 늘어진 느낌이 들지만, 털끝이 시선 방향에 가까우면, 즉 Fur Fin을 수직으로 내려다 볼 때는 털의 볼륨감이 사라진다는 약점이 있다.

또 하나의 퍼셰이더는 Fin방법의 약점을 보완하고 극복하는 기법이다.

핀법(Fin法)에서는 털을 세로 방향으로 자른 단면도(斷面圖)를 준비했지만, 또하나의 방법에서는, 나있는 털을 가로방향으로 둥글게 자른 듯한 단면도를 준비해, 이것들을 종이를 겹쳐 쌓는 느낌으로 일정 간격으로 겹쳐서 그려 간다. 둥글게 자른 단면도를 겹처서 원래대로 되돌리는 것 같은 이미지로, 마치 외피(Shell)를 형성하듯이 적층(積層)시키는 듯한 느낌에서, 이런 접근의 퍼셰이더를 「쉘」(Shell)법이라고 부른다. 단면 텍스처로 입체적인 물건을 재구성하는 렌더링 기법에는 볼륨 렌더링이라는 것이 있는데, 이미지적으로는 이것에 가깝다고도 할 수 있다. 덧붙여, 단면도 화상 텍스처에 투명성분(알파성분)를 가미해 반투명(半透明)하게 해서 털의 투명한 감촉을 낼 수도 있다.

                        셀법(Shell法)의 개념

<그림 설명>
좌:
단면도 텍스처를 생성(↓)
단면도 텍스처를 붙인 폴리곤을...(↓)
적층(積層)시켜서 그림

우:
(제목) 쉘법(Shell法)의 Fur 셰이더
(버블) 쉘법에서도 사전에 단면텍스처 폴리곤을 적층시킨 3D모델을 준비할 필요가 있다.
ジオメトリシェーダ (지오메트리셰이더)
(버블) 지오메트리셰이더가 있으면 단면 텍스쳐 폴리곤의 적층을 런타임 때 할 수 있다.


쉘법은 단면도를 적당한 간격으로 적층시키지만, 이 간격을 얼마나 조밀하게 다량의 단면도를 적층시킬것인가가 퀄리티를 좌우한다. 적층시키는 매수가 적으면 부식된 것처럼 보이고, 많으면 부하가 커진다. 그다지 시선이 대상물에 가까이 접근하지 않는다면, 최근의 3D게임에서는 4~8층 정도가 일반적인 것 같은데, 시선이 3D캐릭터에 의존할 때는 적층수가 많은 편이 보기에 좋을 것이다.

하지만, 핀법과 마찬가지로 SM 3.0세대까지의 GPU에서는 쉘법 또한 단면도 텍스처를 적용한 폴리곤을, 3D모델에 미리 넣어둘 필요가 있었다.

지오메트리셰이더를 활용하면, 이런 사전 작업 없이, 실시간으로 동적으로 생성하는 것이 가능하다. 또, 시선과 대상물의 위치 관계에 따라서, 단면도 텍스처의 적층수를 증가 또는 감소 시키는 LOD적인 구현도 가능하다.

쉘법에 의해 만들어진 털

PS2용 게임「완다와 거상」에서는 털 표현에 쉘법의 퍼셰이더를 활용했다

PS2에는 지오메트리셰이더는 없었기 때문에, 3D모델 제작단계에서, 이 Fur를 적층시켜야만 했다.

단면도 텍스처는 단순한 화상 텍스처만으로도 괜찮지만, 함께 대응하는 법선맵(노말맵)도 준비해, 광원 벡터나 시선벡터의 위치 관계에 따라 픽셀 단위의 이방성 라이팅을 해서, Fur에 독특한 광택감을 낼 수도 있다.

라이팅은, Fin 때처럼, 역시 털의 밑부분은 하이라이트가 어둡도록 조정하는 편이 좋을 것이다.

융단과 같이 짧은 털에서는, 시선으로부터 털이 "점"으로 보이는 털끝에는 하이라이트가 약해지고, 반대로 털의 측면 …… 즉 털이 "선"으로 보일 때는 빛이 잘 반사해서 하이라이트가 나오기 쉽다. 이 특성을 구현하려면 , 통상적인 확산 반사 처리에 추가해서, 법선벡터가 시선 벡터와 마주보고 있으면 하이라이트를 약하게 하는 이방성 처리를 하면 좋다. 이 아이디어는 PS 2용 게임 「완다와 거상」에 활용되었다. (계속)

보통의 확산 반사 라이팅에서는 광원과 마주볼 수록 하이라이트가 더 나온다.

시선과 면의 방향(법선 벡터)이 서로 마주 보고 있는 곳에서는 하이라이트를 감소 시키는 처리를 넣으면 짧은 털의 음영이 리얼해진다.

지오메트리셰이더 : 가속을 위한 활용(Fur Shader 응용)

퍼셰이더(Fur Shader)를 가속한다 / 그 3번째 ~ 퍼셰이더의 응용

쉘법(Shell法)은 핀법(Fin法)과는 반대로, 털끝의 연장선 상에 시선이 있는 것 같은, 시선과 털끝이 마주보는 위치 관계일 때에도, 폭신한 볼륨감을 얻을 수 있는 퍼셰이더이다.

핀법과 쉘법은 서로 보완 관계에 있으므로, 실제로 몸에 털이 짙게 나있는 캐릭터를 리얼하게 표현고자 하는 경우에는 양쪽을 동시에 조합해 사용하는 것이 좋다고 여겨진다.

이것을 지오메트리셰이더 없이 하려면 사전에 Fur(毛) Fin을 심어 놓지 않으면 안되고, 털의 단면도(斷面圖) 폴리곤을 미리 적층(積層) 시켜 놓지 않으면 않되기 때문에 뭔가 일이 커진다.

지오메트리셰이더가 있으면, 두종류의 "털 생성 기법"을 사전준비 없이도 모두 할 수 있다.

핀과 쉘 양쪽 모두 구현한 NVIDIA 데모의 구현예

좀더 고도의 구현을 하려 한다면, 털을 심을 맨살갗 폴리곤의 법선벡터와, 시선과의 관계를 확인해서, 털의 측면이 보이는 위치에 있는 살갗에는 핀법으로 털을 넉넉하게 적용하고, 털끝과 시선이 마주 보는 위치의 살갗에는 쉘법으로 털을 넉넉하게 해주는 적응형 콤비네이션 퍼(Fur, 毛)도 가능하다.

                           퍼셰이더의 응용 발전형

시선에서 봤을 때 윤곽이 되는 정점에서 지오메트리셰이더를 사용해 폴리곤을 생성해서 여기에 Fur Fin을 심는 NVIDIA 데모의 구현예

<그림 설명>
상:
(제목) 퍼셰이더의 적재적소
시점、
(버블 좌) 살갗과 시선이 서로 마주하는 곳에는 쉘법(Shell法)으로
(버블 우) 시선에서 볼 때 윤곽 부근이면 핀법(Fin법)으로
중:
(제목) 퍼세이더의 LOD구현
(좌) 시점에서 가까울 때는 털을 많이
(우) 시점에서 멀 때는 털을 감소 시키면 부하가 준다
하:
(좌) 지오메트리쉐이더 상에서 실루엣 검출
노말벡터 N1과 시선벡터의 내적이 0보다 크고, 노말벡터 N2와 시선벡터의 내적이 0보다 작으면 외곽선
(우) 실루엣 extrusion
N2 노말벡터가 0보다 작으면(실루엣 엣지이면) 두개의 삼각형으로 그것을 extrude


또, 지오메트리셰이더나 정점셰이더 프로그램을 좀더 고도로 만들어서, 털을 바람에 나부끼게 한다든지, 가속이나 감속, 중력이나 완성 등을 고려해, 생성한 털에 애니메이션을 주는 것도 재밌는 응용이 될 것이다. 이 경우, 털끼리의 충돌이나, 털과 다른 오브젝트와의 충돌은 해주기 어렵기 때문에 무시하게 되겠지만, CPU가 개입되지 않아도 털의 애니메이션을 실현시킬 수 있다.

또, 이러한 퍼셰이더는 털을 생성하는 것 뿐만이 아니라, 응용에 따라서 다른 표현에도 사용할 수 있다.

가장 흔한 예가 잡초의 표현이다.

핀법에서 머리카락의 텍스처로 하고 있는 것을 초목의 옆에서 본 면으로해서 이것을 지면에 기르면 밀집한 초목이 완성된다.

또, 쉘법이라면, 단면도 텍스처의 색을 적당한 초록색 계열이나 갈색계열로 해서 지면에 적용하면 잔디와 같은 잎이 짧은 식물이 융단처럼 밀집해서 우거져 있는 지면을 표현할 수 있다.

이 경우에도 바람에 나부끼는 것처럼 하면, 리얼리티는 한층 더 향상된다.

다만, 3D캐릭터가 초목을 밀치고 가는 것과 같은, 동적인 캐릭터와 퍼셰이더로 기른 초목과의 interaction를 취하는 것은 어렵다. 초목의 길이를 너무 길게 하면 잎이 동적 캐릭터의 몸속으로 들어간다거나 하는 부자연스러움이 눈에 띄게 된다.

쉘법으로 생성한 키 작은 초목이면, 동적 캐릭터가 밟은 부분은 적층 간격을 좁힌다든지 또는 퍼(Fur) 자체를 생성하지 않음으로써 발자국의 표현 같은 것은 가능할 것 같다.(계속)

「완다와 거상」에서는 퍼셰이더를 초목의 표현에도 응용했다.
(C) 2005 Sony Computer Entertainment Inc.


Posted by 노을삼킨별
,


아래에서 퍼옴

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 노을삼킨별
,



아래에서 퍼옴

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 노을삼킨별
,



아래에서 퍼옴

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 노을삼킨별
,



아래에서 퍼옴

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


 

2008-06-13 19:15:13
90年代の3Dゲームの影生成技法の主流だったのが、3Dキャラクタの足元に黒いマルを置くだけの簡易的な影、通称「丸影」だ。 1枚の板ポリゴンに丸い影テクスチャを貼り付けた物を足元に描くだけなので、負荷は非常に軽 ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.



90년대의 3D게임의 그림자 생성 기법의 주류였던 것이, 3D캐릭터의 발밑에 검은원을 놓는 것 뿐인 간이적인 그림자, 통칭, 「  환영(丸影) 」이다.

1장의 평면 폴리곤에 둥근 그림자 텍스처를 붙인 것을 발밑에 그릴 뿐이므로, 부하는 매우 적었다. 3D공간 상에 서의 캐릭터 위치를 입체적으로 플레이어에게 전달해주는 …… 정도의 정보량은 있지만, 모든 캐릭터의 그림자가 똑같이 둥글게 그려질 뿐이므로, 「그림자」로서의 리얼리티는 거의 없었다.

「Oni」(BUNGIE,2001)으로부터. 발밑에 단지 둥근 그림자 스프라이트를 그릴 뿐인 초간이 그림자 생성 기법이 사용되었다.
Oni and the Oni logo are trademarks of Take 2 Interactive Software, Inc. Bungie and the Bungie logo are trademarks of Microsoft, Inc. Gatharing of Developers and godgames are trademarks of Gathering of Developers, Inc. All other trademarks and trade names are property of their respective owners. (C)2001 Gathering of Developers. All Rights Reserved.

이것을 약간 진화시킨 것이, 「투사 텍스쳐 매핑」(Projected Texture Mapping)에 의한 의사(유사)그림자 생성이다.

이것은, 광원에서 본 캐릭터의 실루엣을 텍스처에 렌더링 해서, 이것을 광원 위치로부터, 영사기로 투영하는 것처럼 씬에 텍스쳐 매핑함으로써 실현된다.

투사 텍스쳐 매핑에 의한 간이그림자 생성 기법의 개념도

< 그림 설명 >
광원、캐릭터、그림자(실루엣) 텍스처 
(버블) ①광원으로부터 본 캐릭터 실루엣을 그림자 텍스처에 렌더링한다.
(버블) ②광원방향에서 투영하듯이 그림자 텍스처를 매핑한다.


투사 텍스쳐 매핑은 거의 모든 GPU에서 지원되기 때문에, 호환성이 높다. 단순히 지면에 둥근 그림자를 그리는 것이 아니라, 그 캐릭터의 실루엣을 씬에 투사 하므로, 어떤 캐릭터의 그림자가, 다른 캐릭터에 투사 되어지는 것과 같은 상호 투사 그림자 표현도 실현 가능하다.

그림자를 만들고 싶은 캐릭터의 실루엣을 매프레임 텍스처에 생성하지 않으면 안되지만, 시점에서 멀리있는 캐릭터에 대해서는 그림자 생성을 생략하기만 하면, 퍼포먼스적으로 스케일러블(scalable)한 구현도 가능하다.

이 투사 텍스쳐 매핑을 사용한 그림자 생성은, 원시적이지만, 비교적 최근의 3D게임에서도 자주 채용되는 경우가 있다. 플레이스테이션2의 타이틀 등은 이 기법을 채용한 것이 많은 듯 하다.

「THE GOD FATHER THE GAME」(EA,2006)에서. 비교적 최근의 타이틀이지만, 투사 텍스쳐 매핑에 의한 그림자 생성 기법이 채용되어 있다.
(C)2006 Electronic Arts Inc. All rights reserved.

투사 텍스쳐 매핑 기법의 문제

이 기법의 약점은 「셀프 그림자」표현을 할 수 없다는 것에 있다.

셀프 그림자란, 자기 자신의 부위의 그림자가 자신에게 투사 되는 그림자 표현이다.

예를 들면 현실 세계에서, 전등아래에 서서 팔을 앞으로 쑥 내밀어 보면, 그 팔의 그림자가 자신의 가슴으로부터 배로 걸쳐서 투사될 것이다. 이 자신의 팔의 그림자가 자신의 몸에 투사되는 표현을 셀프 그림자라고 한다.

투사 텍스쳐 매핑을 사용한 그림자 생성에서는, 그림자의 최소 생성 단위가 캐릭터 단위가 되기 때문에, 셀프 그림자 표현이 어려운 것이다.

셀프 그림자는 자신의 그림자가 자신에게 투사 되는 것. 현실 세계에서는 아무것도 아닌 그림자도, 실시간 3D그래픽스에서는 특별한 처리를 하지 않으면 만들어 낼 수 없다

< 그림 설명 >
광원、모자의 셀프그림자、머리의 셀프그림자、팔의 셀프그림자

또, 이 실루엣 텍스처를 어디에 붙일 것인가(= 그림자가 어디에 떨어지는 것인가)의 판정을 제대로 하지 않으면 있을 수 없는 곳에 그림자가 떨어져서 부자연스럽게 보이는 경우가 있다.(계속)

「Half-Life2」(VALVE,2004)의 그림자 생성은 투사 텍스쳐 매핑의 기법을 사용하고 있다. 계단의 층계참에 있는 캐릭터의 그림자가, 층계참 바닥을 넘어, 벽에 투사 되어 버리고 있다. 이것은 실루엣 텍스처를 어디에 떨어뜨려야할 것인가의 판정이 대충 적당히 이루어져 생겨 버린 이상한 상태.
(C)2004 Valve Corporation. All rights reserved. Valve, the Valve logo, Half-Life, the Half-Life logo, the Lambda logo, Counter-Strike, the Counter-Strike logo, Source, and the Source logo are trademarks or registered trademarks of Valve Corporation in the United States and/or other countries. All other trademarks are property of their respective owners.


Posted by 노을삼킨별
,


아래에서 퍼옴

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



2008-06-06 14:00:00
現在の3Dグラフィックスにおいて、最も重要なテーマの1つが影生成だ。シーンのリアリティを演出する要素として、今や欠かせない存在となっており、3Dゲームグラフィックスの設計をする際においても、どんな影生成技 ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.



오늘날의 3D그래픽스에서, 가장 중요한 테마 중 하나가 그림자 생성이다. 씬의 리얼리티를 연출하는 요소로서 지금은 빠뜨릴 수 없는 존재가 되었고, 3D게임 그래픽스를 설계할 때도, 어떤 그림자 생성기법을 구현할 것인가가, 가장 중요한 검토항목 중 하나가 되었다.

이번회 부터는, 최근의 3D게임에 많이 이용되는 전형적인 그림자 생성 기법을 화제로 다루어 보고 싶다.


3D그래픽스에서의 2개의 그림자의 존재

현재의 실시간 3D그래픽스에서의 "그림자" 는, 크게 2가지가 있다.

일본어에서도 그림자는 「그늘(陰)」의 글자를 쓰는 그림자와 「그림자(影)」의 글자를 쓰는 그림자가 있는데, 실시간 3D그래픽스에서의 2종류의 그림자는, 이 일본어의 그림자의 정의와 대응하고 있다.

하나는, 라이팅(음영처리)의 결과로서 어둡게 되는 「그늘」이다.

오늘날의 3D그래픽스는 폴리곤, 혹은 픽셀 단위의 라이팅을 하는데, 그 때, 폴리곤이나 픽셀에 빛이 닿는가, 아닌가를 계산해, 그 폴리곤이나 픽셀의 밝기를 결정하고 있다. 빛이 닿지 않는 곳은 당연히 어두워진다. 이것이 "그늘(陰)" 이고, 이 그늘은, 특별한 처리를 하지 않아도 평범하게 렌더링하면 자연히 나와 버리는 그림자이다.

다른 하나는 무언가에 의해서 차폐되어 생기는 「그림자(影)」이다. 맑은 날, 밖에 나오면 자신의 몸이 태양으로부터의 빛을 차폐하고 있어서 지면에 자신의 몸 형태의 그림자가 생기는데, 이 「그림자」이다.

실제로 현재의 실시간 3D그래픽스의 기본 렌더링 파이프라인에서는, 이 차폐되어 생기는 그림자에 대해서는 전혀 고려되어 있지 않다. 즉, 보통으로 렌더링해서는, 「그림자(影)」는 나오지 않는 것이다.

반대로 말하면 「그림자(影)」를 내기 위해서는, 무언가 별도로 처리를 해서 생성해 주지 않으면 안 되는 것이다. 이번회부터 테마로 하는 것은 「그늘(陰)」이 아니라, 이 「그림자(影)」이다.

이 「그림자」의 생성은 의외로 고부하처리이며, GPU가 고성능이 아닌 1990년대의 3D게임에서는, 이 그림자 생성을 하지 않은 타이틀이 대부분이었다. 초기 플레이스테이션 시대의 게임소프트웨어를 보면, 「그림자」가 없는 것이 많다는 것을 깨달을 것이다.

현재, 3D게임 그래픽스등에서 이용되는, 「그림자」의 생성은, 대략적으로 생각하면 약 3종류로 분류할 수 있다.

이것들에 대해서는 다음회 부터 하나씩 소개해 나가려한다. (계속)

2개의 그림자 「그늘(陰)」과「그림자(影)」

<그림 설명>
광원
(버블 하) 현재의 리얼타임 3D그래픽스에서는 이런 "그늘"은 보통으로 렌더링하면 자동적으로 얻을 수 있다.
(버블 상) 무엇인가에 가려져서 생기는 "그림자"는 특별한 처리를 해 주지 않으면 얻을 수 없다.



Posted by 노을삼킨별
,