아래 사이트에 2009-12-07 현재 77회까지 있음.

3Dグラフィックス・マニアックス
西川善司

http://journal.mycom.co.jp/column/graphics/index.html

Posted by 노을삼킨별
,


아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/PRT





3D모델 변형가능 동적PRT - 동적 PRT 기술의 대두


2009-07-18 01:00:00
3Dモデルの変形に対応した動的PRT技術の台頭 PSF技法ベースのPRTは、自身の遮蔽、他者への遮蔽を考えることにより、シーンに存在する3Dモデルの移動や回転を許容する動的PRTが可能になった。これは、ビリアードのよ ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved


3D모델의 변형에 대응한 동적 PRT기술의 대두

PSF기법 기반의 PRT는, 자신의 차폐와 타 오브젝트에의 차폐를 생각함으로써, 씬에 존재하는 3D모델의 이동이나 회전을 허용하는 동적 PRT가 가능하게 되었다. 이것은, 당구와 같은 테이블 게임이나, 블럭퍼즐 게임과 같은 3D게임 그래픽스에는 응용할 수 있을 것이다.

하지만, 3D모델의 형상(형태)을 변경, 변형할 수 없다는 제약은, 실질적으로 부위가 접히거나 구부러지거나 하는 인간이나 동물과 같은 생물을 취급할 수 없다는 것과 같다. 이것은, 실시간 3D게임 그래픽스에의 응용을 생각하면 큰 제약이라고 할 수 있다.

그런 가운데, 2006년의 SIGGRAPH에서, Zhong Ren씨등이, 「Real-time Soft Shadows in Dynamic Scenes using Spherical Harmonic Exponentiation」이라는 논문을 발표해, PSF기법의 동적 PRT를 기반으로 하면서 자신의 변형까지 지원하는 기술을 발표했다.

그것이 「SH Exponentiation」(SHEXP)이라는 솔루션이다.

지금까지 형상 변형을 실현할 수 없었던 것은, 씬에 등장하는 각각의 3D모델을 「하나의 강체」로 간주해 왔기 때문이다.

SHEXP기법에서는 발상을 전환해, 등장하는 3D오브젝트를, 여러가지 크기로 된 구체(球體)들의 집합체로서 파악한다는 것이다. 즉, 3D모델의 그 형태는 복수의 여러 크기의 구체들이 모여 구성되어 있는 것……으로서 해석하고 처리를 진행시키는 것이다.

이러면, 그 3D모델이 어떻게 변형했다고 해도 「그 3D모델을 구성하고 있는 구체(球體)가 이동했을 뿐」이라고 간주할 수 있다.

3D모델을 복수의 구의 집합체로 생각하면, 3D모델의 변형은 구의 이동으로 생각할 수 있다. 즉, 강체가 이동하는 것에 대응한 PSF기법에 의한 동적 PRT를 응용할 수 있게 된다

SHEXP기법의 실현에 따른 장해

이 아이디어는 훌륭하지만, 몇가지 넘지 않으면 안 되는 문제들이 부상한다.

첫번째로, 3D모델을 어떻게 구체에 근사하는가 하는 실현 방법에 대해서. 이상적인 것은 자동적으로 실행하는 것이지만, 그 3D모델에 어떠한 변형을 허용하는가라는 부분이 복잡하게 관계되기 때문에, 현실적으로는 구(球) 근사화 authoring tool등을 제작해서, 아티스트에게서 구체화(球體化) 처리를 수작업으로 하도록 하는 것이 가장 상책이라고 할 수 있을지도 모른다.

이 구체(球體) 근사에 대해서는 2개의 논문이 참고가 될 것이다.

하나는, Riu Wang씨가 2006년의 PacificGraphic에서 발표한 「Variational Sphere Set Approximation for Solid Objects」라는 논문이다. 2번째는 Gareth Bradshaw씨가 2004년의 SIGGRAPH에서 발표한 「Adaptive Medial-Axis Approximation for Sphere-Tree Construction」이라는 논문이다. 피라미드사의 구현에서는 후자의 논문의 방법을 구현했다고 한다.

드래곤의 3D모델을 다른 레벨로 구상근사(球狀近似)한 모습

두번째로, 구(球)로 3D모델을 근사해 버리면, 세세한 요철이나 가시와 같이 예리한 디테일이 없어져 버린다는 문제가 있다. 이것은 디테일부분의 구체 근사에는 직경이 작은 구를 이용하는 것으로 그나름 대응은 할 수 있다. 단, 그 경우에는 구의 수가 많아져, PRT 처리 때의 부하가 커진다. 즉, 세번째 문제와도 관련이 깊지만, 그 타겟 시스템의 처리 속도에 맞쳐, 어느 정도의 품질로 구체 근사를 해 줄지를 결정하게 될 것이다.

세번째는 처리 속도의 문제. 3D모델이 구체로 근사되었다고 가정하고, 그 모든 구들에 대해서 서로 PSF기법의 동적 PRT를 실시하게 된다. 즉, 처리 부하가 높은 SH Triple Product의 횟수는 급증해, 연산 부하가 매우 높아져 버린다.

첫번째와 두번째 문제는 어떻게든 대응할 수 있지만, 이 세번째 문제는 근본적인 해결책이 필요하다.

거기서 Zhon Ren씨등의 연구그룹은, 이 SH Triple Product 연산 비용을 감소 시키기 위해서 「SH Log」와「SH Exp」라는 2개의 새로운 연산 메소드를 개발했다.(계속)

오리지널 3D모델

구체 근사한 3D모델

형상이 변형 되어도 지면에의 그림자 뿐만 아니라, 신체의 각 부위간의 상호 차폐등도 고려된다. 구체(球體) 근사에 의해서 실현된 기술. 마루의 그림자나 셀프 그림자는 구체 근사에 의해, 상당히 희미해져 있지만, 현실 세계의 그림자도 이처럼 뿌옇게 된다는 것을 생각하면, 충분한 품질이라 할 수 있다




3D모델 변형가능 동적PRT - SH Log와 SH Exp란 ?

SH Log와 SH Exp란?

SH Log의 Log는 로그(對數)를 나타내고 있다. 그리고 SH Exp의 Exp는 지수를 나타낸다.

고등학교 수학에서 배우는 공식에 복수의 곱셈은 그 수의 Log의 총합(덧셈)을 Exp한 값과 같다고 하는 것이 있다.

예를 들어, 25×46 = 1150. Exp(Ln25 + Ln46) 또는 10^(Log25 + Log46)을 윈도우즈의 계산기나 함수 계산기로 계산해 보자. 제대로1150이 될 것이다

이 지수와 로그(대수)의 법칙을 SH Triple Product에 응용한 것이 SH Log와 SH Exp 계산이다.

즉, 차폐계수 벡터끼리의 SH Triple Product 연산 부하를 절감 시키기 위해서, 우선 로그(Log)의 합을 계산해, 그 값에 대해서 지수(Exp)를 취하면 SH Triple Product를 계산한 것이 되지 않을까……라는 것이다. 이것이 성립되면 부하가 높은 SH Triple Product의 반복을 단순한 덧셈으로 떨어뜨릴 수 있게 된다. 이 증명은 매우 복잡해서 여기에서는 생략 하지만, 이것은 성립되는 것이므로, 사용해도 된다.

SHEXP기법에서의 사전 계산

SHEXP기법의 동적PRT에서는, 등장하는 3D모델을 모두 구체(球體)로 해 버리는 관계로, 자기 차폐나 Shadow Fields의 사전 계산을 단일의 구(球), 1개로 한정할 수 있다. 여기에서 이후의 연산을 하기 쉽게하기 위한 방법을 보여준다.

PSF기법에서는 구면조화함수의 스케일링 계수들로 된  계수벡터를 보관하고 있었지만, SHEXP기법에서는, SH Log와 SH Exp의 조합을 활용하기 위해서, 이 계수에 대해서 미리 SH Log 연산을 실시해, SH Log 공간의 값으로 보관 한다.

이 방법에 의해, 차폐 구조의 합성(통합)처리의 중간 계산을 부하가 높은 SH Triple Product가 아니라, 덧셈만으로 처리할 수 있게 된다. 마지막에 SH Exp 연산을 실시해 원래의 공간으로 되돌려서, 음영 처리(휘도 계산)을 실행하도록 한다.

