Per-Vertex-Normale aus Perlin-Rauschen?

8

Ich erzeuge Terrain im OpenGL-Geometrieshader und habe Probleme beim Berechnen der Normalen für die Beleuchtung. Ich erzeuge das Terrain dynamisch für jeden Frame mit einer Perlin-Noise-Funktion, die im Geometry-Shader implementiert ist. Aus diesem Grund, Ich brauche eine effiziente Möglichkeit zur Berechnung der Normalen pro Vertex basierend auf der Rauschfunktion (keine Textur oder irgendetwas). Ich bin in der Lage, Kreuzprodukt der 2 Seite zu nehmen, um Gesichtsenormale zu erhalten, aber sie werden dynamisch mit der Geometrie erzeugt, also kann ich nicht dann zurückgehen und die Gesichtsenormalen für Eckpunktnormalen glätten. Wie kann ich Vertex-Normalen im laufenden Betrieb erhalten, wenn ich nur die Rauschfunktion verwende, die die Höhe meines Geländes in der y-Ebene erzeugt (also Höhe zwischen 1 und -1). Ich glaube, ich muss die Rauschfunktion 4 Mal für jeden Eckpunkt probieren, aber ich habe etwas wie das Folgende versucht und es hat nicht funktioniert ...

%Vor%

Die oben genannten Lichter haben sich wie Perlin-Geräusche bewegt! Also irgendeinen Ratschlag, wie ich die Per-Vertex-Normalen richtig bekommen kann?

    
Nitrex88 28.06.2011, 07:48
quelle

2 Antworten

5

Du hast nicht genau gesagt, wie du die Positionen generiert hast. Ich gehe also davon aus, dass Sie das Perlin-Rauschen verwenden, um Höhenwerte in einer Höhenkarte zu generieren. Für jede Position X, Y in der Hightmap verwenden Sie eine 2D-Rauschfunktion, um den Z-Wert zu generieren.

Nehmen wir an, Ihre Position wird wie folgt berechnet:

%Vor%

Dies erzeugt eine 3D-Position. Aber in welchem ​​ Raum ist diese Position? Das ist die Frage.

Die meisten Rauschfunktionen erwarten, dass loc zwei Werte in einem bestimmten Fließkommabereich sind. Wie gut Ihre Rauschfunktion ist, bestimmt, in welchem ​​Bereich Sie Werte übergeben können. Wenn nun 2D-Positionen Ihres Modellbereichs nicht garantiert innerhalb des Bereichs der Rauschfunktion liegen, müssen Sie sie in diesen Bereich transformieren, die Berechnungen durchführen und dann transformiere es zurück in den Modellraum.

Damit haben Sie jetzt eine 3D-Position. Die Transformation für die X- und Y-Werte ist einfach (die Umkehrung der Transformation zum Raum der Rauschfunktion), aber was ist mit dem Z? Hier müssen Sie eine Art Maßstab auf die Höhe anwenden. Die Rauschfunktion gibt eine Zahl im Bereich [0, 1] zurück. Daher müssen Sie diesen Bereich auf denselben Modellbereich skalieren, in den Ihre X- und Y-Werte gehen. Dies wird typischerweise durch Auswählen einer maximalen Höhe und durch geeignetes Skalieren der Position erreicht. Daher sieht unsere überarbeitete Kalkulationsposition ungefähr so ​​aus:

%Vor%

Die beiden Matrizen werden in den Raum der Rauschfunktion umgewandelt und dann zurück transformiert. Ihr tatsächlicher Code könnte weniger komplizierte Strukturen verwenden, abhängig von Ihrem Anwendungsfall, aber eine vollständige affine Transformation ist einfach zu beschreiben.

Nun, nachdem wir festgestellt haben, was Sie beachten müssen, ist Folgendes: Nichts macht Sinn, wenn Sie nicht wissen, in welchem ​​Raum es ist. Ihre normalen, Ihre Positionen, nichts ist wichtig bis Sie feststellen, in welchem ​​Raum es ist .

Diese Funktion gibt Positionen im Modellbereich zurück. Wir müssen Normalen im Modellraum berechnen. Dazu benötigen wir 3 Positionen: die aktuelle Position des Eckpunkts und zwei Positionen, die gegenüber der aktuellen Position leicht versetzt sind. Die Positionen, die wir bekommen müssen im Modellraum sein, oder unser normales wird nicht sein.

Daher müssen wir die folgende Funktion haben:

%Vor%

Offensichtlich können Sie diese beiden Funktionen zu einem zusammenführen.

Der delta Wert ist ein kleiner Offset im Raum der Eingabe der Noise Textur. Die Größe dieses Offsets hängt von Ihrer Rauschfunktion ab. es muss groß genug sein, um eine Höhe zurückzugeben, die sich wesentlich von der tatsächlichen Position unterscheidet. Aber es muss klein genug sein, dass Sie nicht aus zufälligen Teilen der Rauschverteilung ziehen.

Sie sollten Ihre Geräuschfunktion kennenlernen.

Jetzt, da Sie die drei Positionen (die aktuelle Position, den x-Offset und den y-Offset) im Modellbereich haben, können Sie die Vertexnormale im Modellbereich berechnen:

%Vor%

Von hier aus machen Sie die üblichen Dinge. Aber nie vergessen, die Räume Ihrer verschiedenen Vektoren zu verfolgen.

Oh, und noch etwas: Das sollte im Vertex Shader gemacht werden. Es gibt keinen Grund, dies in einem Geometrieshader zu tun, da keine der Berechnungen andere Stützpunkte beeinflusst. Lassen Sie die Parallelität der GPU für Sie arbeiten.

    
Nicol Bolas 28.06.2011, 08:29
quelle
8

Die Normale ist der Vektor senkrecht zur Tangente (auch als Steigung bekannt). Die Steigung einer Funktion ist ihre Ableitung; für n Dimensionen seine n partiellen Ableitungen. Sie messen also das Rauschen um einen Mittelpunkt P herum und bei P ± (δx, 0) und P ± (0, δy), wobei δx, δy so klein wie möglich gewählt wird, aber groß genug für die numerische Stabilität. Dies gibt Ihnen die Tangenten in jeder Richtung. Dann nimmst du das Kreuzprodukt von ihnen, normalisierst das Ergebnis und bekommst das Normal bei P.

    
datenwolf 28.06.2011 08:12
quelle

Tags und Links