DGL
https://delphigl.com/forum/

Normalmapping - Fragmentshader kompiliert nicht
https://delphigl.com/forum/viewtopic.php?f=20&t=10433
Seite 1 von 1

Autor:  OpenglerF [ Di Mai 15, 2012 21:16 ]
Betreff des Beitrags:  Normalmapping - Fragmentshader kompiliert nicht

Mein Normalmappingshader weigert sich momentan vehement, sich kompilieren zu lassen.
Das komische daran ist bloß, dass die ShaderInfo scheinbar leer ist.
Erst beim Linken kommt dann die Meldung: "fragmentinfo: fatal error C9999"

Der Quellcode:
Code:
  1. #version 120
  2.  
  3. uniform sampler2D Texture;
  4. uniform sampler2D NormalMap;
  5. uniform float TexNormalScale;
  6.  
  7. varying vec3 Normal;
  8. varying vec3 PixPos;
  9.  
  10. vec3 Mul(vec2 Vec, mat2x3 M)
  11. {
  12.     return vec3(Vec[0][0] * Vec.x + Vec[1][0] * Vec.y,
  13.                 Vec[0][1] * Vec.x + Vec[1][1] * Vec.y,
  14.                 Vec[0][2] * Vec.x + Vec[1][2] * Vec.y);
  15. }
  16. mat3 ComputeTBN(vec3 Normal, vec3 Position, vec2 TexCoords)
  17. {
  18.     vec3 EdgeFaceA = dFdx(Position);
  19.     vec3 EdgeFaceB = dFdy(Position);
  20.     vec2 UvEdgeA = dFdx(TexCoords);
  21.     vec2 UvEdgeB = dFdy(TexCoords);
  22.  
  23.     mat2x3 M = mat2x3(EdgeFaceA, EdgeFaceB);
  24.     vec3 Tangent = Mul(vec2(UvEdgeA.x, UvEdgeB.x), M);
  25.     vec3 Bitangent = Mul(vec2(UvEdgeA.y, UvEdgeB.y), M);
  26.  
  27.     float MaxL = max(length(Tangent), length(Bitangent));
  28.     return mat3(Tangent / MaxL, Bitangent / MaxL, Normal);
  29. }
  30.  
  31. void main()
  32. {
  33.     vec3 Shaded = vec3(gl_FrontMaterial.emission);
  34.     vec3 EyeVector = normalize(-PixPos);
  35.     vec3 Normal = normalize(Normal);
  36.     mat3 TBN = ComputeTBN(Normal, PixPos, gl_TexCoord[0].st);
  37.    
  38.     Normal = TBN * vec3(texture2D(NormalMap, gl_TexCoord[0].st) - 0.5f);
  39.  
  40.     int i;
  41.     for(i = 0; i < 2; i++)
  42.     {
  43.         vec3 LightDirection = normalize(vec3(gl_LightSource[i].position) - PixPos);
  44.         vec3 ReflectVector = normalize(reflect(-LightDirection, Normal));
  45.  
  46.         //Ambient
  47.         Shaded += vec3(gl_LightSource[i].ambient) * vec3(gl_FrontMaterial.ambient);
  48.         //Diffuse
  49.         Shaded += vec3(gl_LightSource[i].diffuse) * vec3(gl_FrontMaterial.diffuse) * max(dot(Normal, LightDirection), 0.0);
  50.         //Specular
  51.         Shaded += vec3(gl_LightSource[i].specular) * vec3(gl_FrontMaterial.specular) * pow(max(dot(ReflectVector, EyeVector), 0.0), gl_FrontMaterial.shininess);
  52.     }
  53.     gl_FragColor = vec4(Shaded, 1.0) * gl_Color * texture2D(Texture, gl_TexCoord[0].st);
  54. }


Ich hoffe ihr wisst Rat. :)

Autor:  Schläfer [ Mi Mai 16, 2012 15:51 ]
Betreff des Beitrags:  Re: Normalmapping - Fragmentshader kompiliert nicht

In Zeile 12 bis 14 benutzt du "Vec" als Matrix, sicherlich sollte das "M" gewesen sein.

Autor:  OpenglerF [ Do Mai 17, 2012 11:07 ]
Betreff des Beitrags:  Re: Normalmapping - Fragmentshader kompiliert nicht

Ahhhh!
Danke, da stand ich ja völlig auf dem Schlauch! :D

Kompiliert jetzt hervorragend, sieht allerdings eher mies aus.
Man sieht vor lauter grauem Geflimmer gar nichts. :?

Dateianhänge:
Dateikommentar: Bildfehler
Schach.png
Schach.png [ 217.57 KiB | 4766-mal betrachtet ]

Autor:  Coolcat [ Do Mai 17, 2012 11:37 ]
Betreff des Beitrags:  Re: Normalmapping - Fragmentshader kompiliert nicht

Ich vermute mal es liegt darin das du bei der Berechnung deiner TBN-Matrix nicht darauf achtest das alle Basisvektoren die Länge 1 haben und orthogonal zueinander liegen. Du willst schließlich die Normale nur rotieren, nicht skalieren oder scheren.

Des weiteren ist es eher schlecht das Tangente und Bitangente über die Ableitung der Texturkoordinaten zu berechnen. Damit hängt die Berechnung nämlich von der Kameraposition ab....je nach Kameraausrichtung bekommst du unterschiedliche Resultate. D.h. es könnte bei Kamerabewegungen flimmern.

Es empfiehlt sich die Tangente im voraus zu berechnen (etwa: http://www.terathon.com/code/tangent.html ) und pro Vertex zu speichern. Ggf. kann dein 3D-Modelingprogramm mit dem du deine Modelle erstellst sogar schon eine Tangente mit exportieren. Jedenfalls dann im Fragmentshader Normale und Tangente beide normalisieren und dann via Kreuzprodukt die Bitangente berechnen.

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