무거운 처리의 일부를 실시간으로 하지 않고, 사전에 미리 해 둔다는 이미지이다. 이것에 의해서 PSF기법에서는 매우 고부하였던 SH Rotation이나 SH Triple Product 연산의 부하가 작아짐으로써, 구(球)가 다수 등장하는 구 근사를 이용하는 SH Exp기법에서도 어느정도의 퍼포먼스를 예상할 수 있게 된다.(계속)

PSF기법과 같이 Shadow Fields를 산출하는 것도, 그 결과를 구면조화함수의 계수벡터 상태 그대로가 아니라, SH Log 연산을 해둔다

SHEXP 기법의 개념도. 고부하인 계산을 SH Log 공간에서의 덧셈으로 떨어뜨리고, 그것을 다시 SH Exp 연산으로 원래 공간으로 되돌린다는 발상이 포인트가 된다


<그림 설명>
상:
(제목) 렌더링 개요(계산 전)
구의 Shadow Filed의 계수 벡터를 SH Log 공간에서 보존한다!!
SH Log 연산
하:
(제목) SHEXP 개념도
계산전,
통상공간, SH Log공간,
물체의 구 근사,
구의 Shadow fields 계산,
SH Log 연산,
SH Log공간의 구의 Shadow fields 계산
계산시
물체 위치, 형상 변신,
차폐 통합,
고속 처리가 가능!!
SH Exp 연산
휘도계산





3D모델 변형가능 동적PRT - 대역조화함수(Zonal Harmonics) 도입

대역조화함수(Zonal Harmonics)의 도입

SHEXP기법에서는, 구(球)의 Shadow Fields를 다루는 부분에 대해 새로운 최적화를 추진한다.

구(球)의 모양은 어디에서 보든 똑같은 "원"이다.

구 전체의 Shadow Fields를 모두 저장하면 실행 측면에서 확실히 유리하지만, 메모리의 소비량이 커져 버린다. 어쨌든, 어디에서 보든 똑같이 원으로 밖에 보이지 않는다면, 어느 한축 방향의 일정거리의 각지점의 Shadow Fields를 산출해 두고, 이것을 리얼타임 렌더링시에 SH Rotation으로 변이 시키는 처리를 구현해 주면 메모리 소비량을 상당히 줄일 수 있다. 그러나, SH Rotation 계산은 자체가 부하가 높기 때문에 실제로는 퍼포먼스 면에서 불리해 진다.

구(球)의 Shadow Fields 취급에 대한 3가지 구현안

<그림 설명>
구의 Shadow field에는 3가지 선택이 존재
표:
                              메모리 소비           실행 속도
전부 보존                        X                      O
SH Rotation                     O                      X
Zonal Harmonics               O                      O
(박스) 전부 보존,
SH Rotation

거기서, 높은 처리 속도와 메모리 소비량이 괜찮은 Zonal Harmonics(대역 조화 함수)라는 개념을 도입한다.

Zonal Harmonics에서는, 앞에서 이야기한 SH Rotation으로 변이 시키는 구현안 처럼, 한방향 만의 Zonal Harmonics 계수를 보관하므로 메모리의 소비량은 작고, 거기다가 계산 부하는 그다지 크지 않다.

Zonal Harmonics는 회전대칭인 정보 밖에는 적용할 수 없다는 제약이 있지만, 다루는 대상이 어디에서 보나 똑같은 모양인 구(球)의 차폐구조 데이터이므로 문제는 없다.

Zonal Harmonics의 요점

대상이 어디에서 보든지 동일한 모양인 구(球)의 차폐구조 데이터이므로 Zonal Harmonics를 적용할 수 있다.

<그림 설명>
상:
1. 특수한 한방향에서, Zonal Hamonics 계수를 계산
-> 한방향만의 계수를 저장하므로, 메모리 소비량은 적다.
2. 다른 방향은 Zonal Hamonics 계수를 이용해서 계산
SH Rotation: 벡터와 행렬의 곱셈 5회
Zonal Harmonics: 벡터와 벡터의 곱셈 1회
-> 상당히 고속
다만 Zonal Harmonics는 "회전 대칭"인 정보만 적용 가능
하:
Zonal Harmonics
제약: 회전대칭인 정보만 적용 가능
구의 Shadow fields 계산
제약을 클리어
구는 어디에서 봐도 회전 대칭


Zonal Harmonics에서 보관할 한 방향을 결정하는 방법에는 요령이 있다. 어떤 조건(그림 참조)을 만족하는 방향을 결정해, 차폐구조를 산출해서 구면조화함수로 근사 시켜 차폐계수벡터를 구하면, m=0 이외의 계수는 모두 0이 되어 버린다. 이 특성에 주목하면, m=0 일 때의 차폐계수벡터만 저장해 두면 되는 것이다.

이 특성은, 그 특수조건을 만족하는 방향을 선택했을 경우의 효과이다. 그리고, 이 m=0 때의 차폐 계수 벡터에 Zonal Harmonics의 보정 계수를 곱해 산출된 값이 Zornal Harmonics계수(ZH계수)가 된다.

바꾸어 말하면, ZH계수는, 특수 조건하에서의 m=0일 때의 구면조화함수의 차폐계수벡터를 조금 세공(=Zonal Harmonics)해준 버전이라 할 수 있다.


Zornal Harmonics 이용을 위한 특수조건

Zonal Harmonics계수의 계산 흐름. l=3 까지의 구면조화함수의 차폐계수벡터는 본래는 16개를 저장해야 하지만, 특수조건하의 혜택으로 m=0 이외의 계수는 전부 제로가 되어 버리므로 그것들이 필요없어진다(4개만 저장). 여기가 포인트

<그림  설명>
상:
(제목) Zonal Harmonics(특수한 한방향을 결정)
물체의 중심과 샘플점의 거리는 일정하다고 가정
특수한 한방향이란?
회전대칭축샘플좌표계의 +z축이 일치하는 특수한 방향
(박스) 회전대칭축과 샘플좌표계의 +z축이 일치하는 점은 한점만 존재
중:
Zonal Harmonics 계수 계산
차폐정보를 취득
 

결국, 원하는 것은 임의의 방향의 차폐계수벡터이다. 이것은, 그 임의의 각도의 구면조화함수와 방금전의 기준축으로 구한 ZH계수의 곱셈(積算)으로 구할 수 있다. 이 부분의 수학적인 이론과 증명은 생략하지만, 이 기법을 이용하는 쪽은 그런 것이다라고 그냥 사용할 수 있다. 포인트가 되는 것은, SH Rotation에서는 벡터와 행렬의 곱셈(積算)이 5회나 필요한데 반해, ZH를 이용하면 벡터끼리의 곱셈(積算) 1회로 임의의 방향의 차폐계수벡터가 구해진다는 점이다.

Zonal Harmonics의 도입으로 임의의 방향의 차폐계수벡터가 비교적 저부하로 계산이 가능해졌다

<그림 설명>
임의의 방향의 차폐계수 벡터 계산
회전 중심축과 샘플 좌표계의 +Z축과의 각도는 θ로 가정
곱셈

실제의 구현에서는 구의 중심으로부터 일정 간격 마다의 ZH계수를 구해, 이것을 테이블화해 보관하게 된다. 이 "일정 거리"라는 것은「구의 중심으로부터의 일정 거리」가 아니고, 구의 중심을 향한 직선과 구의 면에 대한 접선이 구성하는 각도의 변화(구에 대해서 가장 멀다= 0도 ~ 구에 대해서 가장 가깝다=90도)단위로 준다. 이것은 뒤에서 서술할 차폐계수벡터의 통합 계산을 효율적으로 하기 위한 테크닉이다.(계속)

ZH계수 테이블의 개념

ZH계수를 구하는 포인트는 거리가 아니라 각도를 키로 해서 작성하는 것이 나중에 편리하다

구의 Shadow Fields 요약정리. ZH계수를 이용함으로써 적은 메모리 사용과 고속 실행이 가능해 진다

<그림 설명>
상:
Zonal Harmonics 계수 계산,
ZH 계수 테이블,
차폐정보를 취득
하:
1. 특수한 1방향에서, Zonal Harmonics계수를 계산
ZH계수계산,
ZH계수 테이블을 미리 계산,
데이터량은, 수 KB정도
2. 다른 방향은, Zonal Harmonics계수를 이용해서 계산
1.현재의 거리에 대응하는 ZH계수를 테이블로 부터 취득
2. ZH계수 벡터와 구면조화함수 벡터를 곱셈



