Checkliste Shader: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Checkliste bei Shaderproblemen)
 
 
(2 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 16: Zeile 16:
  
 
*'''Unterstützt die Grafikkarte überhaupt Shader?'''
 
*'''Unterstützt die Grafikkarte überhaupt Shader?'''
:Fragen Sie die OpenGL Version ab. Siehe [[glGetString]]
+
:Fragen Sie die OpenGL Version ab. Es wird mindestens OpenGL Version 2.0 oder 1.5 mit den Extensions, die [http://wiki.delphigl.com/index.php/Tutorial_glsl#Voraussetzungen hier] aufgelistet sind, benötigt. Siehe [[glGetString]]
  
 
==Problemspezifisches==
 
==Problemspezifisches==
Zeile 27: Zeile 27:
 
*'''Wurden die Uniforms erst gesetzt als der Shader gebunden war?'''
 
*'''Wurden die Uniforms erst gesetzt als der Shader gebunden war?'''
 
:Ein ''beliebter'' Fehler: Stellen Sie sicher dass Uniforms erst gesetzt werden nachdem der Shader gebunden war.
 
:Ein ''beliebter'' Fehler: Stellen Sie sicher dass Uniforms erst gesetzt werden nachdem der Shader gebunden war.
 +
 +
*'''Werden Vektortransformationen korrekt durchgeführt?'''
 +
:Will man einen vec3-Vektor mithilfe einer mat4-Matrix transformieren, so muss man ihn erst in einen vec4 umwandeln. Dabei sollte die w-Komponente den Wert 1.0 bekommen (Imitation von [[glVertex3f]]).
  
 
*'''Wird der Fragmentshader überhaupt ausgeführt?'''
 
*'''Wird der Fragmentshader überhaupt ausgeführt?'''
Zeile 35: Zeile 38:
 
  gl_FragColor = vec4(normal / 2.0 + 0.5, 1.0);
 
  gl_FragColor = vec4(normal / 2.0 + 0.5, 1.0);
  
 +
=== Texturierung ===
 
*'''Entspricht die Texturierung nicht den Erwartungen?'''
 
*'''Entspricht die Texturierung nicht den Erwartungen?'''
 
:Checken ob die Texturkoordinaten korrekt sind. Auch hier die Texturkoordinaten als Farbwert ausgeben lassen.
 
:Checken ob die Texturkoordinaten korrekt sind. Auch hier die Texturkoordinaten als Farbwert ausgeben lassen.
 +
 +
*'''Texturkoordinaten stimmen, trotzdem ist die Ausgabe nicht korrekt?''' / '''Texturen werden weiß'''
 +
:Die Uniform-Integer der Sampler für die Texturen müssen auf die ''Texturunit'' und nicht auf die ID des Texturobjektes gesetzt werden.

Aktuelle Version vom 1. März 2012, 10:37 Uhr

Verwendung der Checkliste

Die nachfolgende Checkliste sollte nach und nach abgearbeitet werden um einfache Fehler auszuschließen. Wenn ein Punkt mit ja beantwortet werden kann, kann man den nächsten Punkt angehen.

Die Grundlagen sollen ausschließen, dass Fehler existieren noch bevor der Shader ins Spiel kommt.

Grundlagen

  • Benutze ich eine funktionierende Programmgrundlage (Template)?
Wurde ein Template von DelphiGL.com benutzt, oder wurde das Template bereits erfolgreich getestet dann kann von einer Funktionierenden Programmgrundlage ausgegangen werden.
  • Funktioniert das Programm ohne Shader?
Kommentiere allen Shader Code aus, bzw. umgehe den Shadercode falls möglich und prüfe die Ausgabe um sicherzustellen, dass nicht andere Teile der Ausgabe den Fehler verursachen (z.B. Z-Buffer, Blending etc.)
  • Läuft das Programm ohne OpenGL-Fehler zu produzieren?
Benutzen sie einen Error-Handler wie er im "Tutorial_quickstart" beschrieben wird, um dies zu testen.
  • Unterstützt die Grafikkarte überhaupt Shader?
Fragen Sie die OpenGL Version ab. Es wird mindestens OpenGL Version 2.0 oder 1.5 mit den Extensions, die hier aufgelistet sind, benötigt. Siehe glGetString

Problemspezifisches

  • Funktioniert die Fehlerabfrage beim Shaderbau?
Bauen Sie versuchsweise etwas in den Shader ein, was Compilefehler verursachen muss und prüfen sie ob die Meldung entsprechend geloggt wird.
  • Läßt sich der Shader kompilieren?
Prüfen Sie, ob der Code wirklich korrekt an glShaderSource() übergeben wird (einfach einen Haltepunkt setzen).
  • Wurden die Uniforms erst gesetzt als der Shader gebunden war?
Ein beliebter Fehler: Stellen Sie sicher dass Uniforms erst gesetzt werden nachdem der Shader gebunden war.
  • Werden Vektortransformationen korrekt durchgeführt?
Will man einen vec3-Vektor mithilfe einer mat4-Matrix transformieren, so muss man ihn erst in einen vec4 umwandeln. Dabei sollte die w-Komponente den Wert 1.0 bekommen (Imitation von glVertex3f).
  • Wird der Fragmentshader überhaupt ausgeführt?
Den Fragmentshader einfach mal eine konstante Farbe (ungleich der Hintergrundfarbe) ausgeben lassen um zu sehen ob dieser überhaupt ausgeführt wird.
  • Entspricht die Ausgabe nicht den erwarteten Beleuchtungsergebnissen?
Checken ob die Normalen richtig sind. Dazu einfach im Fragmentshader die Normale als Farbe ausgeben. Die Farbe sollte sich je nach Ausrichtung einer Fläche zur Kamera ändern. Zur Kamera gewandte Flächen sollten bläulich erscheinen, da die Normale in Richtung der Z-Achse stehen müsste. Es ist oft einen Versuch Wert einfach mal das Vorzeichen der Normale umzukehren. Damit die Farben gut rauskommen kann dieser Codeschnipsel verwendet werden:
gl_FragColor = vec4(normal / 2.0 + 0.5, 1.0);

Texturierung

  • Entspricht die Texturierung nicht den Erwartungen?
Checken ob die Texturkoordinaten korrekt sind. Auch hier die Texturkoordinaten als Farbwert ausgeben lassen.
  • Texturkoordinaten stimmen, trotzdem ist die Ausgabe nicht korrekt? / Texturen werden weiß
Die Uniform-Integer der Sampler für die Texturen müssen auf die Texturunit und nicht auf die ID des Texturobjektes gesetzt werden.