아래에서 퍼옴

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