Я работаю над некоторым кодом 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, или я должен вернуться к дублированию данных?
Как сделать буфер больше от начала? Может ли это помочь? –
Как я уже сказал: «Я не знаю (априори) количество данных, которые буферам придется держать». Может быть 3KiB, может быть 500MiB. – IvanSanchez