Управление VBO в OpenGL - PullRequest
       4

Управление VBO в OpenGL

1 голос
/ 08 февраля 2011

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

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

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

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

1 Ответ

3 голосов
/ 08 февраля 2011

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

Используйте некоторый класс для ссылки на смещение в 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) загруженным VBO, 2) загруженным материалам.Постоянно менять и выключать видеокарту очень дорого.Метод проб и ошибок - название игры (игра является Программированием).

...