2011-02-08 4 views
1

У меня есть разные модели, которые я хочу отобразить в OpenGL. Каждая модель имеет разные вершины и индексы.vbo management in opengl

Какова наилучшая практика, которой я должен следовать при рендеринге этих моделей с помощью vbo? Должен ли я сделать VBO для каждой модели, чтобы сделать это? Я читал, что использование нескольких небольших VBO будет большим хитом производительности, а также использованием нескольких больших VBOs.

Например: у меня есть коробка и автомобиль рядом с ним, где коробка имеет 8 вершин, а автомобиль - 2000 вершин, что совершенно другое число. У меня разные модели, и они могут иногда исчезать, а это значит, что эти модели следует удалить из буфера на стороне сервера. Как я могу это сделать ?

Возможно, кто-то может направить меня к статье, которая очищает эту путаницу и показывает хороший способ справиться с моей ситуацией.

ответ

3

Я хотел бы поиграть и найти размер буфера, который хорошо подходит для вас, и объединить ваши данные Vert в VBOs, если это возможно. Ваше целевое оборудование действительно то, что будет диктовать это, поэтому лучше всего поиграть с разными номерами.

Используйте некоторый класс для ссылки на смещение в VBO, которое ваша модель должна использовать для рендеринга. Например, у вас есть коробка и автомобиль.

class MeshManager 
{ 
public: 
    int loadMesh(const Mesh * mesh) 
    { 
     //load the mesh 
     //Add it to some current VBO or manage the creation of VBOs better. 
     ManagedMesh managedMesh(theVao, theVbo, theOffset, theLength, theType, theIdentifier); 
     theIdentifier++; 
    } 
private: 
    std::map<std::string, ManagedMesh> meshMap; 
    int theIdentifier; 
} 

class Renderer 
{ 
public: 
    void render(int meshId, Vector3f translation, Vector3f rotation); 
} 

int main(int argc, char** argv) 
{ 
MeshManager meshManager; 
Model model("mymodel.obj"); 
const Mesh * meshes = model.getMeshes(); 
int meshCount = model.getMeshCount(); 
for(int i=0; i<meshCount; i++) 
{ 
    meshManager.loadMesh(mesh); 
} 
model.freeMeshes(); 
} 

что-то в этом роде. Очевидно, что я не храню те загруженные идентификаторы сетки, но думаю, что вы получите картину. Я не эксперт, но это примерный пример того, как я буду заниматься этим. Также не забудьте попробовать и пакетное рендеринг как можно больше. Сортируйте рендеринг на 1) необходимые вам VBOs 2) материалы, которые вам нужно загрузить. Обмен данными с графическим процессором постоянно и очень дорого. Пробная версия и ошибка - это название игры (игра - программирование).