Come posso generare rumore procedurale su una sfera?


15

Vorrei generare rumore procedurale sulla superficie di una sfera (ad es. Per generare proceduralmente pianeti o sfere di marmo). Certo, potrei semplicemente prendere un algoritmo di rumore standard e mapparlo sulla sfera, ma questo ha tutti i problemi di proiettare un piano su una sfera, come distorsioni sui poli o altrove.

Suppongo che potrei generare rumore di volume e "tagliare" la sfera, ma questo sembra inutilmente inefficiente - e se il rumore ha alcuni artefatti basati su griglia, questi non apparirebbero uniformemente sulla sfera. Inoltre, almeno nel caso del rumore Simplex, tagliare le fette 2D dal rumore 3D in genere sembra diverso rispetto alla generazione immediata del rumore 2D.

Esiste un modo per evitare questi problemi, ad esempio generando rumore nativamente sulla sfera? Il rumore dovrebbe avere almeno la qualità del rumore Perlin , idealmente quello del rumore Simplex .


Forse proiezione triplanare, come visto in GPU Gems 3 ? La domanda è se il rumore sembrerebbe sfocato o altrimenti indesiderabile quando si fonde tra diverse proiezioni.
Nathan Reed il

Ho aggiunto un altro possibile metodo al mio post. Potrebbe valere la pena chiarire la tua domanda con requisiti più dettagliati. cioè perché una porzione 2D di rumore 3D non soddisfa i tuoi requisiti visivi? Quali sono i tuoi requisiti di prestazione?
John Calsbeek,

@JohnCalsbeek Onestamente, non ho nessun requisito difficile a portata di mano. Questa era solo una domanda di cui ero curioso di cui pensavo di provare la beta privata. Naturalmente, tagliare una fetta 2D dal rumore 3D sarà sufficiente per molte applicazioni, ma sono sicuro che avrà un certo impatto sulle prestazioni e anisotropie (che possono essere o meno evidenti). "Tagliare la sfera dal rumore 3D è l'opzione migliore, perché ..." è sicuramente una risposta valida.
Martin Ender,

Potresti dare un'occhiata a questo shadertoy che fa rumore su una sfera: shadertoy.com/view/4sfGzS
Alan Wolfe,

Risposte:


15

Vorrei solo andare con il rumore 3D e valutarlo sulla superficie della sfera.

Per il rumore gradiente che è naturalmente nel dominio della superficie della sfera, è necessario un modello regolare di punti campione sulla superficie con informazioni di connettività naturali, con un'area approssimativamente uguale in ogni cella, in modo da poter interpolare o sommare i valori adiacenti. Mi chiedo se qualcosa come una griglia di Fibonacci potrebbe funzionare:

Griglia di Fibonacci sulla superficie di una sfera

Non ho masticato la matematica per determinare quanto lavoro sarebbe stato per capire gli indici e la distanza dai tuoi quattro vicini (non so nemmeno se finirai per avere quattro vicini ben definiti in tutti i casi), e sospetto che potrebbe essere meno efficiente del semplice utilizzo del rumore 3D.

Modifica: qualcun altro ha masticato la matematica! Vedi questo nuovo articolo sulla mappatura di Fibonacci sferici . Sembra che sarebbe semplice adattarlo al rumore della sfera.


Se stai eseguendo il rendering di una sfera, non solo valutando il rumore sulla superficie di una sfera e stai bene tassellando la sfera alla risoluzione del reticolo del rumore, puoi creare una griglia geodetica sulla superficie della sfera (un icosaedro suddiviso, generalmente):

Sfera geodetica

Ogni vertice della sfera può avere un gradiente generato casualmente per il rumore gradiente. Per ottenere queste informazioni al pixel shader (a meno che non si desideri un'interpolazione semplice come il rumore di valore), potrebbe essere necessaria una tecnica come il rendering wireframe di questo articolo con coordinate baricentriche : eseguire il rendering non indicizzato, con ogni vertice contenente le coordinate baricentriche di quel vertice nel triangolo . È quindi possibile leggere SV_PrimitiveID(o l'equivalente OpenGL) nel pixel shader, leggere i tre gradienti di rumore dai vertici in base al triangolo in cui ci si trova e utilizzare qualsiasi calcolo del rumore desiderato utilizzando le coordinate baricentriche interpolate.

Penso che la parte più difficile di questo metodo sia quella di elaborare uno schema per mappare l'ID del triangolo su tre campioni per cercare i valori di rumore in ciascun vertice.

Se hai bisogno di più ottave di rumore o rumore con una risoluzione più fine rispetto al tuo modello di sfera, potresti essere in grado di fare una griglia geodetica grossolana con vertici e fare alcuni livelli di suddivisione nel pixel shader. vale a dire dalle coordinate baricentriche, capire in quale triangolo suddiviso ci si troverebbe se la mesh fosse ulteriormente tassellata, e quindi capire quale sarebbe l'ID primitivo e le coordinate baricentriche per quel triangolo.


2
Non avevo mai sentito parlare delle griglie di Fibonacci prima; è abbastanza bello!
Nathan Reed,

È un documento affascinante. Sembra che sia possibile regolare i parametri per avvicinarsi a una griglia quadrata o esagonale, che consentirebbe approcci diversi alla generazione del rumore.
trichoplax,

Ho avuto alcuni risultati non negativi interpolati vicino ai bordi della piastrella (fasciata), ma dipende dall'effetto che stai cercando di ottenere e dai parametri di rumore esatti. Funziona alla grande per il rumore un po 'sfocato, non così buono con quelli appuntiti / a grana fine.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.