GN⁺: Godot에 구현된 FFT 기반 해양 파도 렌더링
(github.com/2Retr0)GodotOceanWaves
Godot Engine을 이용한 개방된 바다 렌더링 실험으로, 방향성 바다 파도 스펙트럼의 역푸리에 변환을 이용하여 파도를 생성함. 스크립트로 실시간으로 파도 속성을 수정할 수 있는 간단한 매개변수를 제공하여 다양한 바다 파도 환경을 모방할 수 있음.
소개
왜 푸리에 변환인가?
- 비디오 게임에서 물을 애니메이션화하는 일반적인 방법은 _Gerstner waves_를 사용하는 것임. 그러나 이는 잔잔한 물의 저주파수 세부 사항을 모델링하는 데는 적합하지만, 개방된 바다의 거친 표면을 정확하게 표현하는 데는 부족함.
- 이를 해결하기 위해, 해양학자들이 수집한 경험적 데이터를 기반으로 한 바다 파도 스펙트럼의 _역푸리에 변환_을 사용하여 파도를 시뮬레이션함.
- 주파수 공간에서 작업하는 이점은 바다 속성을 쉽게 수정할 수 있다는 것임. Gerstner waves를 사용할 때는 특정 바다 상태를 모방하기 위해 파도와 그 매개변수를 어떻게 변경해야 하는지 불분명함.
- 푸리에 변환을 계산하기 위해 빠른 푸리에 변환 알고리즘(FFT)을 사용함. 이는 고전적인 이산 푸리에 변환 알고리즘보다 계산 복잡도가 낮고, GPU에서 실행하기에 적합함.
결과
파도 셰이딩
조명 모델
- 바다 조명 모델은 주로 'Atlas' GDC 강연에서 설명된 BSDF를 따름. 그러나 미세면 분포를 위해 Beckmann 분포 대신 GGX 분포를 사용함.
- 노말/폼 맵은 세계 공간 픽셀 밀도에 따라 bicubic과 bilinear 필터링을 혼합하여 샘플링함.
바다 거품
- Tessendorf는 파도의 정점이 자신에게 말려 들어갈 때 거품을 생성하는 방법을 제안함.
- 거품은 선형적으로 축적되고 지수적으로 소멸하며, "거품 성장 속도"와 "거품 소멸 속도" 매개변수로 제어됨.
바다 스프레이
- 바다 스프레이는 Godot의 GPUParticles3D 노드를 사용하여 입자로 모델링됨.
- 입자는 GPUParticles3D 노드의 경계 상자 내에서 균등하게 분포됨.
- 각 바다 스프레이 입자는 단일 정적 텍스처를 가진 빌보드 스프라이트를 사용함.
파도 시뮬레이션
- 표면 파도를 생성하는 방법은 Tessendorf를 따름.
- 방향성 바다 파도 스펙트럼 함수는 주파수와 방향에 따라 파도의 에너지를 반환함.
바다 파도 스펙트럼
- 비방향성 스펙트럼 함수로 Texel-Marsen-Arsloe (TMA) 스펙트럼을 선택함.
- 방향성 확산 함수로 _flat_과 Hasselmann 확산을 혼합하여 사용함.
빠른 푸리에 변환
- GPU를 위한 맞춤형 FFT 구현을 작성함.
- Stockham FFT 알고리즘을 사용하여 초기 비트 반전 순열을 피함.
파도 캐스케이드
- 큰 거리에서 타일링 아티팩트가 매우 명확해짐.
- 파도 생성 시스템은 여러 파도 캐스케이드를 동시에 계층화할 수 있음.
부하 분산
- 파도의 움직임은 매 프레임마다 변위를 업데이트하지 않아도 부드럽게 보일 수 있음.
- "업데이트 속도" 매개변수를 도입하여 초당 파도 캐스케이드가 업데이트되는 빈도를 제어함.
참고 문헌
- Flügge, Fynn-Jorin. Realtime GPGPU FFT Ocean Water Simulation. Hamburg University of Technology. (2017).
- Gunnell, Garrett. I Tried Simulating The Entire Ocean. (2023).
- Horvath, Christopher J. Empirical Directional Wave Spectra for Computer Graphics. DigiPro. (2015).
- Tessendorf, Jerry. Simulating Ocean Water. SIGGRAPH. (2004).
- Matusiak, Robert. Implementing Fast Fourier Transform Algorithms of Real-Valued Sequences. Texas Instruments. (2001).
- Mihelich, Mark. Wakes, Explosions and Lighting: Interactive Water Simulation in 'Atlas'. GDC. (2019).
- Pensionerov, Ivan. FFT-Ocean. GitHub. (2020).
저작권 표시
- Evening Road 01 (Pure Sky) by Jarod Guest is used under the CC0 1.0 license.
- OTFFT DIT Stockham Algorithm by Takuya Okahisa is used and modified under the MIT license.
GN⁺의 정리
- GodotOceanWaves는 Godot Engine을 이용한 개방된 바다 렌더링 실험으로, 방향성 바다 파도 스펙트럼의 역푸리에 변환을 이용하여 파도를 생성함.
- 빠른 푸리에 변환(FFT)을 사용하여 GPU에서 효율적으로 실행할 수 있으며, 다양한 바다 파도 환경을 모방할 수 있음.
- 파도 셰이딩, 바다 거품, 바다 스프레이, 파도 시뮬레이션 등 다양한 요소를 포함하여 현실적인 바다 표면을 시뮬레이션함.
- 이 프로젝트는 비디오 게임 및 시뮬레이션에서 현실적인 바다 렌더링을 구현하는 데 유용할 수 있음.
Hacker News 의견
-
이 사람의 다른 두 개의 Godot 저장소도 매우 흥미로움
- 저장소 설명에 세부 사항을 추가하는 방식이 마음에 듦
- 특히 이 저장소가 흥미로움: GodotGaussianSplatting
- 학생일 가능성이 있음, 다른 연구를 자주 인용하고 최근 출판된 자료에 대한 이해도가 높음
-
20년 전에는 바다 표면을 렌더링하는 데 몇 달을 소비해도 이 수준에 도달하지 못했음
- 이 기술이 얼마나 뛰어난지 놀라움
-
데모 클립이 약간 과장된 느낌이 있음
- 50,000Nm 이상의 항해 경험이 있음
- 그렇게 날카롭고 높은 파도는 더 강한 바람이 필요함
- 이는 매개변수 조정으로 해결 가능할 것임
-
Godot에서 렌더링이 실시간으로 이루어지는 것으로 추정됨
- 강력한 GPU가 필요한지 궁금함
-
이런 것들이 컴퓨터에 관심을 갖게 했지만, 도중에 라이브러리, 엔드포인트, 회사 업무에 지쳐버림
- 언젠가는 다시 도전하고 싶음
-
파도/바다 시뮬레이션에 관심이 있다면 Acerola가 이 주제에 대한 멋진 비디오를 게시했음
-
이 문제가 얼마나 어려운지 흥미로움
- 수십 년 동안 시도했지만 여전히 불완전함
- 프레임을 멈추면 파도가 눈 덮인 산처럼 보임
- 물이 이렇게 날카로운 특징을 가지려면 바람이 매우 강해야 함
- 시뮬레이션은 파도의 부드러운 특성을 잘 구현했음
-
해변에서 몇 년을 살았음
- 해변에 살면 바다를 오랫동안 바라보게 됨
- 이 렌더링이 실제 바다처럼 보임
-
이 접근 방식은 매우 큰 파도에서는 약간 한계가 있음
- 물 파도는 사인파가 아니지만 작은 파도에서는 이 방법이 잘 작동함
- 큰 파도는 비선형적으로 상호작용하기 때문에 다른 접근 방식이 필요함
-
Shadertoy에도 멋진 예제가 있음
-
Fourier는 파도 주파수 변환을 고안할 때 조수 파도를 측정했음
- 거의 완전한 순환임
- 매우 인상적임
-
매우 인상적이지만 파도의 부드러움에 약간 문제가 있음
- 고주파 파도가 저주파 파도 위를 이동하는 방식이 비디오와 다름