¿Cómo funcionan los sombreadores Raymarch?

49

He estado buscando sombreadores que se encuentran aquí shadertoy.com y la mayoría de los geniales tienen ruido y raymarch en común. No entiendo el código fuente en absoluto, pero realmente quiero. ¿Cómo funcionan estos sombreadores y cómo funciona el algoritmo raymarch? He buscado por todas partes y no puedo encontrar nada sobre el tema.

Gracias

jmasterx
fuente
66
Iñigo Quilez ha escrito excelentes tutoriales sobre eso. Ver iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htm e iquilezles.org/www/articles/distfunctions/distfunctions.htm . Estos sombreadores geniales no son cualquier marca de raymarching, sino específicamente campos de distancia de raymarching, también llamados trazado de esfera.
msell
¿Está preguntando sobre la marcha de rayos en general o la marcha de rayos en la GPU?
concept3d
@Milo ¿Podría aclarar su pregunta? ¿Estás preguntando cómo se utilizan estos algoritmos para generar las imágenes que ves en las geniales demostraciones? ¿Estás preguntando cómo funciona la marcha de rayos? ¿Se pregunta cómo funciona la marcha de rayos en sombreadores de fragmentos / píxeles (es decir, implementación eficiente)?
TravisG
Implementé Raymarching en Unity Engine github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali el

Respuestas:

78

Probablemente sea más fácil de entender en contraste con el trazado de rayos.

Para hacer un primitivo con trazado de rayos, necesita una función que, dado el primitivo y el rayo de entrada, le indique exactamente dónde ese rayo golpea al primitivo. Luego puede probar el rayo contra todas las primitivas relevantes y elegir la intersección más cercana. Las CPU son buenas en esto.

Con raymarching, no tiene una función de intersección de rayos tan simple. Dado un punto en el rayo, puede estimar qué tan cerca está el punto de la superficie, pero no sabe exactamente cuánto necesita extender ese rayo para golpear la superficie.

Entonces, "marchas" paso a paso:

  1. Comience en el "comienzo" del rayo: el plano cercano para la representación de la escena, o la intersección con el volumen delimitador si es solo un objeto en la escena. (P0 en el diagrama a continuación)

  2. Evalúa tu función de distancia para obtener una estimación de lo cerca que estás de la superficie. (El círculo más grande en el diagrama)

  3. Avanza a lo largo del rayo de acuerdo con tu estimación. El movimiento debe ser conservadormente corto, por lo que está seguro de que no atravesará la superficie en ningún lugar.

  4. Ahora tiene un nuevo punto (P1 a continuación): obtenga una nueva estimación y repita.

  5. Continúe obteniendo estimaciones y avanzando hasta llegar a una distancia umbral de la superficie, o hasta alcanzar el conteo máximo de pasos. (P4 a continuación)

  6. Ahora tiene la profundidad de la superficie y puede inferir cosas como la normalidad / oclusión ambiental a partir de muestras cercanas, y usar estos datos para iluminar y colorear el píxel.

Marchando un rayo desde P0 hacia su intersección

Diagrama de ejemplo de GPU Gems 2, capítulo 8

Debido a que cada rayo es independiente y usa (generalmente) solo información local en cada paso, está listo para paralelizar las GPU. A menudo, solo se dibujarán dos triángulos en la pantalla. Después de rasterizarlos, cada píxel pasado al sombreador de fragmentos representa un solo rayo. El sombreador de fragmentos marcha ese rayo hasta que alcanza la superficie, devolviendo el resultado (a menudo solo el valor de profundidad para texturizar y sombrear en una pasada de pantalla completa separada).

Los pasos exactos dependen mucho del efecto particular que intente lograr. Las técnicas de Raymarching se utilizan con ...

  • campos de altura para simular el desplazamiento de superficie en geometría rasterizada tradicional (mapeo de oclusión de paralaje)
  • amortiguadores de profundidad de escena para cosas como reflexiones de espacio de pantalla
  • texturas de volumen para visualizar conjuntos de datos muestreados en 3D (a menudo científicos / médicos)
  • funciones implícitas para representar cosas como fractales
  • campos de distancia de procedimiento como en el trabajo de Iñigo Quilez (excelentes enlaces de msell en los comentarios anteriores).

Raymarching también se usa con mezclas en cada paso (a menudo usando pasos fijos en lugar de estimar una distancia cada vez) para representar la translucidez volumétrica, como en este ejemplo de Wikipedia .

Raymarching una textura de volumen translúcido

Esto se ha convertido en una forma popular de representar nubes detalladas en tiempo real .

Incluso el mapeo interior , una forma de simular los detalles de la habitación interior detrás de las ventanas del edificio, podría considerarse una forma de marcado de rayos, donde el rayo se coloca desde el punto en que ingresa a la ventana hasta la pared, piso / techo o plano de muebles más cercano.

Si hay un tipo específico de efecto de marcado de rayos que le interese, probablemente pueda obtener respuestas más detalladas haciendo una nueva pregunta con ejemplos específicos. Como familia, la técnica es demasiado diversa para cubrir todo en una respuesta breve. ;) Espero que esto le brinde un marco para comprender lo que sucede debajo del capó en estos sombreadores.

DMGregory
fuente