3D모델 변형가능 동적PRT - SH Log 연산과 SH Log 차원의 차폐 통합

SH Log 연산과 SH Log 공간에서의 차폐 통합

SHEXP기법의 근간이 되는 테크닉인 SH Log연산과 SH Exp연산에 대해서, 지금 한번 집중해서 보기로 한다.

수학적인 유도는 생략 하지만, 이미지적으로는 SH Log와 SH Exp은 구면조화함수 공간에서의 로그, 지수 계산이 된다.

행렬의 로그나 지수의 계산값은, 먼저, 그 행렬을, 쌍(pair)이 되는 직교 행렬과 대각행렬로 분해해서, 그 대각행렬의 각 성분들에 로그나 지수의 계산을 해준 값과 같다라는 성질이 있다. 구면조화함수 공간에서의 로그나 지수 계산도 이 성질을 응용해서 한다.

SH Log를 구하는 방법

행렬의 로그나 지수 계산값은, 우선, 그 행렬을, 쌍(pair)이 되는 직교 행렬들과 대각행렬로 분해해서, 그 대각행렬의 각 성분들에 로그나 지수 계산을 실시한 값과 같다라는 성질이 있다

차폐계수 벡터의 로그는 이와 같이 된다


그런데, 앞에서도 이야기했지만, 구하고 싶은 것은 임의의 방향의 Log공간에서의 차폐계수벡터이다.

실제 구현에서는, 사전에 미리 계산한 ZH계수 테이블에 Log값들을 구해 저장해 둔다(Log ZH 계수 테이블). 이렇게 함으로써, 임의의 방향의 Log공간 차폐계수벡터는, 그 방향의 구면조화함수값에, Log ZH계수 테이블 값을 곱해 주기만 하면 구해진다.

임의의 방향의 Log공간에서의 차폐계수벡터를 구하는 방법은, 이론이나 유도는 몇회 분량이지만 실제 구현은 그렇게까지 어려운 것은 아니다

SH Log 공간에서의 차폐계수벡터가 구해지면, 이번에는 그 차폐를 통합하는 단계로 넘어간다.

정점 단위의 처리가 되는 것은 지금까지의 PRT와 똑같다. 어떤 정점에서의 SH Log공간의 차폐계수벡터는, 아래와 같은 흐름이 된다.

우선, 그 정점에서 대상으로 하는 구의 중심으로 그은 선분과 그 정점로부터 대상 구에 접하는 접선이 이루는 각도를 키로 해, Log ZH계수 테이블을 참조한다(그림). 앞에서 말했던 「일정 거리가 아니라 각도를 키로 하는 테이블 작성」은 여기서 편리함을 준다. 이 Log ZH계수에 그 각도의 구면조화함수를 곱해 주면, 그 정점에서의 SH Log공간의 차폐계수벡터가 구해진다.

그리고, 이 SH Log공간의 차폐계수벡터들의 통합은, 앞에서 이야기한 것처럼 Log공간에서의 메리트를 살려서 덧셉(합산) 만으로 구할 수 있다.

최종적인 총합이 구해지면, 통상 공간으로 되돌리기 위해서, 로그(Log)의 역함수인 지수(Exp) 연산을 실시할  필요가 있다. 그렇다, SH Exp 연산이다.(계속)

SH Log공간에서의 차폐 계수 벡터의 통합 처리. 이 처리를 모든 구에 대해서 실시한다. 각도를 키로 하는 테이블 작성은 여기서 효과적이다.




3D모델 변형가능 동적PRT - SH Exp 연산의 대담한 근사에 의한 고속화

SH Exp연산의 대담한 근사에 의한 고속화

SH Exp연산에 대해서는 정의 그대로의 정직한 연산을 실시하는 것도 하나의 방법이지만, 리얼타임의 퍼포먼스 향상을 위해, 여기서는 근사 방법을 도입한다.

어떤 값의 지수는 급수전개를 하면 아래의 그림처럼 나타낼 수 있다. 이 계산은 제곱승이나 나눗셈이 포함되어 있어서 계산 부하가 높다. 거기서 SHEXP기법의 개발 연구그룹에서는 최초의 2개의 항만으로 근사한다는 대담한 방법을 채택했다. 그러나, 그대로 하면 오차가 너무 크기 때문에, 가중치를 넣은 선형결합으로 근사 한다.

SHEXP 연산을 최초의 2개항만으로 근사를 하는 대담한 방법을 도입해서 퍼포먼스를 올린다.

<그림 설명>
(제목) SH Exp연산
exp(F) = 1 + F + F^2/2! + F^3/3! + F^4/4!+ ...
SH Exp연산은 실행시에 이용 -> 고속으로 계산하고 싶다
부하의 원인: F^2, F^3, F^4,...의 계산이 무겁다
(박스) 최초의 2개항(선형항)만으로 어떻게 근사할 수 없을까?
exp(F) ~ a1 + bF          단, 1=(√4π, 0, 0, ...)
두항에 가중치(a, b)를 곱해서 선형 결합함으로 근사


2개의 선형항들에 곱해지는 2개의 가중치 계수는, 사전 계산으로 테이블화 해둔다. 그렇다면, 이 가중치 계수가 중요해진다.

SHEXP기법의 연구 개발그룹에서는, 이 2개의 가중치 계수의 계산에는 일반적인 수치계산으로 이용되는 최소 이승법(最小二乘法)을 사용했다.

어떤 차폐 정보로부터, 그 차폐계수벡터 g를 구하고, 이것을 SH Log 연산해서 SH Log공간으로 변환해 그것을 f라고 했을 때, f의 값으로부터 최소이승법으로, 그 2개의 가중치 계수 a, b가 구해지므로, 사전 계산해서 작성하는 테이블은 f를 키로 해서 a, b를 구하는 방법을 생각할 수 있다.

그러나, 이것은 실현이 어렵다. 그것은, 아무리 등장하는 3D모델이 구(球)뿐이라고는 해도, 구의 중복 상태나 그 조합은 무수히 많기 때문에, 이것에 대응하는 자기 차폐 상태 g도 무수히 많아지고, 결국은 f도 무수히 존재하게  된다. f를 키로 한 테이블의 사이즈가 방대해져 버려, 현실성이 없는 것이다.

SH Exp 연산의 개념도. 퍼포먼스 향상을 위해서 맨앞의 선형항 2개와 가중치 계수를 이용한 계산으로 근사한다. 그 가중치 계수는 테이블을 사용한다

<그림 설명>
상:
고속판,
근사계산,
a,b의 테이블화,
기본개념 -> 근사 정밀도 개선 ->a, b 테이블 작성
테이블 바깥에의 처리,
고속 처리가 가능!!
하:
기본판,
SH Log공간,
직접계산 or 대각화,
계산부하가 높다,
통상공간,
a, b 테이블


모든 차폐 정보에 대해서의 SH Log공간에서의 f를 구해, 그 f로부터 대응하는 2개의 가중치 계수 a, b를 얻는다는 것이 기본 발상. 그러나, 차폐의 조합이 너무 방대하다

<그림 설명>
(제목) a, b 테이블의 작성 (개념)
요점1: 차폐정보를 몇개정도 직접 작성해, SH Log변환
요점2: 최적의 근사를 해주는 a, b를 계산해서 테이블화
(박스 좌~ 우)
자신이 직접 적당히 만든 차폐정보
SH Log 연산
최적의 a, b를 계산
a,b 테이블

거기서, 한층 더 타협 조건을 부여한다. 그것은 f가 아니라 f의 절대값를 키로 한다는 조건. 나아가, 그 절대값의 상한과 하한을 결정해 버린다는 간략화의 타협도 추가한다. 이렇게 해서, 뭔가 현실적인 테이블화가 보이는 것 같다.

테이블화 실현을 위해서 좀더 타협안을 도입한다

<그림 설명>
(제목) a, b 테이블 작성의 개량
(박스) 차폐정보의 조함은 무수히 존재
→  f 마다 a, b를 테이블화하는 것은 비현실적
타협점:
√  f가 아니라 │f│로 테이블화
   → f가 달라도 │f│가 같으면 같은 a, b를 이용
   → 조합 시킬 수를 감소
√  테이블의 상한, 하한을 설정
(박스) a,b 테이블


