Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Legend

Alter Hase

  • »Legend« ist der Autor dieses Themas

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

1

04.01.2016, 20:23

Wie OpenGL debuggen?

Hallo zusammen,

ich habe mich mal ein bisschen mit OpenGL beschäftigt, aber ich finde keine vernünftige Möglichkeit etwas zu debuggen. Im Moment sehe ich leider nur ein schwarzes Fenster, während derselbe Code (derselbe bis auf die API Aufrufe natürlich) mit DirectX funktioniert.

Was ich bisher ausprobiert habe:

- AMD CodeXL - da verhält sich mein Programm anders als ohne Debugger. Der scheint während des Debuggens beim Linken von Shadern auszusteigen, aber ich bekomme auch nicht raus warum.
- GLSL-Debugger - es scheint keine Binaries zum Download zu geben und die Sourcen bekomme ich nicht gebaut. Ein weiterer Fall in dem mich CMake so ganz und gar nicht überzeugt.
- Nvidia NSight - der stolpert über ein paar Aufrufe von älteren Funktionen, glVertexAttribPointer und Konsorten waren es wenn ich mich richtig erinnere. Wenn es da eh eine moderne Variante gibt, dann kann ich wohl auf diese umsteigen.
- apitrace - das funktioniert wenigstens und hat mir ein paar Probleme schon aufgezeigt. Aber es hat halt nicht alle Funktionen die ich benötigen würde.

Kennt jemand einen Debugger auf dem Niveau der graphischen Debugtools von Visual Studio, der auch funktioniert?
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

2

04.01.2016, 20:44

Hast du es schon einmal mit glGetError()​ versucht?
Es ist zwar kein Grafischer-Debugger, aber wenn OpenGL ein Fehler wirft kannst du den damit auslesen und drauf Reagieren.

Legend

Alter Hase

  • »Legend« ist der Autor dieses Themas

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

04.01.2016, 20:59

Ja, damit habe ich meinen Code ziemlich vollgepflastert. Als kleine Nebenfrage fände ich auch interessant wie man mit glGetError elegant umgehen kann. Und über GL_ARB_debug_output bekomme ich auch keine Meldungen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

04.01.2016, 21:05

NSight war bisher meine Wahl. Das versagte bei mir nur bei einer konkreten Funktion, die ich nur in exotischen Fällen wie dem bindlosen Clearen eines Rendertarget-MipLevels gebraucht habe. Die habe ich dann während des Debuggens halt auskommentiert. Ansonsten kann ich das Ding empfehlen. Hat viel Potential für richtig fiese Crashes bis hin zum "Bootet nicht mehr bis zur Stromtrennung", aber bis dahin ist es unglaublich wertvoll.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

5

04.01.2016, 21:08

Auch wenn ich glGetError kenne nutze ich es kaum.
Nach einer kurzes Google suche habe ich aber das hier gefunden.
Ich habe es nur überflogen, aber es schaut nützlich aus.

C-/C++-Quelltext

1
2
3
4
5
// check OpenGL error
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
    cerr << "OpenGL error: " << err << endl;
}

6

04.01.2016, 21:09

nSight ist das Beste was ich bisher finden konnte, möglicherweise ist aber Renderdoc von Crytek auch noch einen Blick wert.

Allerdings würde ich behaupten, dass wenn du den Fehler mit nSight nicht findest, dir auch kein anderer Debugger weiter helfen wird. Es gibt eben kein magisches Tool, was dir sagt, was du falsch machst und das wird es auch nie geben. Möglicherweise verwendest du die API ja nur auf eine Art falsch, auf die ein schwarzer Bildschirm genau das gewünschte Ergebnis ist.

Was ansonsten immer ganz gut geht, ist das Programm so weit zu vereinfachen bis man den Fehler isoliert hat. Notfalls halt eine kleine Testanwendung nur für dein Beispiel schreiben. Wenn du deinen Code einfach von DX portiert hast ist es gut möglich, dass eine ganze Menge falsch ist, möglicherweise ist es dann schneller, nochmal von Grund auf neu anzufangen und Zwischenschritte zu haben, an denen du sehen kannst, ob bisher alles richtig funktioniert.

Achja: glGetError solltest du ganz schnell wieder vergessen. Man bekommt kaum Informationen und weiß noch nichtmal, wo der Fehler auftritt, wenn man es nicht absolut überall benutzt. Das nette an einem grafischen Debugger ist ja unter anderem, das er sich um alles kümmert, was man mit GetError abfragen könnte, und zwar wesentlich einfacher und mit mehr Infos. Man könnte GetError möglicherweise rechtfertigen, um einem Endkunden irgendwie eine Fehlermeldung anzuzeigen, aber für alles was mit Debuggen zu tun hat, würde ich es nie benutzen.
Lieber dumm fragen, als dumm bleiben!

Legend

Alter Hase

  • »Legend« ist der Autor dieses Themas

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

04.01.2016, 21:25

Ich dachte bislang Renderdoc könnte nur DirectX, aber ich scheine da echt falsch zu liegen: https://github.com/baldurk/renderdoc/wiki/OpenGL Das ist schon mal gut zu wissen, danke!
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

04.01.2016, 21:48

Es gibt auch noch das hier: vogl von Valve. Demovideo:



Aber keine Ahnung wie ausgereift das inzwischen ist.

Legend

Alter Hase

  • »Legend« ist der Autor dieses Themas

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

05.01.2016, 20:56

Ich hab mein Programm für RenderDoc fit gemacht, d.h. ich hab mal auf das Core-Profile umgestellt. Für alle Fälle sollte mein Programm nun auch für NSight fit sein. Die problematischen Aufrufe waren doch glVertexPointer usw. und ich hätte wohl besser gleich glVertexAttribPointer benutzen sollen.

RenderDoc sieht jetzt auf jeden Fall schon mal vielversprechend aus.

Eine Sache ist nur etwas störend, zumindestens im Zusammenspiel mit glGetError: Irgendwo kommt ein GL_INVALID_ENUM ins Spiel, wenn man einen Frame captured. Ignoriert man dieses "Problem" bekommt man den Frame sauber gecaptured.

Edit: Und ich denke ich hab mein Problem gefunden, ich habe das Binding von Uniform Buffern komplett missverstanden. Ich hatte aber trotzdem einen drehenden Würfel hinbekommen - Glück oder Pech, je nachdem.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Legend« (05.01.2016, 22:02)


Werbeanzeige