Note de curs, programare grafică, 9 decembrie 2013
În acest curs am prezentat operațiile de bază care pot fi efectuate asupra obiectelor OpenGL ES 2.0 și am detaliat operațiile permise asupra obiectelor de tip buffer.
Operații de bază
Orice obiect OpenGL ES 2.0 poate avea un nume rezervat și poate fi șters. Unele obiecte pot fi atașat la ținte (bound to target) iar celelalte pot fi atașate la alte obiecte.
Atașarea unui obiect la o țintă (bound to target)
O țintă (target) este o entitate statică definită de OpenGL, prin care obiectele pot fi manipulate (se pot efectua operații asupra obiectelor).
Un obiect poate fi atașat unei ținte sau poate fi detașat de o țintă. Efectuând operații asupra țintelor, de fapt se efectuează operații asupra obiectelor atașate acestora. La un moment dat cel mult un singur obiect poate fi atașat unei ținte.
Un obiect este detașat de o țintă fie prin ștergerea sa, fie prin atașarea unui alt obiect la acea țintă.
Unele ținte au atașat, la inițializare, un obiect implicit. Când se manipulează o țintă (efectuează operații asupra ei) care nu are atașat niciun obiect (nici cel implicit) are loc o eroare.
Fiecare țintă acceptă doar un anumit tip de obiecte. În plus, prin atașarea unui obiect la o țintă acesta nu mai poate fi reatașat decât la acea țintă (putem spune că ținta particularizează tipul obiectului).
Odată ce a fost atașat pentru prima dată unei ținte, unui obiect i se alocă resurse pe placa grafică. Aceste resurse pot fi eliberate doar prin ștergerea obiectului.
Atașarea unui obiect la un altul
Anumite tipuri de obiecte pot fi atașate la alte tipuri de obiecte. Putem considera că dacă un obiect A este atașat la un obiect B atunci A face parte din B sau B este format din A.
Obiectele de tip buffer
Obiectele de tip buffer se folosesc pentru stocarea de date în memoria plăcii video. Ele pot conține orice fel de informație, de orice tip de date și de orice dimensiune (cu condiția să poată fi stocată).
Țintele (targets) care acceptă obiecte de tip buffer
The elemente array buffer target:
OOGLES20Buffer bufferTarget = OOGLES20.elementArrayBuffer int bufferTarget = GLES20.GL_ELEMENT_ARRAY_BUFFER
The render buffer target:
OOGLES20Buffer bufferTarget = OOGLES20.renderBuffer int bufferTarget = GLES20.GL_RENDERBUFFER
Ținta la care este atașat un obiect de tip buffer definește scopul în care sunt utilizate datele din bufferului respectiv.
Un render buffer stochează, de obicei, o listă cu una din proprietățile vârfurilor care urmează să fie desenate. În timp ce un element array buffer stochează, de obicei, indicii vârfurilor care urmează să fie desenați (definește ordinea în care aceștia sunt procesați).
Modul de utilizare al datelor stocate
Datele stocate se vor modifica o dată și vor fi folosite de câteva ori:
OOBufferUsage.STREAM_DRAW GLES20.GL_STREAM_DRAW
Datele stocate se vor modifica o dată și vor fi folosite de multe ori:
OOBufferUsage.STATIC_DRAW GLES20.GL_STATIC_DRAW
Datele stocate se vor modifica de mai multe ori și vor fi folosite de mai multe ori:
OOBufferUsage.DYNAMIC_DRAW GLES20.GL_DYNAMIC_DRAW
Operații de bază
Alocarea unui nume (identificator) pentru un obiect de tip buffer:
OOBuffer bufferObject = new OOBuffer GLES20.glGenBuffers
Ștergerea un obiect de tip buffer:
bufferObject.delete GLES20.glDeleteBuffers
Atașarea unui obiect de tip buffer la o țintă:
bufferTarget.bind GLES20.glBindBuffer bufferTarget
Detașarea unui obiect de tip buffer de o țintă:
bufferTarget.unbind GLES20.glBindBuffer 0
Operații specifice
Inițializarea conținutului unui buffer:
bufferTarget.setData GLES20.glBufferData bufferTarget
Modificarea parțială a conținutului unui buffer:
bufferTarget.setSubData GLES20.glBufferSubData bufferTarget
Interogări
Obținerea dimensiunii unui buffer (în octeți):
bufferTarget.getSize GLES20.glGetBufferParameteriv GLES20.GL_BUFFER_SIZE
Obținerea modului de utilizare al unui buffer:
bufferTarget.getUsage GLES20.glGetBufferParameteriv GLES20.GL_BUFFER_USAGE