2013-05-09 9 views
8

Während Spezifikation bei Khronos lesen, fand ich:buffer - Nutzungsparameter Unterschiede

bufferData(ulong target, Object data, ulong usage) 

'Nutzung' Parameter sein kann: STREAM_DRAW, STATIC_DRAW oder DYNAMIC_DRAW

Meine Frage ist, was soll ich verwenden? Was sind die Vorteile, wo liegen die Unterschiede? Warum sollte ich eine andere anstelle von STATIC_DRAW verwenden?

Danke.

Antwort

16

für 'Desktop' OpenGL, gibt es eine gute Erklärung hier:

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

Grundsätzlich Nutzungsparameter ist ein Hinweis zu OpenGL/WebGL, wie Sie beabsichtigen, den Puffer zu verwenden. Das OpenGL/WebGL kann dann den Puffer abhängig von Ihrem Hinweis optimieren.

Die OpenGL ES docs schreibt die folgende, die nicht genau das gleiche wie für OpenGL ist (denken Sie daran, dass WebGL von OpenGL geerbt ES):

STREAM

  • Der Inhalt Datenspeicher werden einmal modifiziert und höchstens einige Male benutzt werden.

STATIC

  • Der Datenspeicher Inhalt wird einmal geändert werden und mehrfach verwendet.

DYNAMIC

  • Der Datenspeicher Inhalt geändert wiederholt werden und mehrfach verwendet.

Die Art des Zugangs sein muss:

DRAW sind

  • Inhalte der Datenspeicher von der Anwendung geändert, und als Quelle für die GL Zeichnung und Bildspezifikation Befehlen verwendet.

Die häufigste Verwendung ist STATIC_DRAW (für statische Geometrie), aber ich habe vor kurzem ein kleines Partikelsystem geschaffen, in dem DYNAMIC_DRAW mehr Sinn macht (die Partikel in einem einzelnen Puffer gespeichert werden, wo Teile des Puffers aktualisiert wird, wenn Partikel werden emittiert).

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

-Code-Schnipsel:

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

Wenn gesetzt etwas wie DYNAMIC_DRAW, wie würde ich 'Aktualisierung' des Puffers zu tun?Ohne zu aktualisieren, sind die Schritte: create buffer, bind es, bufferData, sende es an das Shader-Programm. Wo wird aktualisiert? –

+3

Nachdem Sie den Puffer erstellt und mit gl.bufferData mit den Anfangswerten gefüllt haben, können Sie den Puffer (oder Teile davon) in einem anderen Rahmen mit der Funktion gl.bufferSubData aktualisieren. Versuchen Sie, sich den Quellcode der Geige anzusehen - es sollte ziemlich einfach sein zu sehen, was vor sich geht. – Mortennobel

+1

Nur ein Blick auf alle, die diese Antwort betrachten. Wenn Sie sich den Link zu der Dokumentation ansehen, sehen Sie, dass die Stream-Zeichnung tatsächlich angezeigt wird, wenn Sie sie häufig ändern und verwenden. Nicht, dass Sie nur einmal ändern. – Ellie