타협안으로서는 너무 대담하므로, 이대로는 근사 정밀도가 그다지 좋지 않다. 거기서 정밀도 향상을 위한 방법을 생각해 해준다.

SH Log 공간으로 변환된 차폐계수 벡터의 요소 중에서, 절대값이 큰 것은 최초의 항 뿐이므로, 이 최초의 항만은 원래대로 SH Exp계산을 해주는 것이다. 절대값이 큰 최초의 항이 정밀도가 올라가면, (전체) 정밀도가 올라간다……이것을 노리는 것이다.

구체적으로는, SH Log공간의 차폐 계수 벡터의 최초의 항과 두번째항 이후를 분해해 최초의 항에 대해서는 SH Exp계산을 해주고, 그 이후에 대해서는, 그 대담한 2개의 가중치 계수 테이블을 사용한 간략 계산을 실시하도록 한다.

정밀도에 큰 영향을 주는 절대값이 큰 최초의 항과 두번째항 이후에 대한 계산 방법을 다르게 한다.

<그림 설명>
(제목) a, b 테이블의 근사 정보를 개선
→ DC Isolation (직류성분의 분리)



이 논리를 이용하기 위해서는, 2개의 가중치 계수를 얻기 위한 테이블을, SH Log 공간의 차폐계수벡터의 최초의 항을 제외한 나머지에 대해 작성할 필요가 있다

2개의 가중치 계수를 얻기 위한 테이블 작성의 두번째안. 앞에서 나온 그림과 개념적으로는 같지만, SH Log공간의 차폐 계수 벡터의 최초의 항을 제외한 것들에 대응하는 것으로 한다.

덧붙여, 이 테이블에서는, 키로 하는 f 값에 절대값의 하한과 상한을 설정한다고 하는 타협안을 적용했지만, 그럼, 그 조건을 만족할 수 없는(범위 밖의) f에 대해서는 어떻게 하면 좋을까?

f의 절대값이 하한,또는 상한을 넘는 경우, 하한, 상한 범위에 들어갈 때까지, 그 값을1/2(으) 해 간다. 그리고, 하한 상한 범위에 들어가면 테이블에서 구한 계수 a,b(을)를 꺼내, 그 값으로부터 SH Exp의 근사를 구하는데, 구한 값에 대해서, 방금전의1/2 한 횟수만큼,Triple Product계산을 하면 된다고 한다. 이 논리에 대한 수학적인 증명도 여기서는 생략 한다.

테이블 범위를 벗어난 경우에 대한 대처의 구체적인 예

차폐계수 벡터의 통합을 SH Log공간에서 실시하고, SH Exp연산으로 통상공간으로 되돌릴 수 있으면, 나머지는 음영 처리(휘도 계산) 뿐이다. 이것에 대한 처리계는 PSF기법과 논리는 완전히 똑같아서, 이 이후의 처리에 대해서는 해설을 생략 한다.

자기변형 할수있는 3D모델에 대해서도 동적 PRT를 적용할 수 있게 됨으로써 PRT의 응용범위는 극적으로 넓어졌다.

휘도 계산시의 반사 모델을 변경하면 당연히 금속과 같은 질감 표현도 가능하다

동적PRT의 가능성

2002년에 등장했을 때, PRT는 3D게임 그래픽스와는 관계없는 기술이라고 생각되어져 왔지만, GPU의 진화와, PRT기술 그 자체의 진화에 의해서, 3D게임 그래픽스에의 응용에 대한 기대가 높아져 왔다고 말할 수 있다.

특히 3D모델이 변형해도 적용할 수 있는 SHEXP기법의 동적PRT은, 본스키닝(Bone Skinning)된 3D캐릭터에도 대응 가능한 것이고, 인간이나 동물이라는 동적인 3D캐릭터 표현에도 문제 없게 대응할 수 있는 것이다. 이것이 넓게 활용되게 되면, 3D게임 그래픽스의 리얼리티는 향상되고, 표현의 폭도 한층 더 확장될 것이다.

본 연재에서 다룬 PRT는 차폐(그림자)로 한정한 테마였지만, PRT는 본래 「빛의 전달」(RADIANCE TRANSFER)를 「사전 계산」(PRECOMPUTE)하는 일반형이기 때문에, 사전계산하는 요소를 다르게 하거나 혹은 늘려 감으로써, 복잡하고 특수한 재질의 표현도 가능하다. 예를 들면, 피부와 같은 반투명 재질의 표현이나, 2차 반사광 이후의 복잡한 상호 반사의 음영 처리등도 가능하다.

현재의 SHEXP기법의 동적PRT에서도, 기본적으로 정점 단위의 음영 처리를 하고, 게다가 PRT의 단위가 구체 근사화 된 형상단위가 되므로, 세세한 디테일까지 고려한 복잡한 빛의 전달을 재현할 수 있는 것은 아니지만, 일반적인 반사 모델을 이용한 픽셀 단위의 음영처리와 조합하면, 그러한 결점도 보완할 수 있을 것이다.

가능성은 보였다고 해도, 3D게임 그래픽스에 응용하려면 , 아직도, 처리 속도나 비디오메모리 용량의 관점에서는 넘어야 할 과제가 많은 것 같다. 하지만, 이것은 하드웨어의 진보로 어떻게든 해결될 문제이다.

그런 의미에서는, 현재 세대 이후의 PC게임등의 앞선 엔진등에서는, 동적 PRT의 구현이 시작될 가능성은 높다.

PRT의 대상 요소 예.점 P에 대해서 PRT 할 수 있는 요소는 많이 있다. 다만, 다루는 요소가 많아지면 많아질 수록 계산 부하는 커져, 비디오메모리 사용량은 증가한다. 그러나, 이것은, 역으로 말하면, GPU 진화로 해결할 수 있는 문제라고도 말할 수 있다


 

Posted by 노을삼킨별
,


아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/PRT




한정 조건부 동적 PRT - PSF(Precomputed Shadow Fields)란?


2009-07-03 14:51:11
動的PRT第一段階PSF技法とは? 静的PRTが発表された後、世界のリアルタイム3Dグラフィックスの研究者が積極的に研究開発に乗り出したのが「シーン上のオブジェクトを動かせない」という制約の撤廃だ。 2005年のSIGGRA ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.


동적 PRT 첫번째 단계 Precomputed Shadow Fields(PSF) 기법이란?

정적 PRT가 발표된 이후, 세계의 실시간 3D그래픽스 연구자들이 적극적으로 연구 개발에 나선 것이 「씬 상의 오브젝트를 움직일 수 없다」는 제약의 철폐이다.

2005년의 SIGGRAPH 2005에서 Kun Zhou씨등이 발표한「Precomputed Shadow Fields for Dynamic Scenes」논문에서 제창된 「Precomputed Shadow Fields」(PSF) 라는 개념이 이 제약의 철폐를 향한 큰 발판이 된다.

이것은, 개개의 오브젝트는, 형상(형태) 변형은 허용되지 않지만, 각각의 위치를 바꾸거나 기울기를 바꾸거나 하는 것은 가능한 동적 PRT이다. 석상이나 동상, 연필이나 펜, 병이나 식기 등, 그 자신이 변형되지 않는 강체 모델이라면, 씬에 움직임을 추가한다 해도 활용할 수 있는 PRT이고, 3D게임에의 응용 가능성을 확 끌어 당긴 기술이라고 할 수 있다.

그런데, 정적 PRT에서 , 씬의 움직임에 대응할 수 없었던 것에는 근본적인 이유가 있다. 그것은 「씬 전체를 "1개"의 오브젝트로 취급한다」는 대전제가 있었기 때문이다. 거기서, 씬을 「복수의 오브젝트로 이루어진다」고 분해해서 생각하면 어떨까? 라는 발상이 생겨나게 되었다. 즉, 정적 PRT에서의 차폐구조에 대한 생각을, 「자기 자신의 부위가 자신을 차폐하는 "자기차폐"」와, 「다른 오브젝트에 의한 차폐」로 나누어 생각하려는 것이다.

토끼의 「자기차폐」란, 예를 들면 토끼의 귀가 몸체를 가리는 것. 「다른 오브젝트에 의한 차폐」란 불상의 그림자가 차주전자(teapot)에 걸리는 것 같은 그런 상황

<그림 설명>
자기 자신에 의한 차폐: 자기차폐
타오브젝트에 의한 차폐


