2009-03-06 5 views
3

Bisher habe ich nur glDrawArrays benutzt und würde gerne einen Indexpuffer und indizierte Dreiecke verwenden. Ich zeichne ein etwas kompliziertes Objekt mit Texturkoordinaten, Normalen und Vertexkoordinaten. All diese Daten werden in einem einzigen verschachtelten Eckpunktpufferspeicher gesammelt und gezeichnet Anrufe mit ähnlich ist (Unter der Annahme, alle Serup richtig gemacht):openGL glDrawElements mit interleaved buffers

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); 

Enthält diese ermöglichen m_indexData auch mit den Indizes meiner Normalen verschachtelt werden und Texturkoordinaten sowie das Standard-Positionsindexarray? Oder nimmt es eine einzelne lineare Liste von Fehlern an, die für das gesamte Eckpunktformat (POS, NOR, TEX) gelten? Wenn Letzteres wahr ist, wie ist es dann möglich, denselben Vertex mit verschiedenen Texturkoordinaten oder Normalen zu rendern?

Ich denke, diese Frage könnte auch umformuliert werden: wenn ich 3 separate indexierte Listen (POS, NOR, TEX) hätte, 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.

Antwort

5

Sie können unterschiedliche Indizes für die verschiedenen Listen nicht haben. Wenn Sie glArrayElement(3) angeben, wird OpenGL das dritte Element jeder Liste übernehmen.
Sie können mit dem von Ihnen angegebenen Zeiger spielen, da die Stelle in der Liste, auf die schließlich zugegriffen wird, im Wesentlichen der Zeigeroffset vom Anfang der Liste plus dem von Ihnen angegebenen Index ist. Dies ist nützlich, wenn Sie einen konstanten Abstand zwischen den Listen haben. wenn die Listen nur eine zufällige Permutation dann ist diese Art des Spiels für jeden Knoten sind wird wahrscheinlich als costy sein als nur mit einfachen alten glVertex3fv(), glNormal3fv() und glTexCoord3fv()

+1

Nur um zu bestätigen, die in glDrawElements verwendeten Indizes auf Ihre gesamte Vertex Format anwenden , jedes Mal, wenn ein Vertex auf diesem Netz auftritt, muss es die gleichen normalen und Texturkoordinaten haben? Ich frage, weil bestimmte 3D-Apps Modelle exportieren, bei denen eine gegebene Eckpunktposition unterschiedliche Normal- und Texturkoordinaten haben kann. – DavidG

+1

Wenn derselbe Eckpunkt in einem Netz mit zwei unterschiedlichen Sätzen von Normalen und Texturkoordinaten angezeigt werden soll, müssen Sie den Eckpunkt zweimal hinzufügen zu Arrays. Soweit es um OpenGL geht, handelt es sich um zwei verschiedene Eckpunkte. – shoosh

Verwandte Themen