Es gibt verschiedene Angebote von GPU-Anbietern wie AMDs CodeXL oder NVIDIAs nSight / Linux GFX-Debugger, die das Durchlaufen von Shadern ermöglichen, jedoch an die Hardware des jeweiligen Anbieters gebunden sind.
Lassen Sie mich bemerken, dass ich, obwohl sie unter Linux verfügbar sind, dort immer nur sehr wenig Erfolg hatte. Ich kann die Situation unter Windows nicht kommentieren.
Die Option, die ich kürzlich verwendet habe, besteht darin, meinen Shader-Code über zu modularisieren #includes
und den enthaltenen Code auf eine gemeinsame Teilmenge von GLSL und C ++ & glm zu beschränken .
Wenn ich auf ein Problem stoße, versuche ich, es auf einem anderen Gerät zu reproduzieren, um festzustellen, ob das Problem dasselbe ist, was auf einen logischen Fehler hinweist (anstelle eines Treiberproblems / undefinierten Verhaltens). Es besteht auch die Möglichkeit, dass falsche Daten an die GPU übergeben werden (z. B. durch falsch gebundene Puffer usw.). Dies schließe ich normalerweise aus, indem ich wie in cifz answer ein Debugging durchführe oder die Daten per Apitrace überprüfe .
Wenn es sich um einen logischen Fehler handelt, versuche ich, die Situation von der GPU auf der CPU wiederherzustellen, indem ich den enthaltenen Code auf der CPU mit denselben Daten aufrufe. Dann kann ich es auf CPU durchlaufen.
Aufbauend auf der Modularität des Codes können Sie auch versuchen, Unittest dafür zu schreiben und die Ergebnisse zwischen einem GPU-Lauf und einem CPU-Lauf zu vergleichen. Sie müssen sich jedoch bewusst sein, dass es Eckfälle gibt, in denen sich C ++ möglicherweise anders als GLSL verhält, sodass Sie bei diesen Vergleichen falsch positive Ergebnisse erhalten.
Wenn Sie das Problem nicht auf einem anderen Gerät reproduzieren können, können Sie nur herausfinden, woher der Unterschied stammt. Mit Unittests können Sie möglicherweise eingrenzen, wo dies geschieht. Am Ende müssen Sie jedoch möglicherweise zusätzliche Debug-Informationen vom Shader wie in cifz answer ausschreiben .
Und um Ihnen einen Überblick zu geben, hier ein Flussdiagramm meines Debugging-Prozesses:
Abgerundet wird dies hier durch eine Liste zufälliger Vor- und Nachteile:
Profi
- Schritt durch mit üblichen Debugger
- zusätzliche (oft bessere) Compiler-Diagnose
con