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

Aktuelle Zeit: Mi Jul 23, 2025 18:32

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: bump shader
BeitragVerfasst: Mi Dez 06, 2006 13:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
Seit 3 Tagen beschäftige ich mich mit GLSLang.
Bin also noch ziemlich am Anfang, und habe auch gleich ein Problem :)

Ich hänge gerade an einem Bump-Mapping Shader. Er funktioniert zwar, jedoch ist das Specular etwas weiter rechts als es eigentlich sein sollte.

Kann es leider nicht besser beschreiben, aber ich habe die exe mal hochgeladen (http://texelviews.delphigl.com/downloads/glsl.zip), damit ihr es selbst sehen könnt.
Die Licht-Position ist immer die "Camera"-Position.
Die Camera kann man mit der Maus drehen (leftclick & drag).


Mein VertexShader Code:
Code:
  1. varying vec3 Vertex2Light;
  2.  
  3. void main(void)
  4. {
  5.   gl_Position = ftransform();
  6.  
  7.   gl_TexCoord[0] = gl_MultiTexCoord0;
  8.   gl_TexCoord[1] = gl_MultiTexCoord1;
  9.  
  10.   Vertex2Light = vec3(gl_LightSource[0].position) - vec3(gl_ModelViewMatrix * gl_Vertex);
  11. }



Mein FragmentShader Code:
Code:
  1. varying vec3 Vertex2Light;
  2.  
  3. uniform sampler2D tu0;
  4. uniform sampler2D tu1;
  5.  
  6. void main(void)
  7. {
  8.   // Bumpmapping Normale berechnen
  9.   vec3 TexNormal = texture2D(tu1, gl_TexCoord[1].st).rgb*2.0 - 1.0;
  10.  
  11.   // Winkel zwischen TextureNormale und Vertex-Licht-Normale
  12.   float phi = acos( dot(Vertex2Light, TexNormal) / (length(TexNormal) * length(Vertex2Light)) );
  13.  
  14.   gl_FragColor = texture2D(tu0, vec2(gl_TexCoord[0])) / pow(phi, 0.6);
  15. }


PS: Die Shader-Tutorials im Wiki sind super! (wenn ich mir das Feedback an dieser Stelle erlauben darf :wink: )

edit Lossy: Codetags hinzugefügt

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 06, 2006 16:26 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
So leicht ist das mit dem Bunpmapping leider nicht. Es ist quasi egal welche variante von Bumpmapping man verwenden will man braucht auf jeden Fall einen Tangentvector um einem Texturspace aufzuspannen.
Verwirrender Weise hat man nun Zwei oder mehr Möglichkeiten:

1. Die Lichtquellen werden in den Texturspace projeziert. Die Normalmap wird dabei 1:1 aus der textur übernommen. Die projektion der Lichquellen wird dabei im Vertexshader vorgenommen. Die war zur Zeit der ersten Texturkompbinierer bis Pixelshader 1.4 war dies ein gängiges vorgehen, da so das Bumpmapping mit nur zwei registern/instructions durchgefühert werden konnte.

2.Die Normalmap wird in den perspektivischen Worldspace projeziert. eine hellblaue Map sieht dann bei der Darstellung exakt wie ein dargestellter normalvektor aus. zusätzilich sind 3 Multiplikationen (zwei davon MADD) für die Matrixvektor multiplikation nötig, die die Normalmapvektoren passend hindrehen.

3. Es gibt auch besonders bunte Normalmaps die nicht in den Texturespace, sondern in den Objektspace gehöhren, hier kann man sich im Modell auf die Vertex und Texturkoordinaten beschränken. Nun muss man allerdings den Normalvektor aus der Normalmap im Pixelshader mit der gl_NormalMatrix multiplizieren. Prinzipell besitzt das Modell dann keine Per Vertexnormalen, sondern per Texelnormalen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 08, 2006 09:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Ich habe das jetzt nochmal vesucht mit der Projektion der Bumpnormale in den Objectspace.
Habe es aber nicht wirklich hinbekommen. Es hat sich zwar etwas geändert, jedoch stimmt das aber immer noch nicht.
Kannst du mir vllt einen Tipp geben wie man das am besten anstellt ??

Die ander Lösung wäre mir auch recht. Es muss nur irgendwie funktionieren :wink:

Gruß, MatReno

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 08, 2006 13:51 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Jier sind ein paar meiner shader codes:

Ein recht universeller VCertexshader. Den EyeVec kann man für spätere Paralaxshder gebrauchen. Das Attribute tangent muss auf jedenfall mit im Vertexstrom sein.
Code:
  1. attribute vec3 Tangent;
  2.  
  3. varying vec3 T,B,N;
  4. varying vec3 EyeVec;
  5.  
  6. void main(void){
  7.     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.     gl_TexCoord[0]  = gl_MultiTexCoord0 * vec4(3,1,1,1);
  9.     N = normalize(gl_NormalMatrix * gl_Normal);
  10.     T = normalize(gl_NormalMatrix  * Tangent);
  11.     B = cross (T,N);
  12.    
  13.     vec3 vm = vec3(gl_ModelViewMatrix * -gl_Vertex);
  14.  
  15.     EyeVec = vec3(dot(T,vm), dot(B,vm), dot(N,vm));
  16.  
  17.     }


Code:
  1.  
  2. uniform sampler2D Specularmap;
  3. uniform sampler2D Colormap;
  4. uniform sampler2D Normalmap;
  5. varying vec3 T,B,N;
  6.  
  7. varying vec3 EyeVec;
  8.  
  9. vec3 lvec= vec3(0.0,0,1);
  10.  
  11. void main(void){
  12.  
  13.     vec2 rcoords = vec2(gl_TexCoord[0]) ; //diese Zeile ist drin da der rest eigendlich aus einem reliefshader stammt
  14.     vc3 nmap = -1 + 2* texture2D(Normalmap,rcoords );
  15.    
  16.         nmap = normalize(T * nmap.x + B * nmap.y + N * nmap.z);
  17.     float l = dot(nmap,lvec);
  18.         float r  = pow(max(dot(reflect (lvec,nmap),vec3(0,0,-1)), 0),4); //exponet steuerte die rauhigkeit
  19.         float spec =  texture2D(Specularmap,rcoords );
  20.     gl_FragColor = l * texture2D(Colormap,rcoords) *(1.0-spec)  + r*spec;
  21.     //gl_FragColor = vec4(.5 + .5 * nmap,1); //zum checken der Normalmap alternativ T B oder N oder einena deren Vektor einsetzten
  22.     }


Ich empfehle die speculare map besser im Alphachanel der Color oder Normalmap unterzubringen. Alternativ lässt sich auch eine 3 Kanalige Specularmap benutzen, deren erster kanal den Anteil zwischen diffusem und reflektiven Licht steuert, der zweite den Exponenten (Ebenheit auf mikroebene) und der dritte den einfluss der Colormap auf das refletierte licht (Bei Autolacken kann man sogar eine 2. Colormap verwenden) im normalfall sollte das refletierte lich alerdings der Lichtfarbe entsprechen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 05, 2007 13:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Nach langer Zeit habe ich es jetzt hinbekommen :)
Zuerst habe ich die 1. Möglichkeit versucht: Die Lichtquelle in den TangentSpace zu projezieren.
Da diese ja performanter ist, oder?
Egal, jedenfalls habe ich mit dem Artikel Derivation of the Tangent Space Matrix von Søren Dreijer und dem entsprechenden Tutorial (leider in C) auseinander gesetzt und es versucht zum laufen zu bringen.
Wie gesgt, versucht, hat aber net geklappt. Vielleicht lag es auch nur an meiner Übersetzung des C-Teils nach Pascal...

