1P by neo 2달전 | favorite | 댓글 1개

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는 파도 주파수 변환을 고안할 때 조수 파도를 측정했음

    • 거의 완전한 순환임
    • 매우 인상적임
  • 매우 인상적이지만 파도의 부드러움에 약간 문제가 있음

    • 고주파 파도가 저주파 파도 위를 이동하는 방식이 비디오와 다름