2013-05-09 9 views
8

Czytając specyfikację w Khronos, stwierdziliśmy:bufferData - Zastosowanie różnice parametrów

bufferData(ulong target, Object data, ulong usage) 

parametr 'użycie' mogą być: STREAM_DRAW, STATIC_DRAW lub DYNAMIC_DRAW

Moje pytanie brzmi, który z nich korzystać? Jakie są zalety, jakie są różnice? Dlaczego miałbym wybrać inny zamiast STATIC_DRAW?

Dzięki.

Odpowiedz

16

Dla 'pulpitu' OpenGL, nie jest dobrym wyjaśnieniem tutaj:

http://www.opengl.org/wiki/Buffer_Object

Zasadniczo parametr Wykorzystanie to wskazówka do OpenGL/WebGL, w jaki sposób zamierza wykorzystać bufor. OpenGL/WebGL może następnie zoptymalizować bufor w zależności od podpowiedzi.

OpenGL ES docs pisze co następuje, co nie jest dokładnie taka sama jak dla OpenGL (pamiętaj, że WebGL jest dziedziczona z OpenGL ES):

STREAM zawartość przechowują

  • dane będą być modyfikowane tylko raz i używane najwyżej kilka razy.

STATIC zawartość przechowują

  • dane zostaną zmodyfikowane raz i używane wielokrotnie.

DYNAMIC zawartość przechowują

  • dane będą wielokrotnie modyfikowane i wykorzystywane wielokrotnie.

Rodzaj dostępu musi być:

NARYSUJ

  • Zawartość przechowują dane zostały zmodyfikowane przez zastosowanie i stosowano jako źródło dla poleceń rysunku GL specyfikacji obrazu.

Najczęściej używany jest STATIC_DRAW (geometrii statyczne), ale ostatnio stworzony niewielki system cząstek, w którym DYNAMIC_DRAW bardziej sensowne (cząstki są przechowywane w jednym buforem, w których części bufora jest aktualizowany, gdy cząsteczki są emitowane).

http://jsfiddle.net/mortennobel/YHMQZ/

Fragment kodu:

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

Jeśli ustawione coś jak DYNAMIC_DRAW, jak mogłoby zrobić 'Aktualizacja' bufora?Bez aktualizacji, wykonaj następujące czynności: utwórz bufor, powiązaj go, buforuj dane, wyślij do programu cieniującego. Gdzie odbywa się aktualizacja? –

+3

Po utworzeniu bufora i wypełnieniu go wartościami początkowymi za pomocą gl.bufferData, można zaktualizować bufor (lub jego część) w innej ramce, używając funkcji gl.bufferSubData. Spróbuj spojrzeć na kod źródłowy skrzypiec - powinno być dość łatwo zobaczyć, co się dzieje. – Mortennobel

+1

Tylko ktoś, kto przyjrzy się tej odpowiedzi, jeśli spojrzysz na link do dokumentacji, zobaczysz, że losowanie strumienia jest właściwie modyfikowane i często używane. Nie to, że modyfikujesz tylko raz. – Ellie