1 puntos por GN⁺ 2024-09-29 | 1 comentarios | Compartir por WhatsApp

GodotOceanWaves

Un experimento de renderizado de mar abierto con Godot Engine que genera olas mediante la transformada de Fourier inversa de espectros direccionales de olas oceánicas. Ofrece parámetros simples para modificar en tiempo real las propiedades de las olas mediante scripts, lo que permite imitar distintos entornos de oleaje marino.

Introducción

¿Por qué la transformada de Fourier?
  • Una forma común de animar agua en los videojuegos es usar Gerstner waves. Sin embargo, aunque esto sirve para modelar los detalles de baja frecuencia del agua tranquila, no alcanza para representar con precisión la superficie agitada del mar abierto.
  • Para resolverlo, se simulan las olas usando la transformada de Fourier inversa de un espectro de olas oceánicas basado en datos empíricos recopilados por oceanógrafos.
  • La ventaja de trabajar en el espacio de frecuencias es que las propiedades del océano se pueden modificar fácilmente. Al usar Gerstner waves, no está claro cómo habría que cambiar las olas y sus parámetros para imitar un estado específico del mar.
  • Para calcular la transformada de Fourier se usa el algoritmo de transformada rápida de Fourier (FFT). Tiene menor complejidad computacional que el algoritmo clásico de transformada discreta de Fourier y es adecuado para ejecutarse en la GPU.

Resultados

Sombreado de las olas
Modelo de iluminación
  • El modelo de iluminación del océano sigue principalmente el BSDF descrito en la charla de GDC de 'Atlas'. Sin embargo, para la distribución de microfacetas se usa la distribución GGX en lugar de la distribución Beckmann.
  • Los mapas de normales/espuma se muestrean mezclando filtrado bicúbico y bilineal según la densidad de píxeles en el espacio mundial.
Espuma del mar
  • Tessendorf propone generar espuma cuando la cresta de una ola se enrolla sobre sí misma.
  • La espuma se acumula linealmente y se desvanece de forma exponencial, controlada por los parámetros "velocidad de crecimiento de la espuma" y "velocidad de disipación de la espuma".
Spray marino
  • El spray marino se modela como partículas usando el nodo GPUParticles3D de Godot.
  • Las partículas se distribuyen uniformemente dentro de la caja delimitadora del nodo GPUParticles3D.
  • Cada partícula de spray marino usa un sprite billboard con una sola textura estática.
Simulación de olas
  • El método para generar olas superficiales sigue a Tessendorf.
  • La función de espectro direccional de olas oceánicas devuelve la energía de las olas según la frecuencia y la dirección.
Espectro de olas oceánicas
  • Se eligió el espectro Texel-Marsen-Arsloe (TMA) como función de espectro no direccional.
  • Como función de dispersión direccional, se usa una mezcla de dispersión flat y Hasselmann.
Transformada rápida de Fourier
  • Se escribió una implementación personalizada de FFT para la GPU.
  • Se usa el algoritmo FFT Stockham para evitar la permutación inicial de inversión de bits.
Cascadas de olas
  • A grandes distancias, los artefactos de tiling se vuelven muy evidentes.
  • El sistema de generación de olas puede superponer en capas varias cascadas de olas al mismo tiempo.
Distribución de carga
  • El movimiento de las olas puede verse suave incluso sin actualizar el desplazamiento en cada frame.
  • Se introdujo el parámetro "velocidad de actualización" para controlar con qué frecuencia por segundo se actualizan las cascadas de olas.

Referencias

  • 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 derechos de autor

  • Evening Road 01 (Pure Sky) de Jarod Guest se usa bajo la licencia CC0 1.0.
  • OTFFT DIT Stockham Algorithm de Takuya Okahisa se usa y modifica bajo la licencia MIT.

Resumen de GN⁺

  • GodotOceanWaves es un experimento de renderizado de mar abierto con Godot Engine que genera olas mediante la transformada de Fourier inversa de espectros direccionales de olas oceánicas.
  • Usa la transformada rápida de Fourier (FFT) para ejecutarse eficientemente en la GPU y puede imitar distintos entornos de oleaje marino.
  • Incluye varios elementos como sombreado de olas, espuma del mar, spray marino y simulación de olas para recrear una superficie oceánica realista.
  • Este proyecto puede ser útil para implementar renderizado oceánico realista en videojuegos y simulaciones.

1 comentarios

 
GN⁺ 2024-09-29
Opiniones en Hacker News
  • Los otros dos repositorios de Godot de esta persona también son muy interesantes

    • Me gusta cómo agrega detalles en la descripción del repositorio
    • Este repositorio en particular es interesante: GodotGaussianSplatting
    • Podría ser estudiante; cita con frecuencia otras investigaciones y tiene buen entendimiento de material publicado recientemente
  • Hace 20 años, incluso dedicando meses a renderizar la superficie del océano, no se habría llegado a este nivel

    • Sorprende lo buena que es esta tecnología
  • El clip de demostración se siente un poco exagerado

    • Tengo más de 50,000 millas náuticas de experiencia navegando
    • Olas tan altas y afiladas requerirían vientos más fuertes
    • Esto probablemente se pueda resolver ajustando parámetros
  • Supongo que el renderizado se hace en tiempo real en Godot

    • Me pregunto si requiere una GPU potente
  • Cosas como esta fueron lo que me hizo interesarme por las computadoras, pero en el camino me cansé de las librerías, los endpoints y el trabajo corporativo

    • Algún día me gustaría intentarlo de nuevo
  • Si te interesan las simulaciones de olas/océano, Acerola publicó unos videos geniales sobre este tema

  • Es interesante lo difícil que es este problema

    • Se ha intentado durante décadas y sigue sin estar resuelto por completo
    • Si congelas un cuadro, las olas parecen montañas nevadas
    • Para que el agua tenga rasgos tan afilados, el viento tendría que ser muy fuerte
    • La simulación logró muy bien las características suaves de las olas
  • Viví varios años junto a la playa

    • Cuando vives en la playa, terminas mirando el océano durante mucho tiempo
    • Este renderizado se parece al océano real
  • Este enfoque tiene algunas limitaciones con olas muy grandes

    • Las olas de agua no son ondas sinusoidales, pero para olas pequeñas este método funciona bien
    • Las olas grandes interactúan de forma no lineal, así que se necesita otro enfoque
  • También hay un ejemplo genial en Shadertoy

  • Fourier estaba midiendo las mareas cuando ideó la transformada de frecuencias de las olas

    • Es casi un ciclo perfecto
    • Muy impresionante
  • Es muy impresionante, pero hay un pequeño problema con la suavidad de las olas

    • La forma en que las olas de alta frecuencia se desplazan sobre las de baja frecuencia es distinta a la del video