Shader-Code debuggen?

13

Ich schreibe eine Spiele-Engine und wenn ich eine perspektivische Kamera benutze, bekomme ich einen schwarzen Bildschirm. Ich werde nicht genau fragen, warum das so ist, weil es eine Menge Code zu teilen gibt, und ehrlich gesagt denke ich, dass das eine etwas bescheidene Frage ist, auch wenn es Sie alle stört.

Das Problem ist, dass ich nicht weiß, wie ich es debuggen soll. Alles, was sich ändert, ist meine Projektionsmatrix, und wenn meine Projektionsmatrix gut aussieht, weiß ich nicht, warum es nicht funktioniert. Idealerweise würde ich die Werte verschiedener Dinge ausdrucken, während der Shader seine Berechnungen durchführte, aber GLSL hat unbequemerweise keine printf () -Funktion.

Meine Frage lautet also: Wie kann ich mein Problem beheben? Das einzige, was ich mir vorstellen kann, ist, so viele Werte wie möglich clientseitig zu überprüfen und dann durch Permutation zu programmieren, aber das habe ich getan und bin nirgendwo hingekommen. Kann ich auf irgendeine Weise sehen, was auf der Grafikkarte passiert? Gibt es eine völlig andere Technik, die ich verwenden könnte?

Ich verwende GLSL-Version 420 (und Funktionen, die für diese Version spezifisch sind), sodass ich nicht denke, dass glslDevil eine Option ist, da es zuletzt im Jahr 2010 aktualisiert wurde.

BEARBEITEN

Ich konnte mein Problem durch ein völlig unabhängiges Debugging lösen.

Avi
quelle

Antworten:

2

Sie können auch ein Programm wie glIntercept verwenden, das wie PIX ist, aber dann für OpenGL. Neben dem Abfangen und Protokollieren aller Anrufe können Sie auch die Shader-Nutzung anzeigen und die Shader zur Laufzeit bearbeiten. Diese letzte Option (Bearbeiten der Shader zur Laufzeit) kann beim Debuggen äußerst hilfreich sein, da Sie die Bearbeitung in Teilen fortsetzen können, bis ein Fehler auftritt, und Sie einen Wert durch Ausgabe einer Farbe schnell debuggen können.

http://code.google.com/p/glintercept/

Roy T.
quelle
Das scheint nützlich zu sein. Ich werde testen, ob es mit GLSL 4.20 EDIT funktioniert: Aus einigen Gründen glaube ich nicht, dass es funktionieren wird. Es basiert auf vielen Eigenschaften von OpenGL, die veraltet sind und daher nicht in meinem Shader-Code vorkommen.
Avi
Schade, ich wusste nicht, dass es so alt ist. Es muss allerdings eine Art Debugger für GLSL4.2 geben. Ich werde herumfragen. In der Zwischenzeit könnte dies funktionieren? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.
Funktioniert nur für Cg-Shader: |
Avi
4

Obwohl ich nicht sicher bin, ob NVIDIA Nsight in der Lage sein sollte, Shader zu debuggen, denke ich zumindest, dass es GLSL in einer früheren Version (die Sie finden sollten) unterstützt. Die Integration mit Visual Studio ist ganz in Ordnung, ist nicht einfach, bietet aber eine Menge nützlicher Dinge, aber in den älteren Versionen brauchten Sie zwei Computer mit jeweils einer GPU, um Shader über ein Netzwerk zu debuggen (während die neueste Version "lokales" Debuggen zulässt). . Überprüfen Sie auch den Shader Designer [2], der eine nützliche IDE zu sein scheint (aber kein GLSL-Debugging bietet).

[1] http://developer.nvidia.com/content/nvidia-nsight-visual-studio-edition

[2] http://www.opengl.org/sdk/tools/ShaderDesigner/

Neenster
quelle
Beachten Sie, dass NSight Administratorrechte benötigt, um Shader tatsächlich zu debuggen.
Starbeamrainbowlabs
1

Leider ist das Debuggen von OpenGL nicht einfach. Hier sind Dinge, die ich nützlich fand:

  • benutze glGetError nach jedem Aufruf
  • versuchen Sie, die neue Debug-Erweiterung (ARB_debug _ ???) zu verwenden
  • Verwenden Sie gDebugger, um zu sehen, was nach jedem Aufruf auf dem Bildschirm angezeigt wird
  • Verwenden Sie apitrace, um zu sehen, was nach jedem opengl-Befehl passiert
  • Ändern Sie Ihren Shader, um basierend auf der aktuellen Eingabe unterschiedliche Farben auszugeben, und versuchen Sie zu verstehen, warum eine bestimmte Farbe angezeigt wird
  • Deaktivieren Sie alle OpenGL-Funktionen, die die Zeichenfunktionen einschränken: Scherentest, Tiefentest, Ausmerzen der Rückseite usw.
maul
quelle
1
Dies beantwortet meine Frage nicht wirklich. Dies ist hilfreich für das Debuggen von clientseitigen OpenGL-Aufrufen, nicht jedoch für das Debuggen der Shader-Programme. Ich kann clientseitige OpenGL-Aufrufe debuggen.
Avi
1

Persönlich benutze ich immer noch RenderMonkey. Für genau diese Frage ist es jedoch nicht ganz geeignet, da es sich nur um eine Fassade einer echten App handelt und daher einige merkwürdige Einschränkungen aufweist. Es gibt keinen Support mehr, aber ich habe nichts Besseres zum Debuggen von GLSL gefunden.

Rushyo
quelle
Ich bin mir nicht sicher, ob Rendermonkey das ist, was ich hier will, zumal Dinge wie die Kamerabewegung darauf beruhen, gl_ModelViewProjectionMatrix zu modifizieren, was ich nicht verwende.
Avi