bufferData-различия параметров использования
читая спецификацию на Хроносе, я нашел:
bufferData(ulong target, Object data, ulong usage)
параметр'usage' может быть: STREAM_DRAW, STATIC_DRAW или DYNAMIC_DRAW
мой вопрос в том, какой из них я должен использовать? В чем преимущества, в чем различия? Почему я должен использовать какой-то другой вместо STATIC_DRAW?
спасибо.
1 ответов
для "рабочего стола" OpenGL есть хорошее объяснение здесь:
http://www.opengl.org/wiki/Buffer_Object
в основном, параметр использования подсказка для OpenGL / WebGL о том, как вы собираетесь использовать буфер. Затем OpenGL / WebGL может оптимизировать буфер в зависимости от вашей подсказки.
на OpenGL ES docs пишет следующее, что не совсем то же самое, что для OpenGL (помните, что WebGL наследуется от OpenGL ES):
поток
- содержимое хранилища данных будет изменено один раз и использоваться не более нескольких раз.
STATIC
- содержимое хранилища данных будет изменено один раз и использоваться много раз.
динамический
- содержимое хранилища данных будет неоднократно изменяться и использоваться многими раз.
характер доступа должен быть:
DRAW
- содержимое хранилища данных изменяется приложением и используется в качестве источника для команд GL drawing и image specification.
наиболее распространенным использованием является STATIC_DRAW( для статической геометрии), но недавно я создал систему малых частиц, где DYNAMIC_DRAW имеет больше смысла (частицы хранятся в одном буфере, где части буфера обновляется при испускании частиц).
http://jsfiddle.net/mortennobel/YHMQZ/
фрагмент кода:
function createVertexBufferObject(){
particleBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, particleBuffer);
var vertices = new Float32Array(vertexBufferSize * particleSize);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.DYNAMIC_DRAW);
bindAttributes();
}
function emitParticle(x,y,velocityX, velocityY){
gl.bindBuffer(gl.ARRAY_BUFFER, particleBuffer);
// ...
gl.bufferSubData(gl.ARRAY_BUFFER, particleId*particleSize*sizeOfFloat, data);
particleId = (particleId +1 )%vertexBufferSize;
}