Улучшение системы частиц OpenGL - PullRequest
4 голосов
/ 25 июля 2011

Я ищу способ улучшить производительность системы частиц, так как это очень дорого с точки зрения FPS.Это потому, что я вызываю:

glDrawElements(GL_TRIANGLE_STRIP, mNumberOfIndices,
          GL_UNSIGNED_SHORT, 0);

Я называю этот метод для каждой частицы в моем приложении (которая может быть между 1000 и 5000 частиц).Обратите внимание, что при увеличении до 1000 частиц мое приложение начинает падать в FPS.Я использую VBO: s, но производительность при вызове этого метода слишком высока.

Есть идеи, как я могу сделать систему частиц более эффективной?

Редактировать: Вот как моя частицаСистема рисования вещей:

glBindTexture(GL_TEXTURE_2D, textureObject);
glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer[0]);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vboTextureBuffer[0]);
glTexCoordPointer(2, GL_FLOAT, 0, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIndexBuffer[0]);

Vector3f partPos;

for (int i = 0; i < m_numParticles; i++) {
    partPos = m_particleList[i].m_pos;          
    glTranslatef(partPos.x, partPos.y, partPos.z);
    glDrawElements(GL_TRIANGLE_STRIP, mNumberOfIndices, 
        GL_UNSIGNED_SHORT, 0);
    gl.glTranslatef(-partPos.x, -partPos.y, -partPos.z);
}

Ответы [ 2 ]

6 голосов
/ 25 июля 2011

То, как вы это описываете, звучит так, как будто у вас есть собственный VBO для каждой частицы. Это не так, как это должно быть сделано. Поместите все частицы в один VBO и нарисуйте их все сразу, используя один вызов glDrawElements или glDrawArrays. Или даже лучше, если доступно: используйте инстансинг.

1 голос
/ 25 июля 2011

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

В противном случае, если ваше оборудование поддерживает рендеринг экземпляров (или, лучше, инстансированные массивы), вы можете сделать это, просто рендерив одну частицу n раз с данными позиции и texCoord, взятыми из соответствующих массивов для каждой частицы. Затем вам все равно нужно вычислить данные о четырех углах и данные texCoord в вершинном шейдере (при условии, что вы рисуете квад для каждой частицы), так как с экземплярами массивов вы получаете только один атрибут на экземпляр (частицу).

Вы также можете использовать геометрический шейдер для создания четырехугольника частицы и просто визуализировать набор из одной точки, но я предполагаю, что это может быть медленнее, чем создание экземпляров, учитывая, что оборудование SM4 / GL3, скорее всего, также будет поддерживать создание экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...