DGL
https://delphigl.com/forum/

Wieso funktioniert dies ?
https://delphigl.com/forum/viewtopic.php?f=20&t=11045
Seite 3 von 3

Autor:  mathias [ Mi Dez 18, 2013 00:36 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Wieso ist dies nur bei Position der Fall und bei Normal nicht ?

Autor:  damadmax [ Mi Dez 18, 2013 07:09 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Bei der Normalen interessiert nur die Rotation, die Translation in der 4. Spalte der Matrix wird nicht gebraucht. Deshalb wird mit mat3(xxx) der Rotationsteil 'herausgeschnitten' und auf die Normale angewendet.

Autor:  mathias [ Mi Dez 18, 2013 18:23 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Mein nächstes Problem, die Seiten des Würfels, welche eigentlich im Schatten sein müssten wird voll angeleuchtet. Ich dachte ich könnte diese Problem mit folgenden Befehlen lösen. Die Rückseite der Dreiecke wird nicht mehr gezeichnet, dies ist richtig, aber auf die Farbe hat es leider keine Einfluss.
Code:
  1.   glEnable(GL_CULL_FACE);
  2.   glCullface(GL_BACK);    

Autor:  glAwesome [ Mi Dez 18, 2013 18:31 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Dann zeigen die Normalen wahrscheinlich genau in die falsche Richtung. Also statt von ihr weg, zeigen sie zu der Lichtquelle hin. Wenn das Backface-Culling korrekt funktioniert, ist das schonmal gut. Vertausche mal bei der Berechnung der Normalen die Parameter des Kreuzproduktes bzw. negiere die Normalen.

Autor:  mathias [ Mi Dez 18, 2013 19:01 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Meinst du die Vorzeichen bei der Normalen vertauschen ?
Etwa so: Vector[i] := Vector[i] * -1;

Autor:  glAwesome [ Mi Dez 18, 2013 19:04 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Genau.

Autor:  mathias [ Mi Dez 18, 2013 22:50 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Woher kommt der helle Fleck oben auf dem Linken Würfel ?
Das Licht währe mit 10.0 ziemlich weit weg.

Folgende Werte habe ich im FragmentShader eingesetzt:
Code:
  1. float AmbientStrength = 0.3;
  2. float DiffuseStrength = 0.0;
  3. float SpecularStrength = 0.7;
  4. float Shininess = 0.8;
  5. vec3 LightPosition = vec3(10.0, 0.0, 0.0);  


Dateianhänge:
Zwischenablage-1.jpg
Zwischenablage-1.jpg [ 7.43 KiB | 11616-mal betrachtet ]

Autor:  damadmax [ Mi Dez 18, 2013 23:06 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Da
Zitat:
vec3 LightDirection = normalize(Position - LightPosition);

normalisiert wird, bringt es IMHO nichts das Licht weiter weg zu setzen. Deswegen heisst die Variable wohl auch LightDirection. :)

Poste uns doch mal die Werte, die du aktuell in deinen Vertex und Normal Arrays hast.

Autor:  mathias [ Do Dez 19, 2013 18:32 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Hier meine Daten des Würfels. Wen ich es richtig verstehe müssten diese richtig sein.
Code:
  1. Vectoren:
  2. x: -0,20  y: -0,20  z: -0,20       x: -0,20  y: -0,20  z:  0,20       x: -0,20  y:  0,20  z:  0,20  
  3. Normale:
  4. x: -1,00  y:  0,00  z:  0,00       x: -1,00  y:  0,00  z:  0,00       x: -1,00  y:  0,00  z:  0,00  
  5.  
  6. Vectoren:
  7. x:  0,20  y:  0,20  z: -0,20       x: -0,20  y: -0,20  z: -0,20       x: -0,20  y:  0,20  z: -0,20  
  8. Normale:
  9. x: -0,00  y:  0,00  z: -1,00       x: -0,00  y:  0,00  z: -1,00       x: -0,00  y:  0,00  z: -1,00  
  10.  
  11. Vectoren:
  12. x:  0,20  y: -0,20  z:  0,20       x: -0,20  y: -0,20  z: -0,20       x:  0,20  y: -0,20  z: -0,20  
  13. Normale:
  14. x:  0,00  y: -1,00  z: -0,00       x:  0,00  y: -1,00  z: -0,00       x:  0,00  y: -1,00  z: -0,00  
  15.  
  16. Vectoren:
  17. x:  0,20  y:  0,20  z: -0,20       x:  0,20  y: -0,20  z: -0,20       x: -0,20  y: -0,20  z: -0,20  
  18. Normale:
  19. x:  0,00  y: -0,00  z: -1,00       x:  0,00  y: -0,00  z: -1,00       x:  0,00  y: -0,00  z: -1,00  
  20.  
  21. Vectoren:
  22. x: -0,20  y: -0,20  z: -0,20       x: -0,20  y:  0,20  z:  0,20       x: -0,20  y:  0,20  z: -0,20  
  23. Normale:
  24. x: -1,00  y:  0,00  z:  0,00       x: -1,00  y:  0,00  z:  0,00       x: -1,00  y:  0,00  z:  0,00  
  25.  
  26. Vectoren:
  27. x:  0,20  y: -0,20  z:  0,20       x: -0,20  y: -0,20  z:  0,20       x: -0,20  y: -0,20  z: -0,20  
  28. Normale:
  29. x: -0,00  y: -1,00  z:  0,00       x: -0,00  y: -1,00  z:  0,00       x: -0,00  y: -1,00  z:  0,00  
  30.  
  31. Vectoren:
  32. x: -0,20  y:  0,20  z:  0,20       x: -0,20  y: -0,20  z:  0,20       x:  0,20  y: -0,20  z:  0,20  
  33. Normale:
  34. x:  0,00  y:  0,00  z:  1,00       x:  0,00  y:  0,00  z:  1,00       x:  0,00  y:  0,00  z:  1,00  
  35.  
  36. Vectoren:
  37. x:  0,20  y:  0,20  z:  0,20       x:  0,20  y: -0,20  z: -0,20       x:  0,20  y:  0,20  z: -0,20  
  38. Normale:
  39. x:  1,00  y:  0,00  z:  0,00       x:  1,00  y:  0,00  z:  0,00       x:  1,00  y:  0,00  z:  0,00  
  40.  
  41. Vectoren:
  42. x:  0,20  y: -0,20  z: -0,20       x:  0,20  y:  0,20  z:  0,20       x:  0,20  y: -0,20  z:  0,20  
  43. Normale:
  44. x:  1,00  y:  0,00  z:  0,00       x:  1,00  y:  0,00  z:  0,00       x:  1,00  y:  0,00  z:  0,00  
  45.  
  46. Vectoren:
  47. x:  0,20  y:  0,20  z:  0,20       x:  0,20  y:  0,20  z: -0,20       x: -0,20  y:  0,20  z: -0,20  
  48. Normale:
  49. x:  0,00  y:  1,00  z:  0,00       x:  0,00  y:  1,00  z:  0,00       x:  0,00  y:  1,00  z:  0,00  
  50.  
  51. Vectoren:
  52. x:  0,20  y:  0,20  z:  0,20       x: -0,20  y:  0,20  z: -0,20       x: -0,20  y:  0,20  z:  0,20  
  53. Normale:
  54. x:  0,00  y:  1,00  z:  0,00       x:  0,00  y:  1,00  z:  0,00       x:  0,00  y:  1,00  z:  0,00  
  55.  
  56. Vectoren:
  57. x:  0,20  y:  0,20  z:  0,20       x: -0,20  y:  0,20  z:  0,20       x:  0,20  y: -0,20  z:  0,20  
  58. Normale:
  59. x:  0,00  y:  0,00  z:  1,00       x:  0,00  y:  0,00  z:  1,00       x:  0,00  y:  0,00  z:  1,00  
  60.  

Autor:  glAwesome [ Do Dez 19, 2013 19:29 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Die Vertexdaten sehen gut aus.

Was mir allerdings gerade aufgefallen ist: Hiermit
Code:
  1. vec3 LightPosition = vec3(10.0, 0.0, 0.0);
setzt du die Lichtquelle nach rechts (es sei denn, deine Projektionsmatrix ist irgendwie invertiert). Auf dem Bild sieht es aber so aus, als würde das Licht von links scheinen. Da deine Normalen aber offenbar korrekt sind, setze mal hier ein Minus vor das dot():
Code:
  1. float DiffusePart = max(dot(NormalizedNormal, LightDirection), 0.0);

Autor:  mathias [ Do Dez 19, 2013 22:18 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Code:
  1. float DiffusePart = max(-dot(NormalizedNormal, LightDirection), 0.0);

Linker Würfel. Der Umfang bleibt gleich, nur die Seiten Links und Rechts verändern sich.

Autor:  mathias [ Mo Dez 23, 2013 21:32 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Mit dem Licht klappt es jetzt. :D

Code:
  1. #version 330
  2.  
  3. in vec3 Pos;
  4. in vec4 Color;
  5. in vec3 Normal;
  6.  
  7. out vec4 FragColor;
  8.  
  9. vec3 LightPosition = vec3(-2.0, 2.0, 0.0);
  10. float UmgebungsLicht = 0.1;
  11.  
  12. void main() {
  13.   LightPosition = (LightPosition * -1.0) - Pos;
  14.   float distance = length(LightPosition);
  15.   float diffuse = max(dot(Normal, LightPosition), UmgebungsLicht);
  16.   diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));
  17.   gl_FragColor = Color * diffuse;
  18. }

Autor:  mathias [ Di Okt 07, 2014 17:23 ]
Betreff des Beitrags:  Re: Wieso funktioniert dies ?

Ich habe die Ursache des Problemes im 1. Posting raus gefunden.

Der Auslöser war dieses Tutorial, dort werden Werte im Shader festgelegt.

Code:
  1. layout (location = 0) in vec3 inPosition;
  2. layout (location = 1) in vec3 inColor;


Den Pascal-Code, habe ich anhand des C-Code dieses Tutorial geschrieben.

Den Shader habe ich aus dem Forum genommen viewtopic.php?f=10&t=11037&start=15 5. Post auf der 2. Seite.

Man lernt immer mehr dazu. ;)

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