Блокировка экрана при использовании GL_ARRAY_BUFFER в симуляции - PullRequest
0 голосов
/ 01 декабря 2011

Я реализовал просмотрщик имитации мелких частиц, который отображает симуляции частиц. Аналогично ВМД. Поскольку я получил огромное количество частиц (> 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).

1 Ответ

1 голос
/ 01 декабря 2011

glBufferData (повторно) инициализирует целый новый объект буфера - точно так же, как glTexImage реинициализирует совершенно новую текстуру.

Используйте glBufferSubData для обновления содержимого без полного выделения объекта.

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