2016-08-08 114 views
0

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.

+1

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. –

Antwort

0

Gibt es einen Befehl in OpenGL, um alle aktuellen Bindungen aufzulisten?

Nein. Wirklich, wie könnte es sein?

Viele Objekte sind an bestimmte Ziele für diesen bestimmten Objekttyp gebunden. Pufferobjekte allein haben ein Dutzend. Und Texturen sind nicht nur an ein Ziel gebunden, sie sind an eine Kombination aus Textureinheit und Ziel gebunden. Daher kann die Kombination von (Einheit 0, GL_TEXTURE2D) eine andere Textur gebunden haben als (Einheit 0, GL_TEXTURE3D). Und die Anzahl der Textureinheiten für moderne Hardware ist erforderlich zu mindestens 96 (16 pro Stufe * 6 Shader Stufen).

Es wäre nicht vernünftig, wenn eine einzige Funktion alle diese Informationen wiedergibt.

+0

Ich sehe Sie verstanden Ich möchte alle Bindungen sehen, aber ich möchte alle zuletzt aktivierten sehen, zum Beispiel, wenn ich glBindBuffer mit Puffer 1 verwendet, würde der Befehl mich zurückgeben 1. – user9589

+1

@ user9589: Vielleicht missverstehen Sie wie Ziele Arbeit. Wenn Sie einen Puffer an 'GL_ARRAY_BUFFER' und dann an' GL_PIXEL_UNPACK_BUFFER' binden, ist der an 'GL_ARRAY_BUFFER' gebundene Puffer * noch aktiv *.Es ist nicht weniger aktiv als das, das zum Pixel-Entpacken gebunden ist. So funktioniert das Objektmodell. –

+0

Können Sie einen Hinweis darauf empfehlen? Ich lese das Superbible, aber dort ist diese Information nicht sehr klar, aber eine sehr schwache Untertönigkeit. Mein Beitrag war auch ein Versuch, dies für mich klar zu machen, indem ich die aktuellen Bindungen beobachtete anstatt zu versuchen, über sie zu spekulieren. – user9589