Ich lerne OpenGL über das Superbible und Internet, und ein Konzept, das immer Probleme verursacht, ist das glBindxxx (Siehe zum Beispiel die angenommene Antwort Concept behind OpenGL's 'Bind' functions für ein typisches Problem mit Bindungen.)Wie bekomme ich alle aktuellen OpenGL-Bindings?
Sie können/müssen Buffer (glBindBuffer) binden, bevor Sie sie für glVertexAttribPointer setzen. Sie können/müssen den VAO (glBindVertexArray) binden, bevor Sie Ihren glVerteyAttribPointer setzen, und so weiter, mit einer nie endenden Kette von aktuellen Bindungsabhängigkeiten.
Manchmal, auch wenn Sie vergessen, etwas zu binden, könnte Ihr Programm noch funktionieren, wenn es einfach genug ist, aber ich habe viele Leute gesehen, die zu viel Zeit brauchen, um herauszufinden, dass die Ursache ihres Fehlers eine versteckte Bindung ist von.
Gibt es einen Befehl in OpenGL, um die letzte Bindung aufzulisten? Etwas ähnliches wie glGetAllBindings, und dies würde die letzte Schranke ID jeder glBindxxx Funktionen geben (eine kleine Liste von ihnen ist unten anhand von Superbible 6. Auflage)
glBindBuffer glBindBufferBase glBindFrameBuffer glBindImageTexture glBindProgramPipeline glBindSampler glBindTexture glBindTransformFeedback glBindVertexArray glBindVertexBuffer
beispielsweise durchgeführt, wenn ich einen glBindBuffer mit Puffer ID 1 als Parameter und dann wieder mit Puffer ID 2, glBindVertex Array mit ID 3 und dann glBindVertexArray mit ID 5 würde die Funktion 2 für glBindBuffer und 5 für glBindVertexArray zurückgeben.
Damit kann ich immer wissen, in welchem Kontext ich bin, bevor ich neue Einstellungen anwende.
Ich glaube, dies würde jedem, der Binding Probleme zu verstehen und zu debuggen enorm helfen.
Diese Bindungsprobleme können durch Verwendung von Direct State Access vollständig vermieden werden. Dies ist ein Kernmerkmal von GL 4.5 und wird seit Jahren von den proprietären Treibern von NVIDIA und AMD unterstützt. Mit DSA überlagern Sie keine vorherigen Bindungen, nur um den Zustand eines Objekts zu ändern. –