자신이 변형하지 않는 강체의 경우, 당연하겠지만 자기차폐 구조는 변하지 않는다. 즉, 이것은 사전계산이 가능하다고 할 수 있는 것이다.

형상이 변하지 않는다고 전제하면, 자기 차폐는 사전에 계산해 둘 수 있다

<그림 설명>
각 물체를 강체라고 가정하면, 자기 자신에 의한 차폐는 불변
-> 각 물체는 이동, 회전할 수 있지만, 형상(형태)은 변형될 수 없다.

정적 PRT에는 없었지만 동적 PRT에서는 요소가 되는 것이「다른 오브젝트에의 차폐」이다.

다른 오브젝트에의 차폐는, 자신을 중심으로 어느 일정 거리에 떨어진 곳에 있는 동심구(同心球, 중심은 동일하고 반경이 다른 구)상의 점에 대한 차폐 구조로 생각한다.

즉, 아래의 그림으로 해설하면, 그림속의 토끼의 주변에, 눈에는 안보이는 가상적인 구를 생각해, 그 구의 내면에 무수한 카메라를 설치해서, 각 점으로부터 토끼의 실루엣이 어떻게 보일까를 모두 기록해 둔다라는 이미지이다.

토끼의 주변에, 눈에는 보이지 않는 가상적인 구를 생각해, 그 구의 내면에 무수한 카메라를 설치해서, 각 점으로부터 토끼의 실루엣이 어떻게 보일까를 모두 기록해 둔다


오브젝트 자신이 변형되지 않으면, 그 구 내의 각 점에 설치된 카메라에서 보이는 모습도 변하지 않는다. 즉, 각각의 방향에서의 다른 오브젝트에의 차폐 구조는 변하지 않는다고 생각할 수 있다. 이 다른 오브젝트에의 차폐 구조를 「Shadow Fields」라고 부르고, 이것을 사전 계산해서 구하기 때문에 "Precomputed" "Shadow Fields", PSF가 된다.

Shadow Fields의 사전 계산

이 PSF기법의 구조는 어떠한가? 조금, 보고 가기로 하자.

자기차폐의 차폐구조의 사전 계산은, 정적 PRT 때와 거의 같다. 각 3D모델상의 모든 정점으로부터 자기 차폐  구조를 조사/추출해서, 이것을 최종적으로는 구면조화함수로 근사 해서 그 스케일링 계수를 얻어, 이것을 차폐 계수 벡터로서 보존하는 것이다.

약간 개념의 전환이 필요한 것은, 다른 오브젝트에의 투사를 구하는 Shadow Fields의 계산이다. 자기 차폐의 산출에서는, 그 3D오브젝트를 구성하는 정점에서 본 차폐 구조를 구했지만, 이것에 반해, Shadow Fields의 산출은, 그 동심구 상의 각 점에서 본 차폐 구조를 구하는 것이 된다.

즉, 차폐 구조를 구하는 위치가 3D오브젝트의 외곽측에서 행해진다는 것 이외에는 자기 차폐의 계산과 같은 것이다. 각 동심구 상의 모든 정점으로부터 차폐 구조를 구해, 이것을 구면조화 함수로 근사해서 그 스케일링 계수를 구해, 저장(보존)하는 것이다.

이 때의 반경 r은, 물체의 경계구(Bounding Sphere. 그 물체 전체를 포괄 할 수 있는 구)를 기본으로 0.2r ~ 8.0r까지, 적당한 스텝으로 결정하고 있다고 한다. 피라미드사의 구현에서는 0.2r ~ 8.0r까지의 각각을 32등분 해서 구현했다고 한다.

「다른 오브젝트에의 차폐 구조」의 사전 계산은, 동심구 상의 각 점에서 3D모델 방향으로의 차폐 구조를 구한다. 구한 차폐 구조 정보는 구면조화 함수로 근사해 그 스케일링 계수를 구해서 보존한다. 이 흐름은 정적PRT와 똑같다

이 자기 차폐나 Shadow Fields의 산출은, 그 씬에 등장하는 3D오브젝트의 개수만큼 실시하게 된다. 예를 들면4종류의 3D오브젝트가 등장한다면 그 4종류에 대해 각각 자기 차폐와 Shdaow Fields를 산출할 필요가 있다.

주목되는 것은 형상(형태)이므로, 다른 색의 동일 형상 오브젝트를 등장시키는 3D게임에서의 활용의 경우에서는, 한 번 산출한 자기 차폐나 Shdaow Fields는 유용(流用)이 가능하게 된다. 또, 동일 형상(형태)이고 크기가 다른 것(확대 축소한 것)도, 동일하게 취급할 수 있다.(계속)





한정 조건부 동적 PRT - PSF기법에서의 라이팅


PSF기법에서의 라이팅

정점 단위의 음영 처리가 되는 것은 앞에서의 정적 PRT와 같다. 즉, 실제 렌더링 시, 3D모델의 각 정점들에 대해 라이팅을 해주게 된다. 구체적으로는, 그 라이팅을 실시하는 정점에 자기 차폐 정보를 고려하고, 나아가 그 정점에 영향을 미치는 다른 오브젝트의 Shadow Fields를 고려한다, 라는 흐름이 된다. 그리고 다른 오브젝트의 동심구 상에 나열된 복수의 Shadow Fields로부터 어떤 것을 선택할까이인데, 이것은 그 라이팅 대상인  정점으로부터 가장 가까운 8개의 후보를 선택해 가중치를 붙여서 선형 보간을 해서, 그 결과를 채택한다.

PSF기법에서의 라이팅

<그림 설명>
(버블) 이 정점의 라이팅은, 이 정점의 자기차폐를 고려하고, 이 정점을 포함하는 가까운 Shadow Fields를 참조 & 선형보간해서 「다른 오브젝트에의 차폐」(이 경우는 토끼에서 차주전자로의)도 고려한 형태로 한다. (이 그림은 2D로 표현되어 있어서 4개의 Shadow Fields를 참조하고 있지만 실제 3D렌더링에서는 8개)

물론, 자신과 다른 오브젝트에서 기준으로 하는 좌표계가 서로 다르기 때문에, 다른 오브젝트의 Shadow Fields 정보를 글로벌 좌표계로 변환하는 처리를 하지 않으면, 이쪽으로부터 다른 오브젝트의 Shdaow Fields를 사용할 수 없다.

알기 쉽게 앞의 그림을 인용해서 말하면, 차주전자와 토끼가 회전하고 있어서 다른 방향이 되어 있을 때, 차주전자에서 본 토끼는 상대적으로 다른 방향을 향하고 있기 때문에, 토끼의 「다른 오브젝트에의 차폐 정보 = Shadow Fields」를 이쪽에 반영 시키려면 그 Shadow Fields의 방향(좌표계)까지 변환하지 않으면 않된다라는 것이다.

이 Shdow Fields의 방향 변환 처리(좌표계 변환 처리)가 SH Rotation이라는 처리이다. SH은 Spherical Harmonics(구면 조화 함수)의 약자이다. 간단히 말하면, 구면 조화 함수로 근사 해서 만든 차폐 구조 데이터를, 그 스케일링 계수만을 사용해 좌표축 회전을 해 버리는 것이 SH Rotation이다.

구면 조화 함수의 스케일링 계수들로 된 계수 벡터만으로 좌표계의 회전을 실시하는 처리가 「SH Rotation」이다.

<그림 설명>
SH Rotation이란??
정보(화상)의 기준축 회전을 계수벡터 공간에서 직접 실행하는 연산

그리고 이어서 좌표계를 변환한 다른 오브젝트의 Shdow Fields들을 이쪽의 자기 차폐에 통합(반영)시키는 처리를 실시하는 것인데, 이것에는 SH Triple Product(고도의 복수회에 걸친 내적 연산)라는 연산을 한다.

SH Rotation과 SH Triple Product의 실제 논리나 처리계에 대해서는, 복잡하고, 지면 문제 상 여기서는 생략 한다. 양쪽 다 계수 벡터 차원에서 실시하는 계산이고, 또한 고속화를 고려한 방법이며, 구면조화 함수등과 같이 「현존하는」툴로서 활용해도 된다고 여겨지고 있다. 다만, 계산 부하는 그 나름대로는 크다.

