Devo utilizzare un vertice buffer per mesh o posso archiviare più mesh in un vertice buffer? Se è così, dovrei farlo, e come lo farei?Più mesh in un vertice buffer?
risposta
È possibile memorizzare più mesh in un buffer di vertici. È possibile ottenere alcune prestazioni inserendo diverse piccole mesh in un buffer. Per mesh molto grandi è necessario utilizzare buffer separati. SetStreamSource
consente di specificare l'offset del buffer del vertice per la mesh corrente.
pRawDevice->SetStreamSource(0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride());
Con OpenGL è possibile utilizzare glVertexPointer()
per iniziare a disegnare da un certo offset all'interno del VBO. non sono sicuro di D3D.
TBH generalmente il motivo di metterli tutti in un unico grande buffer è di risparmiare sulle chiamate draw. Il costo di cambiare un buffer di vertici è abbastanza ridotto. Se riesci a unirli tutti in 1 vertice buffer e a rendere 10 oggetti in 1 call, allora sei in una grande vittoria.
Generalmente per unirli basta creare 1 grande vertex buffer con tutti i dati dei vertici, già trasformati in un mondo, uno dopo l'altro. Quindi si imposta un indice buffer che li rende uno dopo l'altro. Quindi devi disegnare tutto in un numero minimo di chiamate. Ovviamente se si sposta una cosa che richiede l'aggiornamento di una porzione del buffer dei vertici è per questo che è una situazione ideale per la geometria statica.
Se tutti gli oggetti sono uguali, verrà utilizzato solo 1 buffer di vertici (con 1 definizione di oggetto in esso) e 1 buffer di indice comunque? Le matrici spostano o animano l'oggetto ...
Se tutti gli oggetti sono diversi e si muovono/si animano, mi limiterò ad attaccare con singoli VB. Dubito che potresti notare alcuna differenza unendoli tutti insieme.
Beh, la mia esperienza è che non fa molta differenza purché i buffer non siano veramente piccoli o veramente enormi. Sospetto che qualsiasi inefficenza nella commutazione dei buffer sia compensata da un aumento dell'efficienza dando al guidatore più possibilità di gestire la memoria con buffer più piccoli.