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

Aktuelle Zeit: Sa Jul 19, 2025 16:21

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Mai 15, 2012 21:16 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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. :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 16, 2012 15:51 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
In Zeile 12 bis 14 benutzt du "Vec" als Matrix, sicherlich sollte das "M" gewesen sein.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 17, 2012 11:07 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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 | 4760-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 17, 2012 11:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.010s | 18 Queries | GZIP : On ]