[Shader] Normalmap-Generator



  • Moin moin,

    ich beschäftige mich seit gestern mit der Shaderprogrammierung und wollte daher aus Interesse mal "schnell" einen Normalmap-Generator zusammenbauen, der einfach die Normalen eines Meshes nimmt und das Mesh entsprechend der Normalmap-Konvention einfärbt.
    Mittlerweile bin ich auch um das Wissen bereichert worden, dass Normalmaps die Normalen im Tangentenraum beschreiben. Und irgendwie gelingt es mir (vermutlich aufgrund fehlender Theorie) nicht ein korrektes Ergebnis zu produzieren. Insbesondere hab ich Probleme bei der Berechnung des Tangentenraums und frage deshalb hier nun um Rat:

    Ist es möglich, allein aus der Angabe der Normale und einer Position(sowohl im Raum als auch Textur) den Tangentenraum zu berechnen und wenn ja wie? Aus der Schulmathematik ist hängengeblieben, wie die zugehörige Ebene aussieht, die durch die Normale n und Position p definiert wird:

    E = n*(x - p) = n*x -n*p = 0

    wobei x=(x_, x_2, x_3) ein beliebiger Punkt der Ebene ist. Kann ich daraus rechnerisch schnell Punkte der Ebene generieren und den Tangentenraum berechnen? Oder muss ich erst mehrere Vertices einer Primitive akkumulieren, um dann die Berechnung durchzuführen?



  • Schau mal hier und hier 😉



  • Moin,

    schonmal vielen Dank für die Links. Diese waren auf jeden Fall deutlich hilfreicher als jeglicher andere "Kram" den ich bisher fand 😃
    Allerdings zielte meine Frage noch auf einen weiteren Punkt ab, der aus den Artikeln nicht so Recht hervorging:

    Als Voraussetzung hat man dort neben der Face- bzw. Vertexnormalen zumindest noch alle drei Punkte eines Dreiecks. Daraus lässt sich rechnerisch schnell Tangente- bzw. Bitangte generieren.
    Wenn ich das Vorhaben allerdings in einem Shader berechnen lassen möchte, bin ich dort auf eine per-Vertex-Berechnung angewiesen, weil der Shader immer nur mit einem Vertex gefüttert wird.
    Kann ich im Vertexshader davon ausgehen, dass zwei hintereinander in den Shader gegebene Vertices benachbart sind?



  • 🙄
    Ich habe gerade entdeckt, dass HLSL folgende zwei Semantiken als Input anbietet:
    TANGENT, BINORMAL
    Das muss man auch erstmal wissen... Damit hat sich die Sache vermutlich erledigt. Kommt davon, wenn man nicht in die Doku guckt 😃



  • Shader-Neuling schrieb:

    Wenn ich das Vorhaben allerdings in einem Shader berechnen lassen möchte, bin ich dort auf eine per-Vertex-Berechnung angewiesen, weil der Shader immer nur mit einem Vertex gefüttert wird.

    Richtig, das ist ein Problem. Wieso willst du diese Berechnung überhaupt im VertexShader durchführen?

    Shader-Neuling schrieb:

    Kann ich im Vertexshader davon ausgehen, dass zwei hintereinander in den Shader gegebene Vertices benachbart sind?

    Was sind "zwei hintereinander in den Shader gegebene Vertices"?

    Shader-Neuling schrieb:

    Ich habe gerade entdeckt, dass HLSL folgende zwei Semantiken als Input anbietet:
    TANGENT, BINORMAL
    Das muss man auch erstmal wissen... Damit hat sich die Sache vermutlich erledigt. Kommt davon, wenn man nicht in die Doku guckt 😃

    Wie genau soll das nun dein Problem lösen!?

    Wenn du gerade mit Shaderprogrammierung beginnst, dann ist Normalmapping vielleicht nicht unbedingt das erste was du machen solltest. Mach doch mal einen simplen VertexShader der die Vertices eines Objektes irgendwie animiert und versuch dann mal langsam einfache Beleuchtung hinzubekommen...



  • Richtig, das ist ein Problem. Wieso willst du diese Berechnung überhaupt im Vertex Shader durchführen?

    Ich wollte mich mit der Thematik vertraut machen. Das ist eigentlich der einzige Grund.

    Was sind "zwei hintereinander in den Shader gegebene Vertices"?

    Als ich die Frage gestellt hatte, habe ich das Maß an Paralellität nicht bedacht, mit welcher Grafikkarten arbeiten und dass mehrere Shader-Einheiten existieren. Die Frage ist hinfällig.

    Wie genau soll das nun dein Problem lösen!?

    Hm, das Problem war, dass ich Tangente und Binormale zuvor nicht zur Verfügung hatte. Jetzt bekomme ich durch die Semantiken "kostenlos" zur Verfügung gestellt 😃 Das löst das Problem 😉
    Indem ich den Normalenvektor in den Tangentenraum transformiere, kann ich doch anschließend die Farbwerte einfach aus dem transformierten Normalenvektor rauslesen oder? Ich werd nachher mal entsprechenden Code dazu posten.

    Wenn du gerade mit Shaderprogrammierung beginnst, dann ist Normalmapping vielleicht nicht unbedingt das erste was du machen solltest. Mach doch mal einen simplen VertexShader der die Vertices eines Objektes irgendwie animiert und versuch dann mal langsam einfache Beleuchtung hinzubekommen...

    Ja, sollte ich 😃 Ich hatte mit Object-Space Normalmapping begonnen und hatte mich anschließend etwas in die Thematik des Tangent-Space-Normalmapping eingelesen und fand dies interessant. Nur deswegen sitz ich jetzt daran...



  • Shader-Neuling schrieb:

    Jetzt bekomme ich durch die Semantiken "kostenlos" zur Verfügung gestellt 😃 Das löst das Problem 😉

    Nope, bekommst du nicht. Nur weil du was mit der Semantik NORMAL belegst, bekommst du ja auch nicht auf magische Weise die Normalen berechnet... 😉


Anmelden zum Antworten