Как я использую OpenGL 3.x VBOs для рендеринга динамического мира?

Парсинг дерева средств управления в Windows Forms или WebForms (.NET Windows Forms / ASP.NET ).

9
задан jsimmons 13 November 2009 в 09:01
поделиться

3 ответа

Если весь ваш мир действительно динамичен, вы можете использовать флаг использования GL_STREAM_DRAW_ARB и сбрасывать данные в каждом кадре. Не пытайтесь манипулировать им, просто попытайтесь передать как можно эффективнее.

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

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

9
ответ дан 4 December 2019 в 09:13
поделиться

Short answer:

Use glMapBufferRange and only update the subrange that needs modification.

Long answer:

The trick is to map the already existing buffer with glMapBufferRange, and then only map the range you need. Given these assumptions:

  • Your geometry uses per-vertex animation morphing
  • The vertex count for models is constant during animation.

Then you can use glMapBufferRange to update only the changing parts, and leave the rest of the data alone. Full uploads using glBufferData are slow as a turtle, because they delete the old memory store and allocates a new one. That's in addition to uploading the new data. glMapBufferRange only lets you read/write existing data, it does no allocation or deallocation.

However, if you use skeleton animation, rather pass vertex transformations as 4x4 matrices per-vertex to the vertex shader, and do the calculations there. Per-vertex data is of course specified with glVertexAttribPointer.

Also, remember that you can read texture data in the vertex shader, and that OpenGL 3.1 introduced some new instance draw calls; glDrawArraysInstanced and glDrawElementsInstanced. Those combined can be used for instance-specific lookups. I.e you can do instance draw calls with the same geometry data bound, but send positions or whatever per-vertex data you need as textures or texture-arrays. This can save you from mixing and matching different vertex array data sets.

Imagine if you want to render 100 instances of the same model, but with different positions or color schemes. Or even texture maps.

9
ответ дан 4 December 2019 в 09:13
поделиться

Использование VBO не означает, что вы должны визуализировать всю сцену с помощью только одного вызова отрисовки. Вы по-прежнему можете выполнять несколько вызовов отрисовки и при этом настраивать различные матрицы преобразования.

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

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

5
ответ дан 4 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: