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:
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
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
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:
varying vec3 T,B,N;
attribute vec3 Tangent;
Dann formst du die TBN um und schickst sie an den fragment shader
Code:
N = normalize(gl_NormalMatrix * gl_Normal);
T = normalize(gl_NormalMatrix * Tangent);
B = cross (T,N);
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:
vec3 normal = normalize(texture2D(normalmap,vec2(gl_TexCoord[0])).xyz) -0.5;
normal = normalize(T * normal.x + B * (normal.y*-1.0) + N * normal.z);
probiers aus und falls fragen sind meld dich zurück!
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ahm, du musst dann die Tangente auch als Attribut noch zusätzlich übergeben (mit glVertexAttribute), nicht wahr?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
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.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
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
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
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).
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!
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
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.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
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.
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.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
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.
Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.