So orientieren Sie eine Oberfläche normal zu einer kubischen Oberfläche

7

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:

  1. Wie drehe ich die normale Karte so, dass sie auf jeder der Würfelflächen richtig ausgerichtet ist?
  2. 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.

Klay
quelle
Multiplizieren Sie die Gelände-Normalen mit einer 3x3-Matrix, die für jede Würfelfläche unterschiedlich ist.
Mondschatten
Würden Sie Ihren Vektor von Mitte zu Oberfläche nicht einfach erweitern, bis er auf den Würfel trifft, genau wie bei anderen Arten der Würfelzuordnung? Oder fehlt mir hier etwas?
drxzcl
Diese Frage bezieht sich nicht direkt auf die Spieleentwicklung, und Sie würden höchstwahrscheinlich bessere Antworten bei Stack Overflow stackoverflow.com
Ricket
Dies bezieht sich auf Echtzeitgrafiken, die einen großen Teil der Spieleentwicklung ausmachen, daher halte ich sie für relevant.
BigSandwich
Es ist eher Grafik als Programmierung. Also hier klingt gut. Und Mondschatten, Ranieri: Würden sie es nicht besser als Antworten machen?
Die kommunistische Ente

Antworten:

3

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.)

Anteru
quelle
Ich habe eine vage Halb Vorstellung davon , was Tangente-Raum ist, aber ich weiß nicht , wie Sie Ihren Rat zu nehmen und tut alles , was mit ihm. Aber das ist wahrscheinlich ganz und gar meine Schuld. Was den zweiten Absatz betrifft - ich habe versucht, Verzweigungscode in HLSL zu vermeiden, weil mein Amateurverständnis besagt, dass Verzweigungscode in HLSL eine sehr schlechte Sache ist. Obwohl es so klingt, als wäre es unvermeidlich.
Klay
Es gibt keine Verzweigung: Ich nehme an, Sie haben einen Würfel mit einer normalen Karte auf jedem der Gesichter. Jetzt entfalten Sie diesen Würfel im Grunde genommen auf einer Kugel. Das Einfachste, was Sie tun möchten, ist, eine Kugel in Ihren Würfel zu legen, Strahlen gegen den Würfel zu verfolgen und dann die Normalen zu biegen. Angenommen, Ihre normale Frequenz ist auf einer sphärischen Oberfläche gleichmäßig (dh auf einer Würfelfläche ungleichmäßig), sollte dies eine gebrauchsfertige normale Karte für eine Kugel ergeben. Obwohl ich immer noch nicht verstehe, warum du diesen Würfel hast? Kannst du nicht sofort eine Kugel bearbeiten?
Anteru
Der Grund, warum ich die Würfelkarte verwende, ist, dass es viel einfacher ist, mit sechs Quadtrees, die anschließend einer Kugel zugeordnet werden, eine Detailgenauigkeit zu erzielen, als LOD-Berechnungen auf der Kugeloberfläche selbst durchzuführen.
Klay
Auch der Teil in Ihrer Antwort, in dem Sie sagen, "orientieren Sie sie einfach konsequent", könnte der Kern des Problems sein. Ich weiß nicht, wie ich meine UV-Koordinaten konsistent auf den sechs Würfelflächen ausrichten soll, ohne auf etwas wie [wenn cubeFace == top, dann u = x und v = z ...] usw. zurückzugreifen, was zur Verzweigung I 'führt. Ich spreche darüber. Insgesamt kann ich den Gesamtprozess aber immer noch nicht visualisieren. Tut mir leid, dass ich so dicht bin.
Klay
0

"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.

BigSandwich
quelle
Der Algorithmus tastet die umgebenden Punkte ab und multipliziert die Steigungen (oder ist es das Punktprodukt?), Um den Vektor senkrecht zu den Steigungen zu erhalten. Zumindest ist das meine vage Erinnerung - ich bin auf der Arbeit und kann den Geldautomaten nicht überprüfen.
Klay
Wenn ich Sie richtig verstehe, muss ich anscheinend die Krümmung der Kugel in die normale Karte selbst "einbacken", damit die Beleuchtung korrekt ist. Wieder entschuldige ich mich dafür, dass ich so dicht bin, aber eine Art Diagramm und / oder Pseudocode könnte helfen.
Klay