SH Rotation과 SH Triple Product의 이론이나 구현에 대해서는 「Spherical Harmonic Lighting: The Gritty Details」(SH Rotation의 구현 방법), 「Code Generation and Factoring for Fast Evaluation of Low-order Spherical Harmonic Products and Squares」(SH Triple Product의 구현 방법)라는 논문이나, 피라미드사가 제공하는 자료를 참고하기 바란다.

처리하고 있는 정점에의 타 오브젝트로부터의 영향 유무에 대한 조사는, 그 씬에 등장하는 모든 타 오브젝트에 대해 실시한다. 영향이 있는지 없는지의 판단은, 앞에서의 바운딩스피어의 8.0r의 거리를 기준으로 실시하면 된다. 8.0r의 거리 이상 떨어진 다른 오브젝트에 대해서는 영향이 없다고 무시하고, 반대로 8.0r의 거리 이하의 다른 오브젝트에 대해서는 영향이 있다고 판단한다. 영향이 있다면 그 Shadow Fields를 통합해 나간다(계산에 포함한다).

모든 정점에 대해 차폐 구조를 산출 했으면, 이후의 음영 연산(휘도 계산)은 정적 PRT와 같다. 재차 말할 필요는 없겠지만, 그 차폐 계수 벡터와 광원 계수 벡터의 내적을 구할 뿐이다.(계속)

PSF기법에 의한 동적 PRT는 개개의 3D오브젝트의 변형은 허용 되지 않지만 위치 이동이나 회전은 허용 된다

피라미드사에 의한 PSF의 구현예. 마치 레이트레이싱에 의한 오프라인 렌더링 된 것 같은 부드러운 음영의 오브젝트들이 움직인다. 여기까지 움직일 수 있게 되면, 특정 타입의 게임이라면 실용화가 가능할지도 모른다



 

Posted by 노을삼킨별
,


아래에서 퍼옴

http://allosha.tistory.com/category/니시카와%20젠지/PRT



Precomputed Radiance Transfer(PRT)란?


2009-06-04 01:15:11
現在、次世代の3Dゲームグラフィックス技術として実用化が進められているものにPRT(Precomputed Radiance Transfer)がある。 PRTは日本語訳では「事前計算・放射輝度・伝搬」ということになり、なにをするものか難解 ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.


오늘날, 차세대 3D게임 그래픽스 기술로서 실용화가 진행되고 있는 것으로 PRT(Precomputed Radiance Transfer)가 있다.

PRT는 일본어 번역에서는 「사전계산 방사휘도 전달」이라 하고, 무엇을 하는 것일까 난해한 키워드들로 되어 있지만, 현재, 근대 GPU의 활용 테마로서는 가장 유행하는 것들 중 하나이며, 근대의 실시간 3D그래픽스를 말할 때 아무래도 피할 수 없는 것이 되고 있다.

이번회 부터는, 이 PRT 기술에 대한 기본사항과 최첨단 PRT기술의 최신 동향까지를 소개한다.

PRT는 실시간 글로벌 일루미네이션(Global Illumination)

오늘날의 실시간 3D그래픽스에서는, 광원을 설정하면 기본적으로는 그 광원의 빛을 직접 받는 음영계산 밖에 하지 않는 약식처리가 대전제로 되어 있다.

현실 세계에서는, 광원으로부터의 빛이 제삼자에 의해 차폐된다거나, 또는 빛이 어떤 물체에 닿아서 반사한 그 빛도, 다시 광원이 될 수 있다(2차 광원). 그러나, 현재의 실시간 3D그래픽스에서는 이러한 처리는 생략되거나 유사방법(Fake)으로 대신하는 경우가 많다. Fake라고 해도 그 나름대로 이치에 맞는 것처럼 보이면 상관없는 것이지만, 무언가 위화감이 남아 버리는 국면도 적지는 않다.

이러한 차폐나 상호반사등을 다뤄, 복잡한 조명을 재현하려고 하는 것이「 대국적인 조명 기술」(Global Illumination : 글로벌 일루미네이션)이라는 기술/개념이다.

하지만, GI는 복잡하고 계산량도 많기 때문에, 정식으로 구현된 것은, 실시간에 작동 시키기가 매우 어렵다.

거기서, 이 GI를, 복잡한 빛의 이동에 대해서는 오프라인으로 시간을 들여 미리 계산해 버리고, 실시간 렌더링시에는 그 사전 계산 결과를 이용해서 실현하려는 아이디어가 등장한다.

그 하나가 이「PRT」라는 것이다.

이 PRT가 각광을 받기 시작한 것은, 2002년 SIGGRAPH 2002에서 「Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environments.」(Peter-Pike Sloan)라는 논문이 발표되고 부터이다.

이 원조적인 아이디어에서는, 어느 씬에 대해 PRT를 실시할 때 , 광원은 움직일 수 있지만「그 씬에 등장하고 있는 캐릭터나 오브젝트는 일절 움직일 수 없다」라는, 실시간 3D그래픽스에 있어서는 치명적인 제약이 있었다. 거기서 「움직이지 않는 배경에만 PRT를 사용한다」라는 한정 조건부로 3D게임 그래픽스에 응용하는 예도 제창되었지만, 메모리 사용량이나 얻을 수 있는 효과의 밸런스를 생각하면 실용성은 낮다고 하지 않을 수 없었다.

그러나, 이 논문이 기폭제가 되어, 각방면에서 연구 개발이 이루어지게 되었다. 그 보람이 있어, 최근 몇년 사이에, 씬을 실시간으로 움직여도 적용할 수 있는 PRT 기법, 말하자면「동적인 PRT」까지도 발표가 되었다.

본연재에서는, 이 동적 PRT의 기초 이론까지를 소개하겠지만, 갑자기 동적 PRT로 넘어가도 의미가 없기 때문에, 가장 기본적인 PRT인 「정적 PRT」……즉 「그 씬에 등장하고 있는 캐릭터나 오브젝트는 일절 움직이지 않는」, 고정적인 씬에 있어서의 정적PRT 부터 차례대로 보고 가기로 하자.(계속)

                                                          PRT의 기본 개념

< 그림 설명>
좌:
현재의 실시간 3D그래픽스
광원, , 벌레
(버블) 이 픽셀의 음영처리는 광원의 차폐나 반사광의 영향을 무시하고 있다.
우:
광원, 반사, 차폐
(버블 상) 하나의 픽셀에 오는 모든 빛이나 차폐를 실시간으로 고려하는 것은 어렵다.
(박스) 이 픽셀에 어떤 빛이 오는지를 사전에 가능한 계산해 두려는 것이 PRT의 기본방침
(버블 하) ?을 사전에 계산 실시간 렌더링 때에는 사전에 구한 "?"의 부분을 사용한다.


CEDEC2006_kor01.zip


Precomputed Radiance Transfer(PRT)의 기본. 정적 PRT


PRT의 기본 ~ 정적 PRT란?

PRT는, 무엇을 미리 계산하는가에 따라 복잡도가 달라진다.

본연재에서 다루는 PRT는, 2006년에 개최된 게임 개발자 회의 CEDEC 2006에서 피라미드사가 발표한 내용을 바탕으로 하며, 「환경맵을 통째로 광원이라 생각하고, 복잡한 차폐를 고려해 실시간으로 렌더링한다」라는 테마로 한정하고 있다.

씬 내의 오브젝트가 움직이지 않는다고 전제하는 PRT가 「정적 PRT」이다. 2002년에 발표된 PRT의 원조격인 논문은 이 정적 PRT였다. 원안 발표자인 Sloan씨는 이전에 마이크로소프트사에서, Direct3D 개발에 깊게 종사한 인물이다.


그 씬을 둘러싸는 정경을 큐브 환경맵으로 만들어, 이것을 광원으로 보고 실시하는 라이팅을 특히 「Image Based Lighting」(IBL)이라 부른다. 본연재에서 해설하는 PRT 라이팅은 이 IBL를 전제로 한다.

IBL : Image Based Lighting의 기본 개념

<그림 설명>
좌:
이런 씬이 있다고 하면...
(버블) 배경을 텍스처에 렌더링해서 환경맵이라 한다.(실제로는 전방위 6면체 환경맵인 큐브맵을 생성한다.)
우:
(박스) 그 환경맵으로 라이팅을 하는 것이 IBL의 기본개념


