¿Cómo puedo generar ruido de procedimiento en una esfera?

15

Me gustaría generar ruido de procedimiento en la superficie de una esfera (por ejemplo, generar planetas de procedimiento o bolas con textura de mármol). Por supuesto, podría tomar un algoritmo de ruido estándar y mapearlo en la esfera, pero esto tiene todos los problemas de proyectar un plano sobre una esfera, como distorsiones en los polos o en otros lugares.

Supongo que podría generar ruido de volumen y "cortar" la esfera, pero esto parece innecesariamente ineficiente, y si el ruido tiene algunos artefactos basados ​​en la cuadrícula, estos todavía no aparecerían uniformemente en la esfera. Además, al menos en el caso del ruido Simplex, cortar cortes 2D del ruido 3D generalmente se ve diferente de generar ruido 2D de inmediato.

¿Hay alguna forma de evitar estos problemas, por ejemplo, generando ruido de forma nativa en la esfera? El ruido debe tener al menos la calidad del ruido Perlin , idealmente el del ruido Simplex .

Martin Ender
fuente
¿Tal vez una proyección triplanar, como se ve en GPU Gems 3 ? La pregunta es si el ruido se vería borroso o indeseable cuando se combina entre diferentes proyecciones.
Nathan Reed
Agregué otro método posible a mi publicación. Puede valer la pena aclarar su pregunta con requisitos más detallados. es decir, ¿por qué una porción 2D de ruido 3D no satisface sus requisitos visuales? ¿Cuáles son sus requisitos de rendimiento?
John Calsbeek
@ JohnCalsbeek Honestamente, no tengo ningún requisito difícil a la mano. Esta era solo una pregunta que tenía curiosidad sobre la cual pensé que probaría con la versión beta privada. Por supuesto, cortar un corte 2D del ruido 3D será suficiente para muchas aplicaciones, pero estoy seguro de que tendrá cierto impacto en el rendimiento y anisotropías (lo que puede o no ser notable). "Cortar la esfera del ruido 3D es su mejor opción, porque ..." es definitivamente una respuesta válida.
Martin Ender
Puede consultar este sombreador que hace ruido en una esfera: shadertoy.com/view/4sfGzS
Alan Wolfe

Respuestas:

15

Consideraría simplemente ir con ruido 3D y evaluarlo en la superficie de la esfera.

Para el ruido de gradiente que se encuentra naturalmente en el dominio de la superficie de la esfera, necesita un patrón regular de puntos de muestra en la superficie que tenga información de conectividad natural, con un área aproximadamente igual en cada celda, para que pueda interpolar o sumar valores adyacentes. Me pregunto si algo como una cuadrícula de Fibonacci podría funcionar:

Rejilla de Fibonacci en la superficie de una esfera.

No he analizado las matemáticas para determinar cuánto trabajo sería calcular los índices y la distancia a tus cuatro vecinos (ni siquiera sé si terminas teniendo cuatro vecinos bien definidos en todos los casos), y sospecho que puede ser menos eficiente que simplemente usar ruido 3D.

Editar: ¡ Alguien más ha analizado las matemáticas! Vea este nuevo documento sobre Mapeo esférico de Fibonacci . Parece que sería sencillo adaptarlo al ruido de la esfera.


Si está renderizando una esfera, no solo evaluando el ruido en la superficie de una esfera, y está de acuerdo con teselar su esfera a la resolución de su red de ruido, puede crear una cuadrícula geodésica en la superficie de la esfera (un icosaedro subdividido, generalmente):

Esfera geodésica

Cada vértice de la esfera puede tener un gradiente generado aleatoriamente para el ruido de gradiente. Para llevar esta información al sombreador de píxeles (a menos que desee una interpolación directa como el ruido de valor), es posible que necesite una técnica como la representación de estructura alámbrica de este artículo con coordenadas barcéntricas: haga una representación no indexada, con cada vértice que contiene las coordenadas barcéntricas de ese vértice en el triángulo . Luego puede leer SV_PrimitiveID(o el equivalente de OpenGL) en el sombreador de píxeles, leer los tres gradientes de ruido de los vértices en función del triángulo en el que se encuentre y utilizar el cálculo de ruido que desee utilizando las coordenadas barcéntricas interpoladas.

Creo que la parte más difícil de este método es idear un esquema para asignar su ID de triángulo a tres muestras para buscar los valores de ruido en cada vértice.

Si necesita varias octavas de ruido o ruido con una resolución más fina que su modelo de esfera, es posible que pueda hacer una grilla geodésica gruesa con vértices y hacer algunos niveles de subdivisión en el sombreador de píxeles. es decir, a partir de las coordenadas barcéntricas, calcule en qué triángulo subdividido estaría si la malla estuviera más teselada, y luego calcule cuál sería la ID primitiva y las coordenadas barcéntricas para ese triángulo.

John Calsbeek
fuente
2
Nunca había oído hablar de las redes de Fibonacci antes; ¡eso es muy bonito!
Nathan Reed
Ese es un papel fascinante. Parece que puede ajustar los parámetros para acercarse a una cuadrícula cuadrada o una cuadrícula hexagonal, lo que permitiría diferentes enfoques para la generación de ruido.
trichoplax
Tuve algunos resultados no malos interpolando cerca de los bordes del mosaico (envuelto en el borde), pero depende del efecto que intente lograr y los parámetros de ruido exactos. Funciona muy bien para el ruido algo borroso, no tan bueno con los puntiagudos / de grano fino.