DGL
https://delphigl.com/forum/

diffuses bumpmapping
https://delphigl.com/forum/viewtopic.php?f=20&t=3981
Seite 1 von 1

Autor:  Kyro [ Mo Mär 28, 2005 19:24 ]
Betreff des Beitrags:  diffuses bumpmapping

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?

Autor:  Flash [ Mo Mär 28, 2005 22:43 ]
Betreff des Beitrags: 

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.

Autor:  LarsMiddendorf [ Mo Mär 28, 2005 22:53 ]
Betreff des Beitrags: 

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.

Autor:  Kyro [ Mo Mär 28, 2005 23:10 ]
Betreff des Beitrags: 

ä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?

Autor:  LarsMiddendorf [ Mo Mär 28, 2005 23:13 ]
Betreff des Beitrags: 

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.

Autor:  La Boda [ Di Mär 29, 2005 09:36 ]
Betreff des Beitrags: 

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.

Autor:  Kyro [ Di Mär 29, 2005 13:13 ]
Betreff des Beitrags: 

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...)

Autor:  LarsMiddendorf [ Di Mär 29, 2005 13:15 ]
Betreff des Beitrags: 

Man kann das Licht genau umgekehrt drehen wie das Objekt.

Autor:  Kyro [ Di Mär 29, 2005 13:42 ]
Betreff des Beitrags: 

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?

Autor:  LarsMiddendorf [ Di Mär 29, 2005 13:46 ]
Betreff des Beitrags: 

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.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/