Я работаю над улучшением производительности рендеринга 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)
Это решает проблему масштабирования, перемещения и поворота вершин, но делает это, сначала просматривая информацию о вершинах, преобразовывая ее с помощью матрицы преобразования, а затем вставляя ее в данные пакета. Хотя это работает, оно кажется неэффективным; он интенсивно использует процессор и не использует возможности преобразования графического процессора. Тем не менее, это работает, так что не так уж важно. (Хотя было бы неплохо иметь лучший способ сделать это)
Однако я наткнулся на контрольно-пропускной пункт: координаты текстуры, возможно, также должны быть разными для каждого экземпляра, а это значит, что мне нужно будет передать матрицу преобразования текстуры, и теперь это выглядит странно.
Существует ли более простой способ обработки такого рода преобразования существующих данных с использованием шейдеров, который не ограничивает заданную геометрию / модели и легко расширяется за счет использования карт нормалей, УФ-карт и других причудливых приемов? Спасибо!