Muss ich einen Vertex-Puffer pro Mesh verwenden, oder kann ich mehrere Meshes in einem Vertex-Puffer speichern? Wenn ja, sollte ich es tun und wie würde ich es tun?Mehrere Meshes in einem Vertex-Puffer?
Antwort
Sie können mehrere Meshes in einem Vertex-Puffer speichern. Sie können etwas Leistung erzielen, indem Sie mehrere kleine Netze in einen Puffer einfügen. Für wirklich große Netze sollten Sie separate Puffer verwenden. SetStreamSource
können Sie den Vertexpuffer Offset für Ihr aktuelles Mesh angeben.
pRawDevice->SetStreamSource(0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride());
Mit OpenGL können Sie glVertexPointer()
verwenden, um ab einem bestimmten Offset innerhalb des VBO zu zeichnen. nicht sicher über D3D.
TBH im Allgemeinen der Grund, sie alle in einen großen Puffer zu setzen, ist, auf Zeichnungsaufrufen zu sparen. Die Kosten für das Wechseln eines Vertexpuffers sind ziemlich gering. Wenn Sie sie alle in einen Vertex-Puffer zusammenführen und 10 Objekte in einem Zeichnungsaufruf rendern können, dann sind Sie auf einem großen Gewinn.
Normalerweise, um sie zusammenzuführen, erstellen Sie einfach einen großen Vertex-Puffer mit allen Vertex-Daten, die bereits in der Welt transformiert sind, nacheinander. Sie richten dann einen Indexpuffer ein, der sie nacheinander rendert. Sie haben dann alle Zeichen in minimalen Zeichenaufrufen. Natürlich, wenn Sie eine Sache verschieben, die einen Teil des Vertexpuffers aktualisieren muss, ist dies eine ideale Situation für statische Geometrie.
Wenn alle Objekte identisch sind, werden Sie nur 1 Vertex-Puffer (mit 1 Objektdefinition darin) und 1 Indexpuffer verwenden, oder? Matrizen bewegen oder animieren das Objekt ...
Wenn alle Objekte unterschiedlich sind und sich bewegen/animieren dann würde ich einfach bei einzelnen VBs bleiben. Ich bezweifle, dass du einen Unterschied bemerken würdest, wenn du sie alle zusammenfügst.
Nun, meine Erfahrung ist, dass es nicht so viel Unterschied macht, solange Ihre Puffer nicht wirklich klein oder wirklich riesig sind. Ich vermute, dass eine Ineffizienz bei Switching-Puffern mit einer Erhöhung der Effizienz einhergehen würde, indem der Treiber mehr Möglichkeiten erhält, seinen Speicher mit kleineren Puffern zu verwalten.