Пакетирование OpenGL и уникальность экземпляра - PullRequest
0 голосов
/ 21 марта 2012

Я работаю над улучшением производительности рендеринга OpenGL ES 2.0 путем введения пакетирования; в частности, создается RenderBatch, указывающий текстуру и шейдер (на данный момент) при создании. Это устанавливает состояние в VAO для обеспечения недорогого переключения состояний. Я начал реализацию, выглядящую примерно так:

batch = RenderBatch.new "SpriteSheet" "FlatShader"
batch.begin GL_TRIANGLE_STRIP
batch.addGeometry Geometry.newFromFile "Billboard"
batch.end

batch.render renderEngine

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

batch.addGeometry(Geometry.newFromFile("Billboard"), myObject.transform)

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

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

Существует ли более простой способ обработки такого рода преобразования существующих данных с использованием шейдеров, который не ограничивает заданную геометрию / модели и легко расширяется за счет использования карт нормалей, УФ-карт и других причудливых приемов? Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Мне кажется, что вы говорите о шейдере uniforms.Обычно вы устанавливаете данные и атрибуты вершин для каждого пакета в VBO и VAO.Затем в вашем методе рендеринга вы переключаетесь на правильный VAO и настраиваете форму шейдера.Они обычно включают в себя матрицу проекции модель-вид для преобразования вершин в пространство клипа, что обязательно изменит почти каждый кадр, правильную текстуру для использования и т. Д.

Это эффективно, потому что неизменяемые данные вершин хранятся вПамять GPU, VAO заботится о дешевом переключении состояний, и только формы, которые обычно часто меняются, отправляются в GPU при каждом вызове рендеринга.

Если вы пакетируете несколько объектов, которым требуются отдельные матрицы проекций представления модели, тогда у вас есть несколько вариантов:

  1. вы должны выполнить отдельный вызов отрисовки для каждой партии, для которой требуется отдельная матрица проекции вида модели

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

  3. необходимо преобразовать вершины с помощью ЦП иПополните VBO с обновленными данными

Первый встретилХод является предпочтительным решением, оно будет эффективным и простым.Медленная часть рендеринга большого количества вызовов отрисовки - это, как правило, передача данных из ЦП в графический процессор. Если у вас уже есть данные вершин в VBO, тогда издержки вызова отрисовки для объекта не будут иметь большого значения.Это также решает проблему предоставления различных униформ для объекта на основе свойств объекта.В каждом методе рендеринга объектов соответствующие свойства устанавливаются как униформа перед выполнением вызова отрисовки.Если для каждого объекта требуются разные данные, отправляемые в графический процессор, то как еще это может работать?

1 голос
/ 21 марта 2012

Это компромиссная ситуация.Затраты на изменение состояния из-за недостаточного пакетирования по сравнению с затратами на преобразование в ЦП.Единственного лучшего решения не существует, но оно зависит от того, какая часть вашей сцены статична, насколько динамична и как она устроена.

Распространенным решением является размещение статических объектов, преобразование которых относительно каждогодругие никогда не превращаются в один VBO или несколько VBO (если они используют разные текстуры, форматы вершин и т. д.), полностью преобразованные.Это делается один раз перед рендерингом.Не каждый кадр.Динамические объекты (игроки, монстры и т. Д.) Затем визуализируются индивидуально с преобразованием, выполненным в вершинном шейдере.

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

...