4 Stimmen

openGL glDrawElements mit verschachtelten Puffern

Bisher habe ich nur glDrawArrays verwendet und würde gerne zu einem Indexpuffer und indizierten Dreiecken übergehen. Ich zeichne ein etwas kompliziertes Objekt mit Textur-Koordinaten, Normalen und Vertex-Koordinaten. Alle diese Daten werden in einem einzigen verschachtelten Vertex-Puffer gesammelt und mit Aufrufen ähnlich wie (vorausgesetzt, alle Serup ist richtig gemacht) gezeichnet:

glVertexPointer( 3, GL_FLOAT, 22, (char*)m_vertexData );
glNormalPointer( GL_SHORT, 22, (char*)m_vertexData+(12) );
glTexCoordPointer( 2, GL_SHORT, 22, (char*)m_vertexData+(18) );
glDrawElements(GL_TRIANGLES, m_numTriangles, GL_UNSIGNED_SHORT, m_indexData );

Erlaubt dies für m_indexData auch mit den Indizes meiner Normalen und Textur-Koordinaten sowie die standard-Position-Index-Array verschachtelt werden? Oder wird eine einzige lineare Liste von Indizes angenommen, die für das gesamte Vertex-Format (POS, NOR, TEX) gilt? Wenn Letzteres zutrifft, wie ist es dann möglich, denselben Scheitelpunkt mit unterschiedlichen Texturkoordinaten oder Normalen zu rendern?

Ich schätze, diese Frage könnte auch umformuliert werden in: wenn ich 3 getrennte indizierte Listen (POS, NOR, TEX) hatte, wo die letzteren 2 nicht neu angeordnet werden können, um die gleiche Indexliste wie die erste zu teilen, was ist der beste Weg, um das zu rendern.

5voto

shoosh Punkte 73374

Sie können keine unterschiedlichen Indizes für die verschiedenen Listen haben. Wenn Sie angeben glArrayElement(3) dann wird OpenGL das 3. Element einer jeden Liste nehmen.
Sie können mit dem von Ihnen angegebenen Zeiger spielen, da die Stelle in der Liste, auf die letztendlich zugegriffen wird, im Wesentlichen der Zeiger-Offset vom Anfang der Liste plus dem von Ihnen angegebenen Index ist. Dies ist nützlich, wenn Sie einen konstanten Offset zwischen den Listen haben. Wenn die Listen nur eine zufällige Permutation sind, dann wird diese Art von Spiel für jeden Scheitelpunkt wahrscheinlich genauso kostspielig sein wie die Verwendung der einfachen alten glVertex3fv() , glNormal3fv() y glTexCoord3fv()

0voto

Goombert Punkte 304

Ich habe ähnliche Probleme, wenn ich versuche, das Gleiche in Direct3D 9.0 zu tun.

Für meine OpenGL 3-Implementierung war es ziemlich einfach, und mein Quellcode ist online verfügbar, wenn es Ihnen helfen könnte... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems/OpenGL3/GL3model.cpp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X