픽셀 단위의 라이팅을 할 때, 그 픽셀의 방향(법선벡터)에 근거해 큐브 환경맵을 참조하고, 그 텍셀을 광원으로 보고 음영연산을 실시하는 간이기법도 IBL로 불리지만, 여기서 말하는 IBL은 차폐나 그 외의 복잡한 빛의  움직임(음영 뿐만이 아니라, 경우에 따라서는 빛의 침투나 굴절, 반사 등)을 고려한 것을 가리킨다.

IBL에서는 이와 같이 6면체 구조의 전방위 환경맵을 광원으로서 이용하는 경우가 많다

<그림 설명>
좌:
환경광원
무한원(無限遠, 무한히 먼 곳)에 존재
중:
구(球)에 투영
우:
전개(展開)


그러한 고도의 IBL을 온전히 구현하려면 , 우선, 그 씬의 각 정점으로부터 전방위를 둘러 보았을 때의 차폐정보와 법선벡터 정보(실제로는 코사인값. 뒤에서 서술)를 텍스처에 기록해 둔다. 이것이 「사전 계산」부분이다.

그리고 렌더링시에는, 각 픽셀내지는 각 정점에서, 사전 계산으로 작성한 그 텍스처로부터 광전달 함수를 복원해, 그 때의 시선 방향(시선 벡터)을 고려해서, 큐브 환경맵 광원을 참조해 라이팅을 실시한다. 이것이 IBL기반
 PRT의 기본적인 흐름이다.

사전 계산 부분에서, 「전방위의 차폐 구조를 조사」하는데, 전방위라고는 해도, 실제로는 텍스처 리소스는 유한하기 때문에 8방향, 또는 16방향이라든지 적당한 수의 방향으로의 조사를 된다. 또,  그 차폐 구조 조사는 ray tracing적인 기법으로 행해진다(GPU 가속을 사용한 방법도 있음).

「코사인값」이란, 그 적당한 전방위 방향벡터들과 법선벡터와 내적한 값. 예를 들면 32방향에 대해 차폐 구조를 조사해 그것을 큐브맵에 기록한다면, 그 32방향에 대한 코사인값도 함께 계산해 큐브맵에 저장한다.

이 차폐와 코사인의 2개의 큐브맵을 곱한 것을 IBL적분항이라 부르고, 실제로는 이것을 사전에 계산해서 보관해 둔다.  4만개 정점의 씬이라면, 이 IBL적분항도 4만개 만들지 않으면 안되는 것으로, 이것을 리얼타임에 계산하는 것은 우선 무리라는 것은 상상할 수 있을 것이다. 게다가, 4만개의 큐브맵을 관리한다는 것도, 비디오메모리 용량의 관점에서 보면 비현실적이라고 하지 않을 수 없다.(계속)


IBL베이스의 PRT 개념. 씬을 구 모양의 정경이 둘러싸고 있다라는 이미지. 녹색 화살표는 그 정점의 법선, 오렌지색들은 전방위를 모식적으로 나타낸 것.

그 구 형태의 정경을 큐브 환경맵(6면체의 환경맵)으로서 근사 한다

그 씬의 모든 정점에 대한, 전방위로의 차폐구조(왼쪽)와 법선벡터 정보(코사인값, 오른쪽)를 텍스처에 기록. 이것도 역시 큐브 환경맵으로서 기록

실제로는 차폐 구조와 법선벡터 정보(코사인값)를 하나로 모아 IBL적분항으로서 관리. 논리상, 예를 들면 4만 정점의 씬에서는 이 IBL적분항의 텍스처가 4만개 필요하게 된다. 이것은 비현실적.



 

정적 PRT를 실시간으로 구현하기 위한 타협과 고안

이것을 실시간으로 구현하기 위해서는, 몇개의 타협과 간략화가 필요하게 된다. 1번째의 타협점은,「씬 상태의 고정화」다. 즉, 씬에 등장하는 오브젝트가 전혀 움직이지 않는다라는것. 이것은 「정적」PRT의 「정적」을 붙힌 이유이기도 하다.

PRT에서는, 모든 정점으로부터 전방향으로의 차폐 정보를 사전에 계산해서 취득, 보관했다가 활용한다는 방침을 기본으로 취했다. 따라서, 씬에 등장하는 오브젝트가 움직이면 차폐구조를 다시 한번 계산하지 않으면 안되기 때문에, 실시간에는 씬을 고정화 할 수 밖에 없다

2번째의 타협점은 조명계산(음영 처리)을 정점 단위로 하는 간략화다. 음영 처리를 픽셀 단위로 하는 것이 고품위 영상을 얻을 수 있는 것은 당연하지만, 이것을 정점 단위로 삭감함으로써 처리시간을 벌 수 있다. 실제의 처리계에서는 세정점의 계산 결과로부터, 그 폴리곤을 구성하는 픽셀 컬러를 선형보간해서 구하는 Gouraud Shading적인 접근방법을 취한다.

단, 정점 단위의 라이팅에서 주의하지 않으면 안 되는 것은, 렌더링 대상 3D모델의 정점수(폴리곤수)이다.

비록 아무것도 없는 평면의 지면이라도, 여기에 제3자의 그림자나 그 외의 복잡한 음영이 투사될 것이라고 상정하기 때문에, 1개의 폴리곤이 아니라 다수의 폴리곤으로 분할해 표현할 필요가 있다. 그렇지 않고 대강의 폴리곤 개수라면 음영의 결과가 반영되지 않고 부자연스럽게 되어 버린다.

퍼포먼스를 벌기 위해서 음영 연산을 정점 단위로 실시한다

비록 아무것도 없는 평탄한 마루일지라도, 그곳이 차폐되어서 그림자가 지는 경우, 그 부근의 정점들이 그림자색이 되는 것을 생각할 수 있다. 이것을 상정해, 어느 정도의 폴리곤수로 분할할 필요가 있다

다수의 폴리곤으로 분할하면 할수록 정점 단위의 음영 처리의 결과는 고퀄리티가 되지만, 그 만큼, 지오메트리 부하는 증가한다

3번째는, 모든 정점에 대해서 사전에 계산한 방대한 용량의 데이터를 압축하자는 방책이다.

예를 들면, 4만 정점의 씬으로, 큐브맵화한 IBL적분항이 32×32 텍셀의 작은 큐브맵이었다 해도, 1 정점 당32×32×6면×4바이트(αRGB각 8비트 칼라) = 24kB. 이것이 4만 정점 만큼 있으면 총 938MB의 비디오메모리가 차폐 정보의 저장만으로 사용되어져 버린다.

이것을 압축하는 기술로서 이용되는 것이, 요즘 3D그래픽스의 세계에서 볼 기회가 많아진「구면 조화 함수」(SH : Spherical Harmonics)이다. 이 구면조화함수는「양자 역학」 교과서에나 실려 있을 것 같은 것으로, 그러한 특수 수학을 3D그래픽스의 세계에 응용했다는 점이 PRT의 독특하고 획기적인 점이라 할 수 있다.

그런데, 모든 정점의 차폐 구조를 사전에 계산하고 있다고 해도, 실제로, IBL적분항으로부터 각 정점에 대해서 전방향의 음영 연산을 하는 건 처리가 무겁다. 그러나, 이 구면조화 함수를 사용하면 마침 그 문제도 해결 가능하게 된다.(계속)



 

구면조화(Spherical Hamonics) 함수란 무엇인가?

「구면조화 함수」는 말부터 어렵게 들리므로, 우선은 이미지로부터 파악해 보자.

구면조화 함수란, 극단적으로 간략하게 설명하면, 구(球) 같은 물체로부터 임의의 길이의 가시들이 뚫고 나와있는 「타원형의 찌그러진 성게」같은 물체의 형태를 수학적인 함수로 나타내기 위한 것……이라고 할 수 있다(성게의 가시들이 반대로  오목하게 패여 있는 경우도 있다).

이것이 어째서 큐브맵의 압축에 사용할 수 있는지 이미지가 쉽게 떠오르지 않을 지도 모르겠다.

차례차례 설명해 나가자.

모든 방향의 정경을 나타낸 큐브 환경맵을 구(球)로 보고 그 큐브 환경맵의 텍셀(화소)의 값을 "높이" 로 본다. 그러면 「찌그러진 성게」같은 입체가 완성된다. 그리고, 이 찌그러진 성게를 정확하게 기록하는 것은 포기하고, 「대략적인 형태」만을 기록하기로 한다. 그 수단으로서 구면조화 함수를 이용하는 것이다.

