Вопросы по второму параметру glBufferData в webgl - PullRequest
0 голосов
/ 26 января 2019

Я читал знаменитое руководство по webgl https://webgl2fundamentals.org/webgl и изучал, как использовать bufferData для помещения данных в буфер.Учебное пособие использует bufferData в такой форме, как эта

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

второй параметр здесь - это фактический массив или данные, которые мы хотим отправить в буфер на GPU.Однако я столкнулся с этим новым использованием API сегодня.

gl.bufferData(gl.ARRAY_BUFFER, 8*maxNumVertices, gl.STATIC_DRAW);

Здесь второй параметр указывает размер буфера.

Так что меня это смутило.Я посмотрел этот API на MDN https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData и там написано

// WebGL1: 
void gl.bufferData(target, size, usage); 
void gl.bufferData(target, ArrayBuffer? srcData, usage); 
void gl.bufferData(target, ArrayBufferView srcData, usage); 

// WebGL2: 
void gl.bufferData(target, ArrayBufferView srcData, usage, srcOffset, length);

Значит ли это для webgl1.0, мы можем либо передать фактический массив данных, либо размер буфера вAPI как второй параметр.Однако для WebGL2.0 мы можем только передать фактический массив данных в API?

Я до сих пор не уверен в этом.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 26 января 2019

WebGL2 добавляет к API WebGL1, поэтому у WebGL2 есть 4 версии gl.bufferData, 3 из WebGL1 и одна новая.

Они

по размеру

void gl.bufferData(target, size, usage); 

набор с нетипизированным ArrayBuffer

void gl.bufferData(target, ArrayBuffer? srcData, usage); 

устанавливается с ArrayBufferView, как Uint8Array, Float32Array и другими типами представления буфера массива.

void gl.bufferData (цель, ArrayBufferView srcData, использование);

набор с ArrayBufferView со смещением и длиной

// WebGL2: 
void gl.bufferData(target, ArrayBufferView srcData, usage, srcOffset, length);

Последний был добавлен, вероятно, для WebAssembly. Проблема заключалась в том, что если у вас был большой ArrayBufferView и вы хотели загрузить только часть, вам нужно было создать новый ArrayBufferView в том же буфере, который покрывал часть, которую вы хотите загрузить. Несмотря на то, что ArrayBufferView на том же ArrayBuffer является относительно дешевым, все равно есть выделение для представления, которое в конечном итоге придется собирать мусором. Добавление новой версии gl.bufferData устраняет эту проблему. Вам не нужно создавать временный ArrayBufferView только для загрузки части ArrayBuffer.

...