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;
}