Normal Mapping - Tangentspace falsch berechnet?

  • Hallo,
    wir sitzen jetzt schon seit einiger Zeit an unserem letzten Problem: Die Beleuchtung mit NormalMapping funktioniert nicht richtig. Für die ganzen Screenshots haben wir alles rausgenommen was unwichtig ist.
    Das flippen der UV-Koordinaten wie in dem Post von gestern beschrieben macht dabei keinen Unterschied:


    Screenshot - 13.01.jpg


    Von Nahem an hellen Stellen sieht das Normal Mapping vernünftig aus und bewegt sich auch (irgendwie) mit dem Licht (nicht so wie es soll). Die UV Koordinaten müssten halbwechs stimmen (rot = u, grün = v), mit der normalen Textur passts ja auch:


    Screenshot - 13.01_UV.jpg


    Die Normalen in Weltkoordinaten sollten auch okay sein:
    Screenshot - 13.01n.jpg


    Wir wissen nicht so recht was noch falsch sein könnte. Die Bitangenten und Tangenten haben wir selbst berechnet, das Beleuchtungsmodell ist im Tangentspace. Ungefähr haben wir uns an dieses Tutorial gehalten: http://www.opengl-tutorial.org…torial-13-normal-mapping/


    Kann uns jemand helfen? Danke!


    Exatex


    PS: Wenn jemand in Git reinschauen möchte: Gruppe Insomaniacs, Branch "normals". Die besagten shader sind Shader/basic.frag bzw Shader/basic.vert. Das Laden der Normalen passiert in Scene/Mesh.cpp, der Aufruf der Pipeline in Gameplay.cpp. Eigentlich wollten wir ein directional light verwenden, aber das ist jetzt trotz anderen namens ein Punktlicht.

  • Also... Ich hab mir das Projekt mal angesehen..


    Eure Tangenten:
    tangents.jpg
    und Bitangenten:
    bitangents.jpg
    sind kaputt.


    Um den Fehler in eurer Berechnung zu finden, brauch ich eine Weile.
    Ihr könntet ja daweil Assimp das Berechnen erledigen lassen und natürlich auch selbst ein wenig suchen :)


    Außerdem:
    Ihr habt beim Importen des Meshes folgendes Flag: "aiProcess_FlipUVs"
    Gibt's einen besonderen Grund dafür? Ich hab mir noch notiert bei meinem Projekt, dass es bei mir die Texturkoordinaten kaputt gemacht hat und hab's dann explizit nicht benutzt. Überlegt euch halt ob ihr das braucht.


    Außerdem (2):
    Shader "basic.vert":


    Ergibt wenig Sinn für mich:


    vec3 LightPosition_cameraspace = ( view * vec4(lightDir,1)).xyz;
    vec3 LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;


    "lightDir" wird zu einer Position?
    Oder ist lightDir eh eine Position nur falsch benannt?
    LightDirection_cameraspace ist dann in welche Richtung nach der Addition der Vektoren?
    Verwirrt mich sehr...

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

  • Ich korrigiere mich.


    Hab die Assimp generierten Tangenten/Bitangenten versucht - Selbes Phänomen.
    Es sind die Texturkoordinaten:
    textures.jpg
    Die sind mal so, mal so gedreht. Darum ist der Boden auch so fleckig, wenn man die Tangenten visualisiert oder eine Beleuchtung berechnet.
    Das solltet ihr im Modellierungsprogramm noch mal korrigieren, das ist ein Designfehler.

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]


  • ...und natürlich auch selbst ein wenig suchen :)


    Danke für die Hilfe! Wir haben uns schon ein paar Tage schwarz gesucht und auch schon andere Fehler gefunden, keine Sorge :D



    Ihr habt beim Importen des Meshes folgendes Flag: "aiProcess_FlipUVs"


    Wir hatten mal ein Model bei dem das nötig war (Blender output braucht das manchmal), aber es macht jetzt keinen Unterschied.




    "lightDir" wird zu einer Position? Oder ist lightDir eh eine Position nur falsch benannt?


    Das ist eine Position, das meinte ich im ersten post mit "Eigentlich wollten wir ein directional light verwenden, aber das ist jetzt trotz anderen namens ein Punktlicht."


    Andere models sehen genauso aus, auch nur eine simple plane und importierte Objekte. Wir wissen schon, dass in den Objekten die UV Koordinaten unterschiedlich sind. Das sollte aber für die Beleuchtungsbrechnung absolut gar keinen Unterschied machen. Die normalen sind unabhängig von den UVs. Diffuses Licht hängt vom Winkel von Licht und Normale zusammen. Wenn mit der Normal Map eine Normale auf einem um 180 grad gedrehten Triangle darstellt, dann ist ja auch die normal map um 180 grad gedreht und es kommt wieder das selbe bei raus. Wir vermuten das Problem bei der Lichtberechnung aus WorldSpace->Tangent Space aber sind noch nicht weitergekommen


  • Das ist eine Position, das meinte ich im ersten post mit "Eigentlich wollten wir ein directional light verwenden, aber das ist jetzt trotz anderen namens ein Punktlicht."


    Aja, sorry. Passt also.


    --------
    Ich hab noch mal drüber gesehen. Warum ist eure TBN Matrix eine NTB Matrix?
    Wenn's wahr ist, müsste es so sein:

    Code
    1. [COLOR=blue]mat3[/COLOR] TBN = transpose([COLOR=blue]mat3[/COLOR](
    2. vertexTangent_cameraspace,
    3. vertexBitangent_cameraspace,
    4. vertexNormal_cameraspace
    5. ));


    Danke für die Hilfe! Wir haben uns schon ein paar Tage schwarz gesucht und auch schon andere Fehler gefunden, keine Sorge


    Das war übrigens kein Angriff auf eure Person oder Leistung. Ich wollt nur sagen, dass ihr weiter suchen sollt, während ich auch weiter such...


    -----------
    EDIT:
    Ihr werdet die Texturkoordinaten dennoch fixen müssen, denn die Lichtrichtung in Tangent Space ist sonst "random" verdreht. Das mag sich beim diffusen Anteil nicht auswirken, aber beim spekularen schon.

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

    Edited once, last by 2#4u ().

  • :omg:



    Warum ist eure TBN Matrix eine NTB Matrix?


    OH MEIN GOTT das wars... verdammt... Dankedankedanke!!



    Ihr werdet die Texturkoordinaten dennoch fixen müssen, denn die Lichtrichtung in Tangent Space ist sonst "random" verdreht. Das mag sich beim diffusen Anteil nicht auswirken, aber beim spekularen schon.


    Achso ich weiß was Du gemeint hattest. Ja, hast recht.