Управление VAO / VBO — изменить все данные VBO

У меня есть VAO с 3 VBO, содержащие модель с вершинами, нормалями и координатами текстуры.

Я намерен менять все данные в этих VBO довольно часто, примерно с 500 мс до 20 мсек. Новая модель, загруженная в VBO, может иметь меньше или больше треугольников, чем предыдущая. Таким образом, размер буфера также изменится.

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

glBindVertexArray(*vao);

if (mesh->HasPositions()) {
glBindBuffer(GL_ARRAY_BUFFER, vbo_pos);
glBufferData(
GL_ARRAY_BUFFER,
3 * *point_count * sizeof (GLfloat),
points,
GL_DYNAMIC_DRAW
);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
free(points); // free our temporary memory
}
if (mesh->HasNormals()) {
glBindBuffer(GL_ARRAY_BUFFER, vbo_norm);
glBufferData(
GL_ARRAY_BUFFER,
3 * *point_count * sizeof (GLfloat),
normals,
GL_DYNAMIC_DRAW
);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(2);
free(normals); // free our temporary memory
}
if (mesh->HasTextureCoords(0)) {
glBindBuffer(GL_ARRAY_BUFFER, vbo_tex);
glBufferData(
GL_ARRAY_BUFFER,
2 * *point_count * sizeof (GLfloat),
texcoords,
GL_DYNAMIC_DRAW
);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(1);
free(texcoords); // free our temporary memory
}

РЕДАКТИРОВАТЬ:

Это текущее решение заключается в том, что чертеж не такой, каким он должен быть.

Если моя первая модель — большая (50 МБ), а я загружаю другую, немного меньшую (25 МБ), то часть предыдущей модели все еще нарисована.

Если первая модель — маленькая (25 МБ), а затем я изменил ее на большую (50 МБ), рисунок не изменяется (или, по крайней мере, кажется, что он не меняется). Если я зарядлю после еще меньшего (216 КБ), рисунок изменится (но часть все еще остается).

Итак, я полагаю, что-то не так с моим руководством VBO?

0

Решение

хорошо, я нашел проблему

Я обновлял данные vbo в потоке. Я не знал, что это не работает: /

0

Другие решения


По вопросам рекламы [email protected]