Я объединил все свои данные вершин для многих частиц в один массив. Как мне нарисовать все эти частицы таким образом, чтобы сохранить их уникальные переводы?
Я так запутался, как это сделать. Я уже создал два поста по этому вопросу, но все еще не понимаю. В настоящее время я использую OpenGL ES 1.1, но готов перейти на 2.0, если это означает, что я действительно могу выполнить пакетный рендеринг частиц с уникальными переводами, поворотами и т. д.
Два поста:
- OpenGL ES — пакетная обработка Визуализировать более 500 частиц с разными альфа-каналами, поворотами и масштабами?
- Как сделать Я рисую более 1000 частиц (с уникальным вращением, масштабом и альфой) в системе частиц iPhone OpenGL ES без замедления игры?
Оба объясняют высокоуровневый подход, но мне нужно знать, как визуализировать эту группу частиц, где перенос, вращение и масштаб каждой частицы будут меняться в каждом кадре. Если ваш ответ заключается в вычислении переводов на ЦП, то, пожалуйста, покажите пример этого.
В настоящее время я использую объекты массива вершин в своей реализации. Я понимаю, что я должен использовать VBO для лучшей производительности. Я буду реализовывать VBO, но сначала я хочу реализовать пакетную обработку. Как только я закончу успешное пакетирование, я заменю VAO на VBO. Следовательно, основное внимание в этом вопросе уделяется тому, как добиться этого с помощью VAO.
Вот мой код перед пакетной обработкой, где я помещал новую матрицу в матрицу представления модели, переводил, вращал, масштабировал и альфа-канал в соответствии с текущим визуализируемым Актером и рисовал вершины и textureCoords текущего визуализируемого Актера:
glPushMatrix();
glTranslatef(translation.x, translation.y, translation.z);
// rotation
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
// scale
glScalef(scale.x, scale.y, scale.z);
// color and alpha
glColor4f(1.0, 1.0, 1.0, alpha);
glVertexPointer(2, GL_FLOAT, 0, aSprite.vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texturedQuad.textureCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
Теперь, учитывая, что я объединил вершины и textureCoords всех Актеров частиц в пакетные массивы, я хотел бы поместить новую матрицу в матрицу представления модели и нарисовать вершины и textureCoords этих Актеров в их соответствующих перемещениях, поворотах, масштабах. , альфы и т.д.
Итак, я предполагаю, что это будет выглядеть примерно так:
static GLFloat verticesBatched[appropriate_length] = ...; // I have a method to populate this array based on the Actors to render
static GLFloat textureCoordsBatched[appropriate_length] = ...; // I have a method to populate this array based on the Actors to render
glPushMatrix();
// perform CPU matrix manipulation to manually translate, rotate, and scale all vertices
glVertexPointer(2, GL_FLOAT, 0, verticesBatched);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordsBatched);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
Правильным ответом является тот, который содержит пример кода, который ясно иллюстрирует решение этого вопроса.