G'day,
Я пытаюсь обновить часть VBO с вызовом glBufferSubData(). Когда я обновляю с начала (0) моего существующего теневого буфера, нет проблем, так как буфер начинает отсчет с 0. Следующее будет читать от 0 до y из буфера и поместить его в 0 до y в VBO:
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, 0, y, mPositionBuffer);
Однако, если я хочу обновить часть VBO (не от 0), я столкнулся с проблемой; Следующее не работает, поскольку оно будет записывать значения с начала буфера (от 0 до y) в положение x до x + y VBO:
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer);
Изменение позиции с использованием buffer.position(x) не имеет никакого эффекта:
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer.position(x));
Решением является срез() буфера, который отлично работает:
mPositionBuffer.position(x);
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer.slice());
Но это вызывает мусор, поскольку новый буфер генерируется с помощью среза, хотя он использует тот же хранилище данных.
Вопрос: есть ли способ получить желаемый результат (заменить смещенную часть VBO с использованием смещения в буфер) без создания мусора? Как вы, наверное, догадались, это для игры в андроид, а сборка мусора в игре - не-нет.
Спасибо! Aert.
Ну, я думаю, можно использовать статический буфер в качестве ссылки и иметь slicer для операции io. Тогда он не будет вызывать сборщик мусора, который долгое время проживает в классе.
похоже, что у меня та же проблема.
Единственное решение, которое мне пришло в голову, - использовать android ndk для создания альтернативной реализации glBufferSubData, которая добавляет смещение к указателю (полученному из mPositionBuffer), прежде чем передавать его в фактическую функцию opengl.
Это звучит слишком плохо, я надеюсь, что есть лучшее решение.