2016-04-16 9 views
0

Normalerweise versuche ich mesh-spezifische Informationen (VBO/VAO) von instanzspezifischen Informationen (Transform, Uniformen, etc.) zu trennen.Wiederverwendung von VBO für Hardware-Instanziierung

Auf diese Weise müssen Teile des Codes, die Instanzinformationen manipulieren, nichts über VBOs/VAOs wissen und umgekehrt.

Allerdings habe ich in letzter Zeit begonnen, Hardware-Instanziierung mit glDrawInstanced zu verwenden, und die Tatsache, dass Instanzattribute im VAO miteinander verbunden sind, erschwert meine Trennung von Problemen.

Der Grund ist, dass in der Regel der VBO/VAO wurde von meinem .OBJ Loader (die alle notwendigen Informationen, um dies zu bauen) und dann andere Teile des Codes nur besorgt über Shader Uniformen konstruiert. Nun müssen diese Teile des Codes über die Struktur des VAO wissen, um die Informationen über ihre Instanzattribute anzuhängen.

Dies wird noch ärgerlicher, wenn ich VBOs habe, die für normales und instanziertes Rendering wiederverwendet werden können.

Gibt es einen empfohlenen Weg, der eine Trennung von Bedenken zwischen dem Festlegen von Netzattributen und Instanzattributen ermöglicht?

Ich dachte an zwei VAOs, eine für normales Rendering und eine andere für instanced Rendering, wo ich die zusätzlichen Instanz Attribute hinzufügen würde, aber ich fand keine Möglichkeit, die ursprünglichen VAO-Daten zu duplizieren oder zu überprüfen, so dass es scheint, dass meine Komponenten müssen die tatsächliche Struktur des VBO/VAO und nicht nur die Instanzparameter kennen.

+0

Erstellen Sie eine weitere Abstraktionsebene über Ihre Geometrie, die Daten in einer bestimmten Art und Weise erstellt und zeichnet (mit oder ohne Instanziierung). – Drop

+0

Ja, genau das wollte ich vermeiden ... Ich werde es letztendlich tun, wenn keine anderen Vorschläge auftauchen. – glopes

Antwort

0

Einen Weg gefunden, es zu tun!

Ich habe vergessen, dass Sie tatsächlich den Zustand eines VAO überprüfen können, indem Sie glGetVertexAttrib* verwenden. Dies ermöglicht meinen Instanzparametermanipulationsmodulen, tatsächlich einen neuen VAO zum Instanziieren und Rekonstruieren seiner Grundstruktur aus dem ursprünglichen Netz-VAO zu erzeugen und dann die zusätzlichen Attribute für die Instanziierungsparameter hinzuzufügen.

Auf diese Weise können sie unabhängig von der spezifischen Vertexstruktur des Netzes bleiben und müssen sich nur um die Struktur der Instanziierungsdaten kümmern.

Inspection geht ungefähr so:

std::vector<VertexAttrib> attribs; 
for (int i = 0; ; i++) 
{ 
    int enabled; 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled); 
    if (enabled == 0) break; 

    VertexAttrib attrib; 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &attrib.size); 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &attrib.stride); 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &attrib.type); 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &attrib.normalized); 
    attribs.push_back(attrib); 
} 

VertexAttrib meine eigene Struktur ist Zustände zu speichern introspected Eckpunktattributtransformation.

Sobald ich die Liste der introspected Staaten habe, ich nur erstellen und binden meine neue VAO und setzen Sie seinen Zustand der gleiche der ursprünglichen VAO sein. Dann fange ich an, die zusätzlichen Attribute für die Hardware-Instanziierung hinzuzufügen. Dies hat auch den Vorteil, dass ich diesen neuen VAO an den ursprünglichen VBO binden und exakt dieselben Mesh-Daten wiederverwenden kann.

Dann läuft alles wie bei der normalen Instanting-Pipeline. Wenn ich das Modell ohne Instanziierung zeichnen muss, kann ich auch den ursprünglichen VAO binden.