Dachte ich versuche es mal mit der normalen TBN Matrix statt der Inversen und nehme mich Möglichkeit Nr. 2 an:
Die Projection der BumpNormalen in den Objectspace.
Das hat dann auch irgendwann funktioniert. So lange Rede kurzer Sinn, meine eigentliche Frage:
Wenn das Licht von schräg hinten auf mein Quad scheint, ist es dann normal, dass auf meinem Quad trotzdem was zu sehen ist?
Bsp: Mein Quad liegt auf der x-y Ebene (also z=0) und das Licht kommt aus der Richtung (0.86, 0, -0.5) (also von hinten rechts). Trotzdem sehe ich die rechten Kanten der Steine meiner Mauer-Textur hell, obwohl sie eigentlich komplett dunkel (schwarz) sein müssten.

Ich habe mal die Exe hochgeladen.
(Hier ist es jetzt ein Würfel, aber das Problem ist dasselbe)
Die Lichtrichtung kann man mit der rechten Maustaste ändern (click & drag).

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 05, 2007 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zitat:
Wenn das Licht von schräg hinten auf mein Quad scheint, ist es dann normal, dass auf meinem Quad trotzdem was zu sehen ist?

Ja, weil es in der Normalmap auch Normalen gibt, die einen anderen Winkel zum Licht haben als die Fläche. Bei Steigungen kann die Normale z.B. 45° oder mehr zur Seite zeigen.
Wenn man Schatten verwendet, dann liegt diese Fläche aber sowieso im Schatten und das fällt nicht auf.
Ansonsten kann man die Z Komponente des Lichtvektors (im lokalen Tangentraum) benutzen um das Licht weich abzudunkel indem man z.B. mit clamp(lightvec.z*4,0,1) oder einem ähnlichen Faktor multipliziert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 05, 2007 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Danke.
Gut zu wissen, dass es nicht an meiner Implementation liegt :wink:

_________________
http://texelviews.delphigl.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.008s | 14 Queries | GZIP : On ]