앞에서, 32×32 텍셀의 6면체의 큐브 환경맵을 예로 들었는데, 비압축 시에는 하나의 정점 당 24kB의 데이터량이 필요했다. 저장하는 구면조화 함수의 계수들의 개수에 따라 데이터량이 변하지만, 실용 레벨로는 16개 정도의 계수로도 충분하다고 한다. 만일, 16개의 32비트 부동소수점이면 불과 64바이트. (즉) 24kB의 1/400로 작아진다. 방금전의 4만 정점의 예라면, 2.4MB로 끝나므로, 938MB와 비교하면 상당히 현실적인 데이터량으로 압축할 수 있음을 알 수 있다.

구면조화함수는 「찌그러진 성게」형태의 근사적인 표현방법으로 사용된다.

<그림 설명>
(제목) 구면조화함수의 요점
상:
(박스) 구면조화함수를 사용한 근사 ≒ 본래의 휘도 분포  <-  각방향의 휘도를 높이로 변환
<- 구에 투영
구면조화 함수는, 대강의 특징을 극도의 효율로 근사할 수 있다
하:
(박스 좌) 데이터량
16개~36개의 float: 64byte(16개의 경우)
(박스 우) 데이터량
큐브맵의 데이터량: float * (32*32*6) 필셀: 24,576byte
데이터량을 1/400로 압축!!

구면조화함수는, 어떤 형상을 표현하기 위해 복수의 함수군들로 구성된다. 그 함수의 수가 많을 수록 형상 표현이 정확하게 된다. 자세한 수학적인 정의는 여기서는 생략 하지만, 아래 그림은, 어떤 파라미터가 주어진 구면조화함수를 나타내고 있다. 그림에서 위에서 부터 1차(first order, 또는 1레벨) 까지 구면조화함수를 사용하면 1개, 2차(secode order)까지 사용한다면 합계 4개, 3차까지는 합계 9개, 4차까지는 합계 16개……라는 상태로 함수의 개수가 증가한다.

l = 0,1,2,3…, m = -l ~ +l에서의 구면조화함수의 수식(上)과 3차원으로 가시화한
그림(下). 만일, 예를 들어 l=3의 4 레벨까지 사용한다고 하면 총16개의 구면조화함수를 사용하게 된다


그림을 한번 더 보고 싶다.

l 값이 작을 수록 형상이 단순하고, 반대로 l 값이 커지면(아래에 가면 갈수록) 뾰족뾰족한 형상이 복잡하게 되어 지는 것을 알 수 있다. 방금「찌그러진 성게」의 형상을 근사하는 것에, 많은 구면조화함수를 사용하면 고품질로 근사 할 수 있다고 말했다. 이것은 결국, 이 그림의 아래쪽의 복잡한 형상들을 사용하면 할수록, 그「찌그러진 성게」를 보다 정확하게 표현할 수 있다는 것이다.

표현하고 싶은 「찌그러진 성게」는, 큐브 환경맵이고, 그 값은 큐브 환경맵 마다 고유하다. 그 말은, 각각 그 가시의 길이나 그 구처럼 생긴 형태의 크기가 다 다르다는 것이다. 어느 가시가 길면 그 가시가 길어지도록 구면조화함수의 크기를 바꾸어 줄 필요가 있다.「찌그러진 성게」형상의 근사에는, 복수의 구면조화함수에 대해서 가장 적당한 스케일링 계수(크기를 결정 짓는 에누리)를 줄 필요가 있다. 이 계수를 구하는 계산은 여기서는 생략 하지만, 간단하게 말해 어떤 정해진 방정식을 풀어서 구할 수 있다.

예를 들면, l = 3까지의 16개의 구면조화함수를 이용해 근사 할 때는 16개의 스케일링 계수를 구할 필요가 있다.

「찌그러진 성게」형상의 근사에는, 사용한 구면조화함수 1개마다 가장 적합한  스케일링 계수를 도출해 조합해 줄 필요가 있다

<그림 설명>
(제목) 구면 조화 함수에 의한 근사
좌:
(박스) 대략적인 특징을 근사 가능
(박스) 근사한 결과
우:
(박스 좌) 압축하고 싶은 정보 S
(박스 우) 최적의 계수 계산식
(박스 중) 구면조화함수 -> 스케일링 계수
(박스 우) 1:1 대응
(박스 우) 최적의 계수를 수치적으로 계산 가능
(박스 하) 구면조화함수

스케일링 계수를 도출하면, 이것만으로 근사를 한 「찌그러진 성게」의 형상을 복원할 수 있다. 덧붙여 경험적으로, 실시간 3D그래픽스에서의 PRT용의 경우,  대개 16개(l=3)~36개(l=5)의 구면조화함수면 충분한 것으로 알려져 있다.

<그림 설명>
(제목) 구면조화 함수의 요약
근사한 정보 = 구면조화함수  ≒ 근사전의 원래 정보
계수벡터를 보존하면, 큐브맵을 보존하는 것과 같다
각 정보 사이에서 변화하는 것은 계수 뿐 -> 계수만 정보단위로 보존
계수 벡터라고 호칭
0.0 - 검은색, 1.0 - 흰색의 그레이스케일로 가시화


구면조화함수 그 자체는 이미 존재하는 것이며, 산술적으로 산출할 수 있다. 그렇다면, 어떤 「찌그러진 성게」형상을 기록&재현하려고 했을 때(근사되어 버리지만), 그 구한 계수만을 기록해 두면 복원이 가능하게 된다.

예를 들면 앞의 한개 정점 당 24kB의 데이터량이 필요했던 그 형상 데이터를, 16개의 구면조화함수로 표현한다면, 불과 16개의 계수를 보존해 두면 복원 할 수 있다. 구면조화함수로 1/400로 압축할 수 있는 트릭이 여기에 있다.

보다 감각적인 예를 든다면, 구면조화함수란, MPEG나 JPEG의 압축에 이용되는 이산 코사인 변환의 「구체(球體) 버젼」이라고 할 수 있을지도 모른다.(계속)




 

렌더링 시의 음영 처리는?

여기까지를 근거로 정적 PRT의 흐름과 개념을 정리한 것이 아래 그림이다.

정적 PRT(Static PRT)의 개념도.「구면조화함수」는 데이터 압축 메서드로 활용된다

< 그림 설명>
(제목) Static PRT의 개념도
상:
사전 계산
차폐계수 벡터
차폐정보를 취득 -> 데이터 압축 -> 휘도계산
하:
실행시
구면조화함수
광원정보 입력 -> 데이터 압축 -> 휘도계산
광원계수 벡터


차폐구조의 구면조화함수는 흑백이므로 1채널 분량만 다루면 되지만, 주변 정경의 큐브 환경맵의 압축은 RGB 3채널 분량을 같은 형태의 구면조화함수로 압축해야 한다.

그런데, 이 정적 PRT에서는 각 정점 단위로 음영계산(휘도계산, 조명연산)을 한다고 앞에서 말했다.

그러나, 각 정점에서 차폐구조 큐브맵도, 광원으로 취급하는 전체 정경을 그린 큐브 환경맵도, 모두 구면조화 함수의 계수가 되기 때문에, 그 음영계산 방식이 쉽게 이해되지 않는다. 실은, 이 계산은, 이 구면조화함수의 스케일링 계수열들을 벡터로 가져와서 내적 계산하는 것이다.

수학적인 증명은 여기에서는 생략 하지만, 이번회의 예로 보면, 차폐구조압축에서 구한 구면조화 함수의 스케일링 계수열로 된 「차폐계수벡터」와, 광원용 큐브 환경맵 압축에서 구한 구면조화함수의 스케일링 계수들로 된「광원계수벡터」의 내적을 구하면 음영계산을 한 것이 된다.

구면조화함수를 이용해 정보를 압축할 수 있었을 뿐만 아니라, 부차적으로 음영 계산의 간략화도 동시에 가능한 것이다.(계속)

차폐구조 압축에서 구해진 구면조화 함수의 스케일링 계수열로 된 「차폐계수벡터」와, 광원용 큐브 환경맵 압축에서 구해진 구면조화 함수의 스케일링 계수로 된 「광원계수벡터」의 내적을 구하면 음영연산(휘도 계산)을 해 준 것이 된다

<그림 설명>
제목: 휘도계산
계산정점,
Double Product(내적)


Posted by 노을삼킨별
,


아래에서 퍼옴

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