2016-06-20 2 views
0

Я работаю над некоторым кодом WebGL, а часть его имеет дело с экземплярами WebGlBuffer для хранения атрибутов вершин.Как изменить размер WebGlBuffer?

я не знаю (априори) объем данных буферов будет держать, поэтому WebGlBuffer будет расти, поскольку больше треугольников добавляется к сцене, что-то вроде:

/// Init the WebGlBuffer 
var buff = gl.createBuffer(); 

gl.bindBuffer(gl.ARRAY_BUFFER, buff); 
gl.bufferData(gl.ARRAY_BUFFER, 1024, this._gl.DYNAMIC_DRAW); 

/// Push data for some triangles 
gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(dataForVertex0)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 128, new Float32Array(dataForVertex1)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 256, new Float32Array(dataForVertex2)); 


/// A few seconds later, room for more triangles is needed 

gl.bindBuffer(gl.ARRAY_BUFFER, buff); 
gl.bufferData(gl.ARRAY_BUFFER, 2048, this._gl.DYNAMIC_DRAW); 

/// ... so I can keep adding data for more triangles 
gl.bufferSubData(gl.ARRAY_BUFFER, 1024, new Float32Array(dataForVertex0)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 1152, new Float32Array(dataForVertex1)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 1280, new Float32Array(dataForVertex2)); 

Мои проблема в том, что каждый вызов gl.bufferData() перезапишет текущее содержимое WebGlBuffer нулями. bufferSubData не будет изменять размер буфера автоматически, вместо этого запуская предупреждения переполнения буфера.

Насколько я знаю, единственными способами управлять содержимым WebGlBuffer являются bufferData и bufferSubData.

По соображениям производительности, я хотел бы избежать сохранения ArrayBuffer с копией данных (так как буферы будут использовать нетривиальное количество памяти).

Есть ли способ (эффективно) изменить размер экземпляра WebGlBuffer или скопировать содержимое меньшего размера WebGlBuffer в более крупный WebGlBuffer? Мне не хватает какой-либо функции API WebGL, или я должен вернуться к дублированию данных?

+0

Как сделать буфер больше от начала? Может ли это помочь? –

+0

Как я уже сказал: «Я не знаю (априори) количество данных, которые буферам придется держать». Может быть 3KiB, может быть 500MiB. – IvanSanchez

ответ

1

Нет, к сожалению, WebGL не обладает такими способностями. Если вы хотите изменить размер буфера, вы потеряете его содержимое, нет никакого способа обойти это. Все, что вы можете сделать, это попытаться выделить достаточно места для всех будущих применений заранее. В моем проекте я делаю это, а также сохраняю копию содержимого буфера для возможной ситуации «из памяти» (это также помогает с обновлениями пакетного буфера). Но мои геологические данные относительно малы.

Также у WebGL2 есть copyBufferSubData звонок только для этого.

+0

Тогда я вернусь, чтобы сохранить копию в 'ArrayBuffer'. Спасибо, что подтвердил мои подозрения. – IvanSanchez

Смежные вопросы