2013-05-09 10 views
8

Durante la lettura specifica a Khronos, ho trovato:bufferData - utilizzo dei parametri differenze

bufferData(ulong target, Object data, ulong usage) 

parametro 'utilizzo' può essere: STREAM_DRAW, STATIC_DRAW o DYNAMIC_DRAW

La mia domanda è, quale dovrei usare? Quali sono i vantaggi, quali sono le differenze? Perché dovrei scegliere di usarne un altro invece STATIC_DRAW?

Grazie.

risposta

16

per OpenGL 'desktop', c'è una buona spiegazione qui:

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

In sostanza, parametri di utilizzo è un suggerimento a OpenGL/WebGL su come si intende utilizzare il buffer. OpenGL/WebGL può quindi ottimizzare il buffer in base al suggerimento.

Il OpenGL ES docs scrive quanto segue, che non è esattamente la stessa che per OpenGL (ricordiamo che WebGL è ereditato da OpenGL ES):

STREAM contenuti dei negozi

  • I dati saranno essere modificato una volta e utilizzato al massimo un paio di volte.

STATIC

  • i dati contenuti dei negozi saranno modificate una volta e utilizzati più volte.

DYNAMIC

  • i dati contenuti dei negozi saranno modificati più volte e utilizzati più volte.

La natura di accesso deve essere:

DRAW

  • I contenuti dell'archivio dati vengono modificati dall'applicazione, e utilizzati come sorgente per i comandi di disegno GL e specifica immagine.

L'uso più comune è STATIC_DRAW (per geometria statica), ma hanno recentemente creato un sistema piccola particella dove DYNAMIC_DRAW rende più senso (le particelle vengono memorizzati in un singolo buffer, dove le parti del buffer viene aggiornato quando particelle sono emesse).

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

Codice frammento:

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

Se impostare qualcosa come DYNAMIC_DRAW, come dovrei fare 'aggiornamento' del buffer?Senza aggiornare, i passaggi sono: creare un buffer, associarlo, bufferData, inviarlo al programma shader. Dove si verifica l'aggiornamento? –

+3

Dopo aver creato il buffer e riempito con i valori iniziali usando gl.bufferData, è possibile aggiornare il buffer (o parte di esso) in un altro frame usando la funzione gl.bufferSubData. Prova a dare un'occhiata al codice sorgente del violino: dovrebbe essere abbastanza facile vedere cosa sta succedendo. – Mortennobel

+1

Basta dare un'occhiata a tutti coloro che stanno guardando questa risposta, se si guarda il link alla documentazione, vedrete che il flusso è in realtà se modificate e usate frequentemente. Non che tu modifichi solo una volta. – Ellie

Problemi correlati