Wie kann ich prozedurales Rauschen auf einer Kugel erzeugen?


15

Ich möchte prozedurales Rauschen auf der Oberfläche einer Kugel erzeugen (zB um prozedural Planeten oder Kugeln mit Marmortextur zu erzeugen). Natürlich könnte ich einfach einen Standard-Rauschalgorithmus nehmen und auf die Kugel abbilden, aber das hat alle Probleme, eine Ebene auf eine Kugel zu projizieren, wie Verzerrungen an den Polen oder anderswo.

Ich nehme an, ich könnte Volumenrauschen erzeugen und die Kugel "ausschneiden", aber dies scheint unnötig ineffizient zu sein - und wenn das Rauschen einige gitterbasierte Artefakte aufweist, würden diese immer noch nicht gleichmäßig auf der Kugel erscheinen. Darüber hinaus sieht es zumindest im Fall von Simplex-Rauschen im Allgemeinen anders aus, wenn 2D-Schnitte aus 3D-Rauschen herausgeschnitten werden, als wenn sofort 2D-Rauschen erzeugt wird.

Gibt es eine Möglichkeit, diese Probleme zu vermeiden, z. B. durch die Erzeugung von Rauschen auf der Kugel? Das Rauschen sollte mindestens die Qualität von Perlin-Rauschen haben , idealerweise die von Simplex-Rauschen .


Vielleicht triplanare Projektion, wie in GPU Gems 3 zu sehen ? Die Frage ist, ob das Rauschen unscharf oder auf andere Weise unerwünscht aussehen würde, wenn es zwischen verschiedenen Projektionen gemischt wird.
Nathan Reed

Ich habe meinem Beitrag eine andere mögliche Methode hinzugefügt. Es kann sich lohnen, Ihre Frage mit detaillierteren Anforderungen zu klären. dh warum erfüllt ein 2D-Teil des 3D-Rauschens nicht Ihre visuellen Anforderungen? Was sind Ihre Leistungsanforderungen?
John Calsbeek

@ JohnCalsbeek Ehrlich gesagt habe ich keine harten Anforderungen zur Hand. Dies war nur eine Frage, die mich neugierig machte, und ich dachte, ich würde die private Beta ausprobieren. Natürlich reicht es für viele Anwendungen aus, eine 2D-Scheibe aus dem 3D-Rauschen herauszuschneiden, aber ich bin mir sicher, dass dies einen gewissen Einfluss auf die Leistung und Anisotropien hat (die sich möglicherweise bemerkbar machen oder auch nicht). "Die Kugel aus 3D-Rauschen herauszuschneiden ist die beste Option, weil ..." ist definitiv eine gültige Antwort.
Martin Ender

Sie können sich dieses Shadertoy ansehen, das Geräusche auf einer Kugel verursacht: shadertoy.com/view/4sfGzS
Alan Wolfe

Antworten:


15

Ich würde in Betracht ziehen, einfach mit 3D-Rauschen umzugehen und es auf der Oberfläche der Kugel auszuwerten.

Für Gradientenrauschen, das sich von Natur aus im Bereich der Kugeloberfläche befindet, benötigen Sie ein regelmäßiges Muster von Abtastpunkten auf der Oberfläche, die über natürliche Konnektivitätsinformationen mit ungefähr gleicher Fläche in jeder Zelle verfügen, sodass Sie benachbarte Werte interpolieren oder summieren können. Ich frage mich, ob so etwas wie ein Fibonacci-Gitter funktionieren könnte:

Fibonacci-Gitter auf der Oberfläche einer Kugel

Ich habe die Mathematik noch nicht durchgearbeitet, um herauszufinden, wie viel Arbeit es bedeuten würde, die Indizes und die Entfernung zu Ihren vier Nachbarn zu bestimmen (ich weiß nicht einmal, ob Sie in jedem Fall vier gut definierte Nachbarn haben). und ich vermute, es ist möglicherweise weniger effizient als nur die Verwendung von 3D-Rauschen.

Edit: Jemand anderes hat durch die Mathematik gekaut! Siehe dieses neue Papier über sphärische Fibonacci-Kartierung . Es scheint einfach zu sein, es an das Kugelrauschen anzupassen.


Wenn Sie eine Kugel rendern, aber nicht nur das Rauschen auf der Oberfläche einer Kugel bewerten, sondern auch Ihre Kugel anhand der Auflösung Ihres Rauschgitters tessellieren können, können Sie ein geodätisches Gitter auf der Oberfläche der Kugel erstellen (ein unterteiltes Ikosaeder, in der Regel):

Geodätische Sphäre

Jeder Scheitelpunkt der Kugel kann einen zufällig erzeugten Gradienten für Gradientenrauschen haben. Um diese Informationen an den Pixel-Shader weiterzuleiten (es sei denn, Sie möchten eine direkte Interpolation wie z. B. Wertrauschen ), benötigen Sie möglicherweise eine Technik wie das Wireframe-Rendering dieses Artikels mit Schwerpunktkoordinaten . Anschließend können Sie SV_PrimitiveIDim Pixel-Shader aus (oder dem OpenGL-Äquivalent) lesen, die drei Rauschgradienten anhand des Dreiecks, auf dem Sie sich befinden, von den Scheitelpunkten ablesen und mit den interpolierten Schwerpunktkoordinaten eine beliebige Rauschberechnung durchführen.

Ich denke, der schwierigste Teil dieser Methode besteht darin, ein Schema zu entwickeln, um Ihre Dreieck-ID auf drei Samples abzubilden, um die Rauschwerte an jedem Vertex nachzuschlagen.

Wenn Sie mehrere Oktaven Rauschen oder Rauschen mit einer feineren Auflösung als Ihr Kugelmodell benötigen, können Sie möglicherweise ein grobes geodätisches Gitter mit Scheitelpunkten erstellen und im Pixel-Shader einige Unterteilungsebenen ausführen. dh aus den Schwerpunktkoordinaten herausfinden, in welchem ​​unterteilten Dreieck Sie sich befinden würden , wenn das Netz weiter tesselliert würde, und dann herausfinden, wie die primitive ID und die Schwerpunktkoordinaten für dieses Dreieck lauten würden.


2
Ich hatte noch nie von Fibonacci-Gittern gehört. Das ist ziemlich toll!
Nathan Reed

Das ist ein faszinierendes Papier. Anscheinend können Sie die Parameter so anpassen, dass sie einem quadratischen oder hexagonalen Gitter näher kommen, wodurch sich verschiedene Ansätze zur Geräuscherzeugung ergeben.
Trichoplax

Ich hatte einige nicht schlechte Ergebnisse bei der Interpolation in der Nähe der Kanten der Kachel (kantenumwickelt), aber es hängt davon ab, welchen Effekt Sie erzielen möchten und welche genauen Rauschparameter vorliegen. Funktioniert hervorragend bei etwas verschwommenen Geräuschen, nicht so gut bei spitzen / feinkörnigen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.