Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Hallo, im Moment experimentiere ich gerade mit einigen Extensions, um den CPU-Overhead zu reduzieren und da bin ich jetzt bei GL_ARB_multi_draw_indirect gelandet. Bei dieser Extension lädt man beliebig viele auszuführende Rendercalls in einen Command-Buffer und frühstückt die anschließend alle mit einem einzigen glMultiDrawElementsIndirect ab. Dabei möchte ich die baseInstance auch auf andere Werte als 0 setzen. Deshalb fordere ich einen GL 4.2-Kontext an, da baseInstance laut OpenGL-Wiki sonst nicht funktioniert. Oder muss man das noch irgendwie explizit anschalten?
Hier der Code, mit dem ich den Command-Buffer erstelle:
Code:
void setupCommandBuffer()
{
// entweder 1 command mit 3 instances oder 3 commands mit jeweils 1 instance
Mein Problem ist nun, dass ich im Shader nicht an die baseInstance herankomme. Auf gl_InstanceID hat sie ja keinen Einfluss. Mit der Extension GL_ARB_shader_draw_parameters hätte ich im Vertexshader zwar Zugriff auf die Variable gl_BaseInstanceARB, jedoch möchte ich diese Extension nicht zwingend voraussetzen. Also habe ich mir überlegt, einen weiteren VBO mit den baseInstances anzulegen und diesen in das VAO einzubinden. Dabei verwende ich glVertexAttribDivisor, um das Vertexattribut einmal pro Instanz (statt pro Vertex) zu aktualisieren:
Eigentlich müssten als Ergebnis ein rotes, ein grünes und ein blaues Viereck nebeneinander zu sehen sein, unabhängig davon ob ich die Konstante allInOneCommand auf true oder false setze. Offenbar habe ich aber irgendwo einen Fehler drin, so dass inVboInstance im Vertexshader immer 0 ist und daher stets nur ein Viereck sichtbar ist.
Dateianhang:
So soll es aussehen (Bild ist durch Schummelei entstanden).png
Im Anhang ist schließlich noch der gesamte Code (~200 Zeilen). Ich hoffe jemand sieht, was ich falsch mache. Vielen Dank im Voraus!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Oh Mann. Natürlich. Vielen Dank für den Hinweis! Und natürlich sind alle drei Vierecke rot, wenn ich allInOneCommand auf false setze.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Mitglieder in diesem Forum: 0 Mitglieder und 91 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.