Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 21, 2025 09:30

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Mai 01, 2008 13:01 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
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 ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 10, 2008 13:51 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 10, 2008 22:30 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. varying vec3 T,B,N;
  3.  
  4. attribute vec3 Tangent;
  5.  


Dann formst du die TBN um und schickst sie an den fragment shader
Code:
  1.  
  2.   N = normalize(gl_NormalMatrix * gl_Normal);
  3.  
  4.   T = normalize(gl_NormalMatrix  * Tangent);
  5.  
  6.   B = cross (T,N);
  7.  


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:
  1.  
  2. vec3 normal       = normalize(texture2D(normalmap,vec2(gl_TexCoord[0])).xyz) -0.5;
  3.  normal           = normalize(T * normal.x + B * (normal.y*-1.0) + N * normal.z);
  4.  


probiers aus und falls fragen sind meld dich zurück!

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 10, 2008 22:47 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 11, 2008 09:04 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Das will ich ja eben nicht, deshalb berechne ich sie im Vertex Shader.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 11, 2008 10:08 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 11, 2008 10:26 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 11, 2008 10:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 17, 2005 13:19
Beiträge: 98
Wohnort: Jahnsdorf
Könnte das ggf. mit dem Fehler von gestern, der im Shader-Tut angemerkt wurde, zusammenhängen?

Siehe viewtopic.php?t=7478

_________________
Administrator of Project Omorphia
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
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).

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 21:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Du multiplizierst die Matrizen falschrum mit den Vektoren: (Zeile 28 + 29)
Code:
  1.  
  2.   vec3 LightPos = vec3(gl_ModelViewMatrix * gl_LightSource[0].position);
  3.   vec3 VertexPos = vec3(gl_ModelViewMatrix * gl_Vertex );
  4.  


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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
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.


Dateianhänge:
Unbenannt.jpg [206.74 KiB]
16-mal heruntergeladen

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 16, 2008 10:40 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Mein Code sieht jetzt so aus, allerdings finde ich das Ergebnis schlechter als vorher :shock:
Code:
  1. varying vec2 texCoord;
  2. varying vec3 lightVec;
  3. varying vec3 eyeVec;
  4.  
  5. void main(void)
  6. {
  7.   // Transformation (Modelview und Projection)
  8.   gl_Position = ftransform();
  9.   // Texturkoordinaten
  10.   texCoord = vec2(gl_MultiTexCoord0);
  11.  
  12.   // Berechnen der Tangente und der Binormale
  13.   vec3 tangent;
  14.   vec3 binormal;
  15.   vec3 normal = normalize(gl_Normal);
  16.   vec3 c1 = cross(normal, vec3(0.0, 0.0, 1.0));
  17.   vec3 c2 = cross(normal, vec3(0.0, 1.0, 0.0));    
  18.   if(length(c1) > length(c2))
  19.   {
  20.     tangent = c1;  
  21.   } else
  22.   {
  23.     tangent = c2;  
  24.   }
  25.   tangent = normalize(tangent);
  26.   binormal = normalize(cross(tangent, normal));
  27.   // Transformieren des Light und des Eye Vektors in den Tangentenraum
  28.   vec3 LightPos = vec3(gl_ModelViewMatrix * gl_LightSource[0].position);
  29.   vec3 VertexPos = vec3(gl_ModelViewMatrix * gl_Vertex);
  30.   mat3 tbnMatrix = gl_NormalMatrix * mat3(tangent, binormal, normal);
  31.   // eyeVec
  32.   vec3 tmpVec = -VertexPos;
  33.   eyeVec = tbnMatrix * tmpVec;
  34.   // lightVec
  35.   tmpVec = LightPos - VertexPos;
  36.   lightVec = tbnMatrix * tmpVec;
  37. }

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 17, 2008 00:25 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 17, 2008 09:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
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.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 17, 2008 09:58 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
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.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.033s | 17 Queries | GZIP : On ]