- varying vec3 T,B,N;
- attribute vec3 Tangent;
DGL https://delphigl.com/forum/ |
|
Normalmapping - Problem mit Vertex-Shader https://delphigl.com/forum/viewtopic.php?f=20&t=7464 |
Seite 1 von 1 |
Autor: | Seth [ Do Mai 01, 2008 13:01 ] |
Betreff des Beitrags: | Normalmapping - Problem mit Vertex-Shader |
hi, Ich habe mich nochmal genauer mit Normalmapping auseinandergesetzt und jetzt schon einiges Versucht um die Translation der Koordinaten vorzunehmen, allerdings sieht das immernoch nicht richtig aus und wenn es richtig aussieht, dann gibt es immer wieder Seiten meines Würfels, die Matt aussehen. Ich denke das Problem liegt im Vertex-Shader. Ich habe mal die Exe und die Shader verlinkt: http://www.exec-dev.de/OpenGL/normalmapping.zip (ca. 1mb) Was läuft da verkehrt ? |
Autor: | Seth [ Sa Mai 10, 2008 13:51 ] |
Betreff des Beitrags: | |
Ich frag hier einfach nochmal was mit dem Vertex-Shader nicht stimmt. Rein mathematisch hab ich schon einiges probiert, bekomme auch des öfteren andere Ergebnisse obwohl es meiner Meinung nach korrekt sein müsste. Da ich kein absoluter Experte auf dem Gebiet bin, kann ich auch nicht unbedingt sagen, ob das was ich sehe richtig oder falsch ist. Aber das scheint mir definitiv nicht zu stimmen ![]() mfg |
Autor: | Sellmann [ Sa Mai 10, 2008 22:30 ] |
Betreff des Beitrags: | |
wieso machste das denn so kompliziert? die TBN vektoren gibts als Attribute fix und fertig im vertex shader. probiers doch mal so: schnapp dir den Tangenten als attribute im vertex shader und leg die einzelnen TBN als vrayings fest: Code:
Dann formst du die TBN um und schickst sie an den fragment shader Code:
im fragment shader brauchst du dann nur noch deine normale auslesen und mit der TBN korrigieren. Denke beim auslesen daran, dass die normalen einen werte bereich von -1.0-1.0 haben, die Texturen aber nur einen wertebereich von 0.0-1.0, deswegen das -0.5 und normalisieren. (bei mir sind die normalmaps etwas anders, deshalb steht da jetzt ein y*-1.0 mit drin): Code:
probiers aus und falls fragen sind meld dich zurück! |
Autor: | Lord Horazont [ Sa Mai 10, 2008 22:47 ] |
Betreff des Beitrags: | |
Ahm, du musst dann die Tangente auch als Attribut noch zusätzlich übergeben (mit glVertexAttribute), nicht wahr? Gruß Lord Horazont |
Autor: | Seth [ So Mai 11, 2008 09:04 ] |
Betreff des Beitrags: | |
Das will ich ja eben nicht, deshalb berechne ich sie im Vertex Shader. mfg |
Autor: | Sellmann [ So Mai 11, 2008 10:08 ] |
Betreff des Beitrags: | |
man kann es so setzen, man kann es aber auch lassen, denn opengl ist so klug, dass sich die Information über die Tangente anhand der Texturkoordinaten automatisch berechnet und so bereits zur Verfügung steht. In meinen Programmen hab ich bisher immer so gearbeitet. Ich könnte mir vorstellen, dass untexturierte Objekte dann nen schwachsinns wert haben, aber untexturierte objekte brauchen auch keine bumpmap. könnte allerdings auch sein, dass die Tangent aus den glVertex infos erzeugt wird. Damit mein ich, dass eine der Kanten automatisch als Tangente gespeichert wird. Wie genau weiß ich nicht, aber es geht... zumindest bei mir. |
Autor: | Lord Horazont [ So Mai 11, 2008 10:26 ] |
Betreff des Beitrags: | |
Davon, dass OpenGL einem automatisch die Tangente als Attribut liefert, habe ich noch nichts gehört. Klingt aber auf alle fälle interessant und wäre wohl einer genaueren Untersuchung wert. Gruß Lord Horazont |
Autor: | BenBE [ So Mai 11, 2008 10:53 ] |
Betreff des Beitrags: | |
Könnte das ggf. mit dem Fehler von gestern, der im Shader-Tut angemerkt wurde, zusammenhängen? Siehe viewtopic.php?t=7478 |
Autor: | oc2k1 [ Mo Mai 12, 2008 16:34 ] |
Betreff des Beitrags: | |
Die tangenten wrden definitiv nicht von opengl erzeugt. Dazu ist es nötig die primitive inclusive aller umligenden primitiven zu kennen (sofern es sich um runde oberflächen handelt) und genau dies ist nicht der Fall. Allerdings ist es nicht wirklich viel schwerer als das berechnen von normalen. Das einzige was man beachten muss, das man die tangenten nicht per vertex (position) berechnet, sondern per texturkordinate (im enddefekt auch per vertex, da opengl nur einen index erlaubt). |
Autor: | damadmax [ Mo Mai 12, 2008 21:02 ] |
Betreff des Beitrags: | |
Du multiplizierst die Matrizen falschrum mit den Vektoren: (Zeile 28 + 29) Code:
Funktioniert dann zumindest schonmal besser als vorher. Muss aber irgendwo noch ein Fehlerchen drin sein, dass ich noch nicht gefunden habe. Die Seitenflächen werden noch etwas "komisch" beleuchtet. Habe auch mal die Multiplikation der tbnMatrix am Ende umgedreht aber dann siehts auch nicht besser aus! ![]() |
Autor: | Pellaeon [ Do Mai 15, 2008 18:55 ] | ||
Betreff des Beitrags: | |||
In der letzten Zeile sind Matrix und Vektor auch vertauscht. Und zwei Zeilen drüber auch. Wenn man das ändert und die schon erwähnten Vertauschungen in Teile 28/29 dazu nimmt, dann sieht es bedeutend besser aus.
|
Autor: | Seth [ Fr Mai 16, 2008 10:40 ] |
Betreff des Beitrags: | |
Mein Code sieht jetzt so aus, allerdings finde ich das Ergebnis schlechter als vorher ![]() Code:
mfg |
Autor: | Sellmann [ Sa Mai 17, 2008 00:25 ] |
Betreff des Beitrags: | |
also ich bin mir jetzt nicht sicher, aber wenn du gl_normal normalisierst und mit nem vektor der länge 1 kreuzt, ist die länge des resultates nicht dann auch automatisch 1? und würde das dann nicht heißen, dass die länge von c1 und c2 immer gleich ist und dann immer der else zweig deiner if-frage ausgelöst wird und die tangente somit immer c2 ist? des Weitern möcht ich trotzdem noch einmal erwähnen, dass das Tangent Attribut bei mir wirklich ohne Probleme völlig korrekt läuft, ohne dass ich irgendwelche Berechnungen extra dafür anstellen muss. Ich würde mich freuen, wenn das mal wer ausprobieren könnte von euch, um zu schauen ob es wirlich nur bei mir und an den fh-Rechnern geht, oder ob es evtl. doch überall funktioniert. |
Autor: | Pellaeon [ Sa Mai 17, 2008 09:44 ] |
Betreff des Beitrags: | |
Sellmann hat geschrieben: also ich bin mir jetzt nicht sicher, aber wenn du gl_normal normalisierst und mit nem vektor der länge 1 kreuzt, ist die länge des resultates nicht dann auch automatisch 1? und würde das dann nicht heißen, dass die länge von c1 und c2 immer gleich ist und dann immer der else zweig deiner if-frage ausgelöst wird und die tangente somit immer c2 ist? *unterschreib*^^ Sellmann hat geschrieben: des Weitern möcht ich trotzdem noch einmal erwähnen, dass das Tangent Attribut bei mir wirklich ohne Probleme völlig korrekt läuft, ohne dass ich irgendwelche Berechnungen extra dafür anstellen muss. Ich würde mich freuen, wenn das mal wer ausprobieren könnte von euch, um zu schauen ob es wirlich nur bei mir und an den fh-Rechnern geht, oder ob es evtl. doch überall funktioniert.
Alleine schon der Name "Tangente" spricht nicht für eine Build-In-Variable, wenn dann wäre es wohl gl_tangent. Das Attribut "Tangente" wird bei dir von außerhalb gesetzt. Musst du mal im Quellcode suchen. |
Autor: | The-Winner [ Sa Mai 17, 2008 09:58 ] |
Betreff des Beitrags: | |
Sellmann hat geschrieben: also ich bin mir jetzt nicht sicher, aber wenn du gl_normal normalisierst und mit nem vektor der länge 1 kreuzt, ist die länge des resultates nicht dann auch automatisch 1?
und würde das dann nicht heißen, dass die länge von c1 und c2 immer gleich ist und dann immer der else zweig deiner if-frage ausgelöst wird und die tangente somit immer c2 ist? Der Betrag des Kreuzprodukts zweier Einheitsvektoren ist der sinus des Winkels zwischen ihnen. Also ist die länge des Produkts nur dann 1 wenn sie senkrecht aufeinander stehen. |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |