Объекты буфера вершин в OpenGL 2.1 - PullRequest
7 голосов
/ 08 августа 2011

(я указал 2.1, потому что мой ноутбук не пройдет эту версию. Я, вероятно, сделал бы это в любом случае, начиная с 3.x, и включил шейдеры как обязательные?).

Благодаря Википедии: http://en.wikipedia.org/wiki/Vertex_Buffer_Object Я начинаю понимать, насколько просто можно использовать VBO (я все еще не уверен в IBO?). До сих пор я понял, что основной причиной их использования является повышение производительности, полученное благодаря тому, что данные теперь хранятся в видеопамяти.

Что я хотел бы знать, так это то, как я должен использовать их в практическом контексте. Например, все, что я видел, это настройка одного объекта буфера вершин и рисование одного треугольника или одного куба и т. Д. Что, если я хочу нарисовать 2 или более? Я устанавливаю новое VBO для каждой сущности, которую я хочу нарисовать? Или я волшебным образом добавляю некоторые статические VBO, которые я установил на ранней стадии?

Ответы [ 2 ]

5 голосов
/ 08 августа 2011

Это зависит, так как вопрос довольно широкий.

Использование одного VBO для атрибутов вершины и одного для индексов для каждой модели / объекта / сущности / сетки является прямым подходом.Вы можете извлечь выгоду из хранения всех моделей в одном VBO, так что вам не нужно слишком часто связывать буферы, но это приводит к другим проблемам, когда эти модели не настолько статичны.Кроме того, вы можете использовать несколько VBO для каждого объекта, может быть один для динамических данных и один для статических данных или один для данных геометрии (позиция ...) и один для данных, связанных с материалом (texCoords ...).

Использование одного VBO на объект может иметь свои (не) преимущества, а также использование одного огромного VBO может быть не очень хорошей идеей.Это зависит только от конкретного приложения и от того, насколько хорошо эти концепции вписываются в него.Но для начала, прямой подход VBO-per-object не так уж и плох.Только не используйте один VBO на треугольник;)

2 голосов
/ 08 августа 2011

Это должно быть действительно просто - просто добавьте больше данных в VBO.

Так, например, если вы хотите визуализировать 3 треугольника вместо 1, убедитесь, что вы отправили 9 вершин на glBufferData.Затем, чтобы отобразить все из них, используйте вызов glDrawArrays(GL_TRIANGLES, 0, 9); Это действительно должно быть так просто.

Однако, что касается IBO, то они на самом деле совсем не сильно отличаются от VBO, и я хотел быдействительно привыкнуть к их использованию.Это действительно практический способ использования VBO.Поскольку несколько треугольников обычно предназначены для покрытия одной и той же поверхности (например, кубу требуется двенадцать треугольников), использование только VBO вызывает многократное повторение при указании данных вершин.Благодаря использованию индексного буфера все становится еще более эффективным, поскольку любое повторение удаляется из VBO.Я нашел this , который дает краткий пример перехода от VBO-only к VBO / IBO, а также дает хорошее объяснение изменения.

...