2011-01-27 6 views
0

Я представляю частицы в 2D-игре. Каждая частица представляет собой квадрант (2 треугольника). Как сделать чертеж максимально быстрым? Все частицы имеют одинаковую текстуру, я только меняю ее позиции.OpenGL: оптимизация рендеринга квадроциклов

Теперь я использую вызов glVertexPointer и glDrawArrays для каждой частицы. Поэтому я каждый раз отправляю 4 вершины на GPU.

Есть ли другой подход, который может быть быстрее?

Я использую OpenGL ES 1.1 (iPhone)

Спасибо!

ответ

3

Каждый розыгрыш, который вы делаете (glDrawArrays), стоит дорого. Выполнение этого один раз на частицу является ОЧЕНЬ слишком часто. Все ваши частицы могут быть нарисованы с помощью одного вызова; просто установите большой массив всех треугольников verts и еще одного большого массива с текстурными коордами и вызовите glVertexPointer/glDrawArrays один раз - это сила glVertexPointer: произвольная геометрия того же типа в одном вызове. :)

Для того, что вы делаете, вы также должны смотреть в точечные спрайты (GL_POINTS), которые также функционируют как крошечные текстурированные квадрациклы. Они только 2D, поэтому вы не можете сопоставить текстуру с осью Z, но если ваши частицы снова и снова повторяются в 2D квадрах одной и той же текстуры, то спрайты спрайтов будут делать именно то, что вы хотите.

+0

Итак, чтобы вызвать glDrawArrays всего один раз, я должен добавить дополнительные вырожденные вершины? или я должен использовать GL_TRIANGLES? Я думаю, что любой из двух способов я бы использовал еще две вершины на частицу, не так ли? Это на 50% больше вершин, чем то, что я использую сейчас, будет ли все-таки быстрее? – Damian

+0

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

+0

Да, теперь я использую полоски. Сотрудник также говорит мне использовать glDrawElements для отправки меньше вершин (по четыре на квадрат), но я должен также отправить индексы ... как вы думаете, что может помочь? – Damian

0

Есть способ сделать это в одной рутине. Я ДУМАЮ, добавив дополнительную вершину после каждого квадрата, что совпадает с предыдущей вершиной, но я мог ошибаться.

РЕДАКТИРОВАТЬ: немного посмотрев на это, похоже, вам нужны два между ними; по существу один после, и один раньше. Он добавляет до нескольких дополнительных вершин, но по опыту я знаю, что он делает ОГРОМНУЮ положительную разницу на iPhone, чтобы сделать все это за одну операцию ничьей (мы рисовали текст из текстуры, по сути, одно и то же).

EDIT2: Также обратите внимание, что я имею в виду использование GL_TRIANGLE_STRIP - если вы использовали GL_TRIANGLES вместо этого, вам не нужны дополнительные вершины ... кроме того, вы будете делать такую ​​же сумму в любом случае, для повторения 2 для каждого второго треугольника.

Смежные вопросы