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

Aktuelle Zeit: So Jul 27, 2025 11:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: diffuses bumpmapping
BeitragVerfasst: Mo Mär 28, 2005 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
hab grad erst mit dem thema shader angefangen un wollt mir nen schönen per pixel lighter schreiben.
angefangen erstmal bei diffusem bumpmapping. funktioniert auch einwandfrei, allerdings wird das ganze generell immer
hell und dunkel (als wenn ich ambient permanent hoch bzw. runterschrauben würde) außerdem musste ich den lichtvektor etwas verdrehn weil x und y vertauscht waren!


Vertex Shader:
Code:
  1.  
  2.  
  3. varying vec4 lightvector;
  4. void main(void)
  5. {
  6.  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  7.  gl_TexCoord[0] = gl_MultiTexCoord0;
  8.  gl_FrontColor = gl_Color;
  9.  lightvector = vec4(gl_LightSource[0].position[1], gl_LightSource[0].position[0],
  10.                     gl_LightSource[0].position[2], gl_LightSource[0].position[3]);  // Vertauschen von X und Y, da fehlerhaft ?!
  11. }
  12.  


Fragment Shader:
Code:
  1.  
  2. varying vec4 lightvector;
  3. uniform sampler2D normalmap;
  4. uniform sampler2D texture;
  5.  
  6. void main(void)
  7. {
  8.  vec3 normal = texture2D(normalmap, gl_TexCoord[0]); // Farbwert der Normalmap als Normale abspeichern
  9.  lightvector = normalize(lightvector); // Lichtvektor normieren, da im vertexshader nicht möglich
  10.  float l = -dot(lightvector.xyz, normal); // abgleich der beiden normalen - hier muss der fehler liegen
  11.  gl_FragColor = l;// + texture2D(texture, gl_TexCoord[0]); // hab den rest mal ausgeschaltet damit man den effekt besser sieht
  12. }
  13.  


hier nochmal 3 bilder ums zu verdeutlichen:
http://www.minima.de/img1.jpg
http://www.minima.de/img2.jpg
http://www.minima.de/img3.jpg

die Z-Koordinate des lichts verändert sich natürlich nicht (statisch bei -1)
hat jemand ne ahnung warum das so sein könnte?

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 22:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich glaub ich weiß woran das liegt:

Unterteil mal dein großes Viereck in mehrere kleine Vierecke. Da die Helligkeit für die einzelnen Vertexe berechnet wird und anschließend interpoliert wird, hat die Positionsänderungen einfluss auf die Helligkeit. Wenn du noch mehr Vertexe hast wirst du sehen, dass sich ein lichtfleck über deine Fläche bewegt.

PS: Das Bumbmapping sieht klasse aus.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 22:53 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Der Fehler liegt an der Zeile:
Code:
  1. lightvector = vec4(gl_LightSource[0].position[1], gl_LightSource[0].position[0],
  2.                     gl_LightSource[0].position[2], gl_LightSource[0].position[3]);  

Der Lichtvektor ist der Vektor vom Licht zu dem Vertex. Du mußt also LightPosition-GL_Vertex rechnen.

Code:
  1. lightvector = gl_LightSource[0].position.xyz-gl_Vertex.xyz;


Die Sache mit dem Vertauschen kommt daher, dass die Normalen aus der Normalmap alle so berechnet werden, als wenn die Flächen auf der Z Ebene liegen und die Normale nach (0,0,1) zeigen würde. Wenn das nicht der Fall ist, muß man entweder jede Normale aus der Normalmap in den World Space transformieren oder eben den Lichtvektor umgekehrt. Dafür braucht man dann noch pro Vertex eben Tangente und Binormale, aus den Texturekoordinaten generiert. Diese Vektoren bilden zwei Zeilen von der Matrix und die Normale ist die dritte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 23:10 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
äh ich glaub ihr habt mich etwas missverstanden =)

das ganze soll sich wirklich nur diffus abspielen kein specular - un da wirds eben immer heller un dunkler =)
aber wo du schon mit tangent etc anfängst: gibts irgendwo einleuchtende (un am besten noch deutsche) tuts für
bump mapping in glslang? oder generell für "nützliche" shader?

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 28, 2005 23:13 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zitat:
das ganze soll sich wirklich nur diffus abspielen kein specular - un da wirds eben immer heller un dunkler =)

