Renderização de ondas oceânicas baseada em FFT implementada no Godot
(github.com/2Retr0)GodotOceanWaves
Um experimento de renderização de oceano aberto com o Godot Engine, que gera ondas usando a transformada de Fourier inversa de espectros direcionais de ondas do mar. Fornece parâmetros simples que permitem modificar as propriedades das ondas em tempo real por script, possibilitando imitar diversos ambientes de ondas oceânicas.
Introdução
Por que transformada de Fourier?
- Uma forma comum de animar água em videogames é usar Gerstner waves. No entanto, isso é adequado para modelar detalhes de baixa frequência em águas calmas, mas insuficiente para representar com precisão a superfície agitada do oceano aberto.
- Para resolver isso, as ondas são simuladas usando a transformada de Fourier inversa de espectros de ondas do mar baseados em dados empíricos coletados por oceanógrafos.
- A vantagem de trabalhar no espaço de frequências é que as propriedades do oceano podem ser modificadas com facilidade. Ao usar Gerstner waves, não fica claro como alterar as ondas e seus parâmetros para imitar um estado específico do mar.
- Para calcular a transformada de Fourier, é usado o algoritmo de transformada rápida de Fourier (FFT). Ele tem menor complexidade computacional do que o algoritmo clássico de transformada discreta de Fourier e é adequado para execução em GPU.
Resultados
Sombreamento das ondas
Modelo de iluminação
- O modelo de iluminação do oceano segue principalmente o BSDF descrito na palestra da GDC de 'Atlas'. No entanto, usa a distribuição GGX em vez da distribuição Beckmann para a distribuição de microfacetas.
- Os mapas de normais/espuma são amostrados misturando filtragem bicúbica e bilinear de acordo com a densidade de pixels no espaço do mundo.
Espuma do mar
- Tessendorf propõe gerar espuma quando o topo da onda se enrola sobre si mesmo.
- A espuma se acumula linearmente e desaparece exponencialmente, sendo controlada pelos parâmetros "taxa de crescimento da espuma" e "taxa de dissipação da espuma".
Spray do mar
- O spray do mar é modelado como partículas usando o nó GPUParticles3D do Godot.
- As partículas são distribuídas uniformemente dentro da caixa delimitadora do nó GPUParticles3D.
- Cada partícula de spray do mar usa um sprite billboard com uma única textura estática.
Simulação das ondas
- O método de geração das ondas de superfície segue Tessendorf.
- A função de espectro direcional de ondas do mar retorna a energia das ondas de acordo com a frequência e a direção.
Espectro de ondas do mar
- Foi escolhido o espectro Texel-Marsen-Arsloe (TMA) como função de espectro não direcional.
- Como função de espalhamento direcional, é usada uma mistura de espalhamento flat e Hasselmann.
Transformada rápida de Fourier
- Foi escrita uma implementação personalizada de FFT para GPU.
- O algoritmo FFT Stockham é usado para evitar a permutação inicial de inversão de bits.
Cascatas de ondas
- Em grandes distâncias, os artefatos de tiling ficam muito evidentes.
- O sistema de geração de ondas pode sobrepor em camadas várias cascatas de ondas simultaneamente.
Balanceamento de carga
- O movimento das ondas pode parecer suave mesmo sem atualizar o deslocamento a cada quadro.
- Foi introduzido o parâmetro "taxa de atualização" para controlar com que frequência as cascatas de ondas são atualizadas por segundo.
Referências
- 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).
Créditos de direitos autorais
- 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.
Resumo do GN⁺
- GodotOceanWaves é um experimento de renderização de oceano aberto com o Godot Engine que gera ondas usando a transformada de Fourier inversa de espectros direcionais de ondas do mar.
- Usa transformada rápida de Fourier (FFT) para executar com eficiência na GPU e pode imitar diversos ambientes de ondas oceânicas.
- Inclui vários elementos, como sombreamento das ondas, espuma do mar, spray do mar e simulação das ondas, para simular uma superfície oceânica realista.
- Este projeto pode ser útil para implementar renderização realista de oceanos em videogames e simulações.
1 comentários
Comentários do Hacker News
Os outros dois repositórios Godot dessa pessoa também são muito interessantes
Há 20 anos, mesmo gastando meses para renderizar a superfície do oceano, não se chegava a esse nível
O clipe de demonstração parece um pouco exagerado
Presumo que a renderização esteja sendo feita em tempo real no Godot
Coisas assim foram o que me fizeram me interessar por computadores, mas no caminho acabei me cansando de bibliotecas, endpoints e trabalho corporativo
Se você se interessa por simulação de ondas/oceano, o Acerola publicou um vídeo ótimo sobre esse tema
É interessante como esse problema é difícil
Morei alguns anos perto da praia
Essa abordagem tem algumas limitações em ondas muito grandes
Também há um exemplo excelente no Shadertoy
Fourier mediu ondas de maré ao idealizar a transformada de frequência das ondas
Muito impressionante, mas há um pequeno problema com a suavidade das ondas