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 .
fuente
Respuestas:
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:
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):
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.
fuente