OpenGL обновляет части VBO (облако точек)

У меня есть клиент UDP для чтения точек с сервера, который генерирует точки в 4 мсек, и каждый пакет имеет около 3000 точек. Я читаю эти точки и сопоставляю их с матрицей с 1 миллионом элементов координат. (Я создаю хеш-таблицу из потоковых точек с фиксированными ключами. Я имею в виду, что вы можете думать о 1000 ключах, и каждый ключ имеет максимум 1000 точек, но он варьируется. После заполнения этой таблицы любое новое значение, которое я получаю с сервера, сопоставьте с моими ключами в отсортированный способ, я имею в виду, я сначала обновил точки в меньших ключах и …: D

Мне действительно стыдно, я не могу этого сделать, мой ЖК-дисплей с разрешением 1990х1080 пикселей делает это так быстро, как я! : — ((

Я хочу вставить это в VBO, а затем обновить каждую ключевую часть в 30 мс.

поэтому я хочу создать 1000 VBOS для рисования и 1000 VBOS для буферизации, и после каждой итерации 33 мс я меняю 50 VBOS для рисования с буферизацией. каждый vbo имеет максимум 0f 1000 точек и цветов, а количество точек в одном VBO изменяется с 10 на 1000;

моя проблема начинается здесь, я не понимаю, как работает VBO и лучшее решение для реализации этой проблемы? : D

1- мой первый вопрос: почему я создаю VAO и как он связан с буферами нового поколения?
его выглядит как связанный с точно следующим glGenBuffer (), верно? но в любом примере, который я прочитал, я не вижу никакого использования этого указателя (просто использовать для рисования)? это мой код для создания VBO я скачал откуда-то

glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);

// First see if the vertex array buffer has been created...
if(uiVertexArray == 0) {    // Nope, we need to create it
glGenBuffers(1, &uiVertexArray);
glBindBuffer(GL_ARRAY_BUFFER, uiVertexArray);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * nNumVerts, NULL, GL_DYNAMIC_DRAW);
}

// Now see if it's already mapped, if not, map it
if(pVerts == NULL) {
glBindBuffer(GL_ARRAY_BUFFER, uiVertexArray);
pVerts = (M3DVector3f *)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}

// Ignore if we go past the end, keeps things from blowing up
if(nVertsBuilding >= nNumVerts)
return;

// Copy it in...
pVerts[nVertsBuilding][0] = x;
pVerts[nVertsBuilding][1] = y;
pVerts[nVertsBuilding][2] = z;
nVertsBuilding++;

для отображения цвета и текстуры это выглядит так. которая имеет лучшую производительность (GL_DYNAMIC_DRAW, GL_STREAM_DRAW)

2- это функция отрисовки? зачем использовать последнюю строку? для создания следующих VBO и VAO?

// Set up the vertex array object
glBindVertexArray(vertexArrayObject);
glDrawArrays(primitiveType, 0, nNumVerts);
glBindVertexArray(0);

3 — в следующий раз, когда я хочу изменить буферизованное содержимое VBO новыми точками, я должен сделать это снова для разного количества точек, и если я сделаю это, я должен удалить последний буфер VBO или нет?

// Vertex buffer objects
if(uiVertexArray != 0)
glDeleteBuffers(1, &uiVertexArray);

4- Могу ли я изменить размеры моих VBO и не использовать воссоздать буфер VBO?

5- Как скопировать данные из буфера VBO для рисования VBO?

это мои буферы подкачки с отрисовкой VBO в основной функции отрисовки, я воссоздаю данные VBO сначала из функции подкачки

for(int i=0; i<1000; i++)
if(must_show_buffer(i))
{
bufferVBO[i].draw();
drawedVBO[i].swap(bufferVBO[i]);
}
else drawedVBO[i].draw();

ОБНОВИТЬ:

Я использую эти функции для обмена данными:
if (batch-> cVerts! = NULL)
{
CopyVertexData3f (batch-> cVerts);
CopyColorData4f (batch-> cColors);
}
Конец();

void GLBatch::CopyColorData4f(M3DVector4f *vColors)
{
// First time, create the buffer object, allocate the space
if(uiColorArray == 0) {
glGenBuffers(1, &uiColorArray);
glBindBuffer(GL_ARRAY_BUFFER, uiColorArray);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * nNumVerts, vColors, GL_DYNAMIC_DRAW);
}
else {  // Just bind to existing object
glBindBuffer(GL_ARRAY_BUFFER, uiColorArray);

// Copy the data in
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 4 * nNumVerts, vColors);
pColors = NULL;
}
}

этот подход работает правильно, но glBufferSubData так быстро увеличивает использование памяти, и я получаю исключение памяти

и этот подход

    if(batch->uiVertexArray != NULL)
{
// First time, create the buffer object, allocate the space
if(uiVertexArray == 0) {
glGenBuffers(1, &uiVertexArray);
glBindBuffer(GL_ARRAY_BUFFER, uiVertexArray);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * nNumVerts, NULL, GL_DYNAMIC_DRAW);
}

// Fast copy data
glBindBuffer(GL_COPY_READ_BUFFER, batch->uiVertexArray);
glBindBuffer(GL_COPY_WRITE_BUFFER, uiVertexArray);
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, nNumVerts);
glBindBuffer(GL_COPY_READ_BUFFER, 0);
glBindBuffer(GL_COPY_WRITE_BUFFER, 0);

//copy color data
if(uiColorArray == 0) {
glGenBuffers(1, &uiColorArray);
glBindBuffer(GL_ARRAY_BUFFER, uiColorArray);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * nNumVerts, NULL, GL_DYNAMIC_DRAW);
}

glBindBuffer(GL_COPY_READ_BUFFER, batch->uiColorArray);
glBindBuffer(GL_COPY_WRITE_BUFFER, uiColorArray);
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, nNumVerts);
glBindBuffer(GL_COPY_READ_BUFFER, 0);
glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
}

без проблем с выделением памяти, но не очищает до точек

что мне не хватает в каждой реализации?

1

Решение

  1. VBO связаны с текущим связанным VAO во время glVertexAttribPointer

  2. Хорошая практика — отсоединение буферов, помните, что состояние связывания является глобальным, и чем менее глобальное состояние вы полагаетесь, тем лучше

  3. нет необходимости удалять VBO, вы можете просто пропустить glGenBuffers(1, &uiVertexArray); вызов

  4. да новый звонок glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * nNumVerts, NULL, GL_DYNAMIC_DRAW); с новым nNumVerts изменит размер буфера (и уничтожит все существующие данные)

  5. Вы можете сделать следующее:

    glBindBuffer(GL_COPY_READ_BUFFER, bufferVBO);
    glBindBuffer(GL_COPY_WRITE_BUFFER, drawVBO);
    glCopyBufferSubData(GL_COPY_READ_BUFFER​, GL_COPY_WRITE_BUFFER​, 0​, 0, size​);
    glBindBuffer(GL_COPY_READ_BUFFER, 0);
    glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
    

Я записал 700k точек / с на экран без проблем, просто загрузив их все в один VBO и нарисовав это.

2

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector