# Godot에 구현된 FFT 기반 해양 파도 렌더링

> Clean Markdown view of GeekNews topic #16976. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16976](https://news.hada.io/topic?id=16976)
- GeekNews Markdown: [https://news.hada.io/topic/16976.md](https://news.hada.io/topic/16976.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-09-29T10:40:09+09:00
- Updated: 2024-09-29T10:40:09+09:00
- Original source: [github.com/2Retr0](https://github.com/2Retr0/GodotOceanWaves)
- Points: 1
- Comments: 1

## Topic Body

#### 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에서 효율적으로 실행할 수 있으며, 다양한 바다 파도 환경을 모방할 수 있음.
- 파도 셰이딩, 바다 거품, 바다 스프레이, 파도 시뮬레이션 등 다양한 요소를 포함하여 현실적인 바다 표면을 시뮬레이션함.
- 이 프로젝트는 비디오 게임 및 시뮬레이션에서 현실적인 바다 렌더링을 구현하는 데 유용할 수 있음.

## Comments



### Comment 29402

- Author: neo
- Created: 2024-09-29T10:40:10+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41678412) 
- 이 사람의 다른 두 개의 Godot 저장소도 매우 흥미로움
  - 저장소 설명에 세부 사항을 추가하는 방식이 마음에 듦
  - 특히 이 저장소가 흥미로움: [GodotGaussianSplatting](https://github.com/2Retr0/GodotGaussianSplatting)
  - 학생일 가능성이 있음, 다른 연구를 자주 인용하고 최근 출판된 자료에 대한 이해도가 높음

- 20년 전에는 바다 표면을 렌더링하는 데 몇 달을 소비해도 이 수준에 도달하지 못했음
  - 이 기술이 얼마나 뛰어난지 놀라움

- 데모 클립이 약간 과장된 느낌이 있음
  - 50,000Nm 이상의 항해 경험이 있음
  - 그렇게 날카롭고 높은 파도는 더 강한 바람이 필요함
  - 이는 매개변수 조정으로 해결 가능할 것임

- Godot에서 렌더링이 실시간으로 이루어지는 것으로 추정됨
  - 강력한 GPU가 필요한지 궁금함

- 이런 것들이 컴퓨터에 관심을 갖게 했지만, 도중에 라이브러리, 엔드포인트, 회사 업무에 지쳐버림
  - 언젠가는 다시 도전하고 싶음

- 파도/바다 시뮬레이션에 관심이 있다면 Acerola가 이 주제에 대한 멋진 비디오를 게시했음
  - [비디오 1](https://youtu.be/PH9q0HNBjT4)
  - [비디오 2](https://youtu.be/yPfagLeUa7k)

- 이 문제가 얼마나 어려운지 흥미로움
  - 수십 년 동안 시도했지만 여전히 불완전함
  - 프레임을 멈추면 파도가 눈 덮인 산처럼 보임
  - 물이 이렇게 날카로운 특징을 가지려면 바람이 매우 강해야 함
  - 시뮬레이션은 파도의 부드러운 특성을 잘 구현했음

- 해변에서 몇 년을 살았음
  - 해변에 살면 바다를 오랫동안 바라보게 됨
  - 이 렌더링이 실제 바다처럼 보임

- 이 접근 방식은 매우 큰 파도에서는 약간 한계가 있음
  - 물 파도는 사인파가 아니지만 작은 파도에서는 이 방법이 잘 작동함
  - 큰 파도는 비선형적으로 상호작용하기 때문에 다른 접근 방식이 필요함

- Shadertoy에도 멋진 예제가 있음
  - [Shadertoy 예제](https://www.shadertoy.com/view/Ms2SD1)

- Fourier는 파도 주파수 변환을 고안할 때 조수 파도를 측정했음
  - 거의 완전한 순환임
  - 매우 인상적임

- 매우 인상적이지만 파도의 부드러움에 약간 문제가 있음
  - 고주파 파도가 저주파 파도 위를 이동하는 방식이 비디오와 다름
