Die unmittelbare Frage lautet: Wie kann ich in HLSL eine im UV-Raum erzeugte Oberflächennormale so ausrichten, dass ich sie auf eine Würfelfläche anwenden kann?
Das Gesamtprojekt ist, dass ich versuche, einen prozeduralen Planetengenerator zu bauen. Ich benutze einen Würfel, der auf eine Kugel projiziert wird, bei der jede Fläche ein Quad-Baum ist. Das Zwischenprojekt ist, dass ich eine normale Karte für das Gelände erstellen möchte. Ich denke, der beste Weg für mich, dies zu tun (und zu verstehen, was ich tue), besteht darin, zuerst die Normalen für die Würfelversion zu generieren und dann die Transformationen zu erarbeiten, um diese Normalen in die Kugel zu verzerren.
Im Idealfall würde die Methode keinen Verzweigungscode basierend auf dem Gesicht beinhalten, an dem ich arbeite (dh wenn wir uns auf der Oberseite des Würfels befinden, dann ist U = X und V = Y). Mit anderen Worten, was ich mir erhoffe, ist eine mathematische Magie wie "Oh, kreuzen Sie einfach das Terrain normal mit dem Punktprodukt der Würfelfläche normal und bla bla bla".
20.09.10 ETA:
Ich weiß, wie man Normalen für eine flache Oberfläche berechnet. Mein nachfolgendes Problem ist zweifach:
- Wie drehe ich die normale Karte so, dass sie auf jeder der Würfelflächen richtig ausgerichtet ist?
- Wie verziehe ich die flache normale Karte so, dass sie die Kugel umhüllt?
Ich habe eine Lösung gefunden , die eine Jacobi-Matrix verwendet, aber ich kann sie nicht zum Laufen bringen. Selbst wenn alle Normalen gerade nach oben zeigen (dh eine flache Oberfläche), bringt der HLSL-Code, an dem der Jacobianer beteiligt ist, die Beleuchtung völlig durcheinander - daher kann ich meiner Implementierung der Lösung nicht vertrauen.
Antworten:
Ihre Normalen sollten sich im Tangentenraum befinden. Auf diese Weise können Sie sie auf jede Oberfläche anwenden, für die Sie einen Tangentenraum erstellen können (trivial für Kugeln). Grundsätzlich beschreibt die Normalkarte, wie sich die Normalen von der tatsächlichen Normalen auf einem kleinen Fleck auf dem unterscheiden Oberfläche. Der Tangentenraum ist das, was Sie wahrscheinlich mit Ihrer Jacobi-Matrix erreichen möchten. Für eine Kugel können Sie an jedem Punkt ein Tangentenraum-Koordinatensystem erstellen, indem Sie die Normalen am Punkt und zwei senkrechte Vektoren verwenden. Richten Sie sie einfach konsistent aus ( zum Beispiel entlang u und v) und du bist fertig. Sie können dann Ihren einfallenden Lichtvektor in einen Tangentenraum (oder umgekehrt) übersetzen und mit der neuen Normalen beleuchten. Der Vorteil ist, dass Ihre normale Karte auf jedem Objekt mit einem definierten Tangentenraum und einer UV-Abbildung funktioniert.
Auf dem Würfel ist Ihr Tangentenraum für jedes Gesicht einfach das Gesicht selbst (dh wenn Sie beispielsweise ein Gesicht mit einem normalen -Z haben und Ihr Tangentenraum nach oben + Y ist, drehen Sie diesen Normalen einfach mit einer Matrix, die abgebildet wird -Z bis + Y.)
quelle
"Ich weiß, wie man Normalen für eine flache Oberfläche berechnet." Genau wie machst du das? Soweit ich weiß, sollten Sie nichts tun müssen, um es auf eine andere Kugel abzubilden, als Ihre UVs korrekt auf die Kugeloberfläche abzubilden. Normale Karten befinden sich immer in einer "flachen" Ebene, da die Textur selbst "flach" ist. Die Form des Objekts, auf das Sie die normale Karte anwenden, sollte keine Rolle spielen.
quelle