'수면'에 해당되는 글 1건

  1. 2009.12.07 수면(水面) 표현


아래에서 퍼옴

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