1 pontos por GN⁺ 2024-09-29 | 1 comentários | Compartilhar no WhatsApp

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

 
GN⁺ 2024-09-29
Comentários do Hacker News
  • Os outros dois repositórios Godot dessa pessoa também são muito interessantes

    • Gosto da forma como ela adiciona detalhes nas descrições dos repositórios
    • Este repositório em especial é interessante: GodotGaussianSplatting
    • É possível que seja estudante; cita com frequência outras pesquisas e demonstra bom entendimento de materiais publicados recentemente
  • Há 20 anos, mesmo gastando meses para renderizar a superfície do oceano, não se chegava a esse nível

    • É impressionante como essa técnica é boa
  • O clipe de demonstração parece um pouco exagerado

    • Tenho mais de 50.000 milhas náuticas de experiência em navegação
    • Ondas tão altas e pontiagudas exigiriam ventos mais fortes
    • Isso provavelmente pode ser resolvido ajustando os parâmetros
  • Presumo que a renderização esteja sendo feita em tempo real no Godot

    • Fico curioso se é necessária uma GPU potente
  • Coisas assim foram o que me fizeram me interessar por computadores, mas no caminho acabei me cansando de bibliotecas, endpoints e trabalho corporativo

    • Um dia ainda quero tentar de novo
  • 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

    • Tentam há décadas e ainda continua imperfeito
    • Se você congelar um quadro, as ondas parecem montanhas cobertas de neve
    • Para a água ter características tão pontiagudas assim, o vento precisaria estar muito forte
    • A simulação reproduziu bem a natureza suave das ondas
  • Morei alguns anos perto da praia

    • Quando se mora perto da praia, você passa longos períodos olhando para o mar
    • Essa renderização parece um oceano de verdade
  • Essa abordagem tem algumas limitações em ondas muito grandes

    • Ondas de água não são ondas senoidais, mas esse método funciona bem para ondas pequenas
    • Ondas grandes interagem de forma não linear, então é necessária outra abordagem
  • Também há um exemplo excelente no Shadertoy

  • Fourier mediu ondas de maré ao idealizar a transformada de frequência das ondas

    • É quase um ciclo completo
    • Muito impressionante
  • Muito impressionante, mas há um pequeno problema com a suavidade das ondas

    • A forma como ondas de alta frequência se movem sobre ondas de baixa frequência é diferente do que aparece no vídeo