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 .
quelle
Antworten:
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:
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):
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_PrimitiveID
im 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.
quelle