Aber nicht für alle Punkte gleich, was aber bei dir aber der Fall ist, weil alle Punkte des Lichts den gleichen lightvector bekomen. Beim specular nimmt man noch den Vektor von der Kamera zum Punkt hinzu.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 09:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Zufällgerweise hab ich genau das gleiche Problem selsbt gehabt, und erst nach einem wochenlangen (!) Kampf gelöst. Im Gegensatz zum Per-Pixel-Lighting brauchst du ein ganz anderes Koordinatensystem, wie es Lars schon angedeutet hat. Du benutzt hier noch den Object Space, aber die Normalen aus deiner Normalmap entsprechen nicht den Werten, die sie im Object Space aben sollten. Deshalb verwendet man in der professionellen Programmeirung den sog. Tangent Space. Dieses Koordinatensystem bezieht sich in jedem Vertex auf die Koordinaten der Texturen. Wenn du für jedes Vertex diesen Tangent Space hast (Formel hier ganz unten: http://www.paulsprojects.net/tutorials/simplebump/simplebump.html) dann transformierst du denn Lichtvektor und eigtl alle anderen Vektoren in dieses System, nimmst direkt die Normale aus der Normal Map und rechnest dann ganz normal weiter.
PS: Glaub mir, auch bei mir hat es bei allen Versuchen immer ein bissl nach BumpMappping ausgeschaut, aber im Endeffekt waren die Berechnungen fast immer falsch.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
ich bedanke mich nochmals un merks mir schonmal vor!

hab mich aber entschlossen das ganze doch etwas langsamer anzugehn (will mich erstma damit auskennen).
hab also mal mit normalem specular, diffuse und ambient angefangen. funktioniert alles absolut einwandfrei - bis ich anfang
das beleuchtete objekt zu drehn! dann dreht sich der lichtpunkt nämlich mit! hier nochmal die 2 neuen shader:

Vertexshader:
Code:
  1.  
  2. varying vec3 vertnormal;
  3. varying vec3 lightvec;
  4.  
  5. void main(void)
  6. {
  7.  vertnormal      = gl_Normal;
  8.  gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  9.  lightvec      = gl_Vertex.xyz - gl_LightSource[0].position;
  10.  gl_FrontColor   = gl_Color;
  11.  gl_TexCoord[0]  = gl_MultiTexCoord0;
  12. }
  13.  


Fragmentshader:
Code:
  1.  
  2. varying vec3 vertnormal;
  3. varying vec3 lightvec;
  4. uniform vec3 lightsize;
  5. uniform float specularintensity;
  6. uniform sampler2D texture0;
  7.  
  8. vec3 specular(int source)
  9. {
  10.  vec3 a = lightvec / lightsize;
  11.  vec3 lightdir = normalize(lightvec);
  12.  return clamp(specularintensity-dot(a, a), 0.0, specularintensity) * gl_LightSource[0].specular *
  13.         clamp(-dot(lightdir, vertnormal), 0.0, 1.0); // damit keine flächen beleuchtet werden, die nicht dem punkt zugewandt sind
  14. }
  15.  
  16. float diffuse(int source)
  17. {
  18.  vec3 lightdir = normalize(gl_LightSource[0].position.xyz);
  19.  return clamp(dot(lightdir, vertnormal), 0.0, 1.0) * gl_LightSource[source].diffuse; // vergleich der normalen etc. funktioniert einwandfrei
  20. }
  21.  
  22. void main(void)
  23. {
  24.  int i = 0;
  25.  vec3 spec     = vec3(0, 0, 0);
  26.  vec3 diff     = vec3(0, 0, 0);
  27.  vec3 ambient  = vec3(0, 0, 0);
  28.  spec    = spec + specular(0);
  29.  diff    = diff + diffuse(0);
  30.  ambient = ambient + gl_LightSource[0].ambient;
  31.  
  32.  gl_FragColor = vec4(diff + ambient + spec, 1) * texture2D(texture0, gl_TexCoord[0]);
  33. }
  34.  


wie muss ich das ganze umgestalten dasses auch bei ner rotation funktioniert?? hab schon versucht die normalen auch mit der matrix zu multipliziern, aber das stimmt irgendwie nicht... (ps: das licht kann ich rotieren, funktioniert einwandfrei, aber das objekt nicht...)

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 13:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man kann das Licht genau umgekehrt drehen wie das Objekt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
ja das hab ich auch schon gedacht, aber ich find das etwas sinnlos zumal was is wenn man mehrere objekte hat die alle anders gedreht sin?

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 29, 2005 13:46 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Dann muß man für jedes Objekt eine andere Lichtposition berechnen. Wenn jedes Objekt eine eigene Matrix, also ein eigenes Koordinatensystem hat, hat das Licht ja in dem System von dem Objekt aus gesehen immer eine andere Position. So teuer ist die Berechnung nicht. Man muß das ja nur einmal für jedes Objekt machen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]