Skip to content

수면의 표현(5)~큰 물결

[칼럼 핵심 요약]
바다와 호수 앞바다의 수면에는 잔물결보다 더 큰 파도가 보인다. 이러한 큰 바다의 물결에 대해서는 옛날부터 아카데믹한 분야에서는 다양한 각도로부터 연구가 행해지고 있었지만, NVIDIA가 GeForce 6800 시리즈용의 데모로 겔스토너파 모델을 실장한 이래, 이 수법이 자주 이용되게 되었다.

🌐 원문 링크: 水面の表現(5)~大きな波 (Mynavi News)
📅 원문 발행일: 2009-03-27 | ✍️ 저자: 西川善司 (니시카와 젠지 / Zenji Nishikawa)

NOTE

💡 현대 그래픽스 관점에서의 발전사 (Modern Retrospective)

  • 본 칼럼에서 다루는 핵심 렌더링 기법은 현대 실시간 렌더링 엔진(DirectX 12, Vulkan, Unreal Engine, Unity)의 기초 이론을 구성하고 있으며, 최신 하드웨어 가속 기법 및 컴퓨트 셰이더와 결합하여 고도화되었습니다.

📖 본문 해설

[원문 리드문] > 바다와 호수 앞바다의 수면에는 잔물결보다 더 큰 파도가 보인다. 이러한 큰 바다의 물결에 대해서는 옛날부터 아카데믹한 분야에서는 다양한 각도로부터 연구가 행해지고 있었지만, NVIDIA가 GeForce 6800 시리즈용의 데모로 겔스토너파 모델을 실장한 이래, 이 수법이 자주 이용되게 되었다.

큰 파도 ~ 기하학 레벨 파

바다와 호수 앞바다의 수면에는 잔물결보다 더 큰 파도가 보인다. 해상을 무대로 한 3D 게임 등에서는 이러한 수면을 취급하는 국면이 많아진다.

이러한 큰 바다의 물결에 대해서는 옛날부터 아카데믹한 분야에서는 다양한 각도로부터 연구가 행해지고 있었지만, NVIDIA가 GeForce 6800 시리즈용의 데모 「Clear Sailing」(NVIDIA, 2004)에서 겔스토너파(Gerstner Wave) 모델을 구현한 이래, 이 수법이 자주 이용된다.

큰 파는 노멀 맵에 의한 범프 매핑으로 실현하기에는 무리가 있기 때문에, 실제로 버텍스 레벨에서 움직이는 (지오메트리 레벨의) 파로 실장할 필요가 있다.

실장의 방침은 여러가지 방법이 있지만, 미리 적당한 해상도로 분할해 둔 폴리곤 그리드의 버텍스을, 겔 스토너 파동 함수로 얻은 파의 버텍스 정보로 변위시키는 방법이 심플하고 실장하기 쉽다고 한다. NVIDIA의 「Clrear Sailing」 데모에서는 150×150으로 분할한 폴리곤 그리드에 대해 45개의 겔 스토너파를 발생시킨 실장이 되고 있었다. 또한, 겔 스토너 파의 발생에는 CPU를 활용하고 있었다.

전술 한 바와 같이, 이러한 지오메트리 레벨의 파를 가하면, 노멀 맵을 이용한 범프 맵핑에 의한 잔물결 표현의 주기성의 노출을 알기 어렵게하는 효과가있다. 수면의 표현에 그다지 무게를 두지 않는 그래픽 설계로 하는 경우는, 잔물결 표현은 고정의 복수의 노멀 맵에 의한 잔물결을 적당히 스크롤시킨 것만으로 하여, 지오메트리 레벨의 파를 수면에 적용한다고 하는 손잡이도 때때로 볼 수 있다. "3DMark06"(Futuremark, 2006)의 수면 표현은 바로이 패턴이었다. 3DMark06의 잔물결 표현은 2장의 노멀 맵을 스크롤시키면서 중첩한 것만으로, 이에 4개의 가르스토나파를 지오메트리 레벨에서 발생시킨 것이 되고 있었다.

"3DMark05"(Futuremark, 2004)의 수면 표현은 2개의 노멀 맵을 스크롤시킨 것만의 잔물결 표현만이었다. 기복이나 변화가 부족했다고 할 수 있다"3DMark05"(Futuremark, 2004)의 수면 표현은 2개의 노멀 맵을 스크롤시킨 것만의 잔물결 표현만이었다. 기복이나 변화가 부족했다고 할 수 있다

"3DMark06"(Futuremark, 2006)의 거의 같은 장면보다. 이곳은 가르스토너 파에 의한 지오메트리 레벨의 파가 더해져 외형의 복잡성이 증가했다"3DMark06"(Futuremark, 2006)의 거의 같은 장면보다. 이곳은 가르스토너 파에 의한 지오메트리 레벨의 파가 더해져 외형의 복잡성이 증가했다

시점 위치가 수면에 대해서 다이나믹에 가까워지거나 멀어지거나 하는 3D게임의 그래픽스에서는, 픽셀 단위의 잔물결 표현과 버텍스 단위의 큰 파를 시선으로부터의 위치 관계에 맞추어 임기 응변에 구분하는 실장이 재미있을지도 모른다.

예를 들면, 텍스처상에서 적당한 파동 시뮬레이션을 실시해, 파의 고저를 농담 정보로 나타내는 하이트 맵을 생성해, 시점 위치로부터 보고 이 고저가 미세라고 볼 수 있는 고저 정보에 대해서는 여기로부터 노멀 맵을 생성해 범프 맵핑의 잔물결로서 표현해 준다……라고 하는 실장이다.

반대로, 시점에서 근처 고저가 크게 보이는 고저 정보에 대해서는, VTF(Vertex Texture Fecth) 기능을 활용해, 버텍스 쉐이더로부터 하이트맵에 액세스 해 이 정보를 바탕으로 수면의 버텍스을 변위시켜 지오메트리 레벨의 파로 한다.

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

또, 이 실장을 실시하려면 GPU에 VTF 기능이 필수가 된다. DirectX 9세대/SM3.0 대응 GPU에서는 GeForce 6000 시리즈 이상, DirectX 10세대/SM4.0 대응 GPU에서는 모든 GPU가 VTF에 대응하고 있다.

이 방법을 구현한 3D 게임 타이틀에 「버추어 파이터(Virtua Fighter) 5」(세가, 2006)가 있다. Virtual Fighter 5에서는 FP32-128 비트 부동소수점(Floating-Point) 텍스처에 파동 시뮬레이션을 실시하여 하이트 맵을 생성. 이 하이트 맵으로부터 지오메트리 레벨의 파를 생성하고, 또한 노멀 맵까지를 생성하여, 이것을 이용하여 잔물결 표현까지를 행하고 있었다.

「버추어 파이터(Virtua Fighter) 5」(세가, 2006)보다. 이 작품에서는 VTF를 활용한 파 생성을 구현하고 있었다. 오른쪽 화면은 파동 시뮬레이션을 한 후의 하이트 맵. 왼쪽이 이 하이트 맵에서 생성한 노멀 맵이다「버추어 파이터(Virtua Fighter) 5」(세가, 2006)보다. 이 작품에서는 VTF를 활용한 파 생성을 구현하고 있었다. 오른쪽 화면은 파동 시뮬레이션을 한 후의 하이트 맵. 왼쪽이 이 하이트 맵에서 생성한 노멀 맵이다

하이트맵을 바탕으로 버텍스 레벨의 파도 생성하이트맵을 바탕으로 버텍스 레벨의 파도 생성

또한 노멀 맵에 의한 픽셀 단위의 잔물결 셰이딩(Shading)까지를 실시하여 최종 화면을 생성또한 노멀 맵에 의한 픽셀 단위의 잔물결 셰이딩(Shading)까지를 실시하여 최종 화면을 생성

(트라이Z 니시카와 젠지)


🔗 연관 지식 베이스 (Wiki)

Based on Zenji Nishikawa's 3D Graphics Maniax series. Translated & Knowledge-Based for Korean Game Developers.