Как мне использовать объекты Vertex Buffer для визуализации множества различных окружностей?

StackOverflow https://stackoverflow.com/questions/1484572

  •  18-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать игру, в которой задействовано много кругов (ну, фанаты Triangle, но идею вы уловили).Каждый круг будет иметь положение x, положение y и свойство массы.Свойство массы каждого круга будет отличаться.Кроме того, я хочу по-разному раскрасить некоторые группы кругов, сохранив прозрачный центр круга и став непрозрачным по периметру кругов.

Мне сказали использовать VBO, и я весь день Гуглил.Я хотел бы получить полный пример того, как я бы нарисовал эти круги, и объяснение того, как работают VBO, сохраняя при этом это объяснение простым.

Это было полезно?

Решение

Я сам еще не внедрил VBO, но, насколько я понимаю, они работают аналогично текстурным объектам.На самом деле, когда я напоминаю себе и объясняю другим, что такое VBO, мне нравится неправильно называйте текстурные объекты "объектами буфера текстуры", чтобы усилить концептуальное сходство.

(Не смешивать с буферные текстуры из указанного NVIDIA расширения GL_EXT_texture_buffer_object Объект GL_EXT_texture_buffer_object.)

Так что давайте подумаем:что такое текстурные объекты?Это объекты, которые вы создаете с помощью glGenTextures(). glGenBuffersARB() делает то же самое.Применима аналогия с glBindTexture() и glBindBufferARB().

(Начиная с OpenGL 1.5, функции glGenBuffers() и glBindBuffer() вошли в ядро OpenGL, так что вы можете использовать их вместо эквивалентов расширений.)

Но что именно представляют собой эти "текстурные объекты" и что они делают?Что ж, учтите, что вы действительно можете использовать glTexture2D() в каждом кадре необходимо настроить текстуру.Текстурные объекты служат только для уменьшения трафика между графическим процессором и основной памятью;вместо отправки всего массива пикселей вы отправляете только "имя OpenGL". (то есть целочисленный идентификатор) объекта текстуры, который, как вы знаете, является статичным.

VBO служат аналогичной цели.Вместо того чтобы отправлять массив вершин снова и снова, вы загружаете массив один раз, используя glBufferData() а затем отправьте просто "OpenGL name" объекта.Они отлично подходят для статических объектов и не так хороши для динамических.Фактически, многие универсальные 3D-движки, такие как Ogre3D, предоставляют вам способ указать, является ли сетка динамической или статической, вполне вероятно, для того, чтобы вы могли выбирать между VBO и массивами вершин.

Для ваших целей VBO являются не правильный ответ.Вам нужно множество простых объектов, которые постоянно трансформируются и изменяются.Под простыми я подразумеваю те, у которых меньше 200 вершин.Если вы не собираетесь писать очень умный и сложный вершинный шейдер, VBO не для тебя.Вы хотите использовать массивы вершин, которыми вы можете легко управлять с основного процессора и обновлять их каждый кадр, не выполняя специальных вызовов видеокарты для повторной загрузки всего VBO на видеокарту (что может оказаться медленнее, чем просто отправка массивов вершин).

Вот неплохая "справочная страница" letscallit от nVidia о VBO API.Прочтите это для получения дополнительной информации!

Другие советы

хороший учебник по vbo

То, что вы делаете, выглядит как частицы, возможно, вы захотите на всякий случай поискать в Google "рендеринг частиц".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top