Я реализовал просмотрщик имитации мелких частиц, который отображает симуляции частиц. Аналогично ВМД.
Поскольку я получил огромное количество частиц (> 80000), я использую GL_ARRAY_BUFFER и GL_POINTS для их отображения. Это хорошо работает с небольшими наборами данных.
На каждом временном шаге я заполняю новые позиции частиц, используя следующий код:
void displayPoints(Timestep t) {
int elements = t.elements;
unsigned int glbuffersize = elements*sizeof(float4);
glBindBuffer(GL_ARRAY_BUFFER,positionsVBO);
glBufferData(GL_ARRAY_BUFFER,glbuffersize,t.pos,GL_DYNAMIC_DRAW);
glVertexAttribPointer(shaderAtribute,4,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(shaderAtribute);
glBindBuffer(GL_ARRAY_BUFFER,positionsVBO);
glUseProgram(shaderProgram);
glDrawArrays(GL_POINTS, 0, elements);
}
t.pos - это просто простой массив структуры float4.
Если я запускаю это сейчас с моим набором тестов 600 МБ с> 80000 точками на шаге, дисплей блокируется после первых 20-50 кадров. Мне нужно подождать 2 минуты, пока я не увижу программу, которая снова будет работать в течение 10 кадров, пока она снова не зависнет.
Я подозреваю, что приведенный выше код может заполнить графическую память. Есть ли лучший способ просто сделать эту анимацию?
Если вы хотите взглянуть на полный код, он представлен здесь: https://github.com/moeeeep/opengl_dataviewer
(В настоящее время шейдеры жестко запрограммированы на мои машины, так как у меня еще не было времени исправить файл CMake).