Note de curs, programare grafică, 9 decembrie 2013

From Algopedia
Revision as of 14:24, 7 February 2014 by Dan (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Î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