Halad Grafika Gyakorlat Open GL ttekint Blint Csaba
Haladó Grafika Gyakorlat Open. GL áttekintő Bálint Csaba
Haladó Grafika - Bálint Csaba
Adat Művelet https: //www. khronos. org/opengl/wiki/Rendering_Pipeline_Overview Open. GL shader-ek • Vertex shader • Tessellation contol shader • Tessellation evaluation shader • Geometry shader Három optimalizációs lehetőség • Párhuzamosítás (per vertex, fregment, stb. ) Work item, work group, stb. lásd gpgpu EA • Szerelőszalagosítás data-stream-ek • Memóriára várást el kell fedni a fenti kettővel lásd gpgpu EA Haladó Grafika - Bálint Csaba
Haladó Grafika - Bálint Csaba
Haladó Grafika - Bálint Csaba
Haladó Grafika - Bálint Csaba
Haladó Grafika - Bálint Csaba
VAO – Vertex Array Object • Rajzolási parancsok: gl[Multi]Draw{Arrays, *Elements}[Instanced]* • Rajzolási parancs Aktív VAO-t használja VAO definiálja, hogyan olvassa be a GPU a geometriát. (lásd VBO) • Attrib. Array-ok tömbje. Egy Attrib. Array: Pl. : Pozíció, normális, textúra koordináta. • • Aktív vagy inaktív Ha inaktív, akkor konstans érték minden indexen (gl. Vertex. Attrib) Ha aktív, akkor egy pointer egy memóriaterületre (típust, méret, offszet, stb). Vertexenként a következőt olvassa hacsak nem állítjuk be másként • Nem tárol geometriai információt, csak annak elrendezését és helyét! Haladó Grafika - Bálint Csaba
VAO beállítása – régi módszer 1. 2. 3. 4. 5. 6. 7. Példaprojektekben ez van VAO létrehozása: gl. Gen. Vertex. Arrays (1, &vaoid) Kontexturhoz csatolás: gl. Bind. Vertex. Array(vaoid) Pointer beállítása: gl. Bind. Buffer(GL_ARRAY_BUFFER, vboid); Aktiválás: gl. Enable. Vertex. Attrib. Array(idx) Típus beállítása: gl. Vertex. Attrib. Pointer*(idx, <type, size>) 3, 4, 5 -öt ismételjük annyiszor ahány attribútomot szeretnénk. Index buffer beállítása: gl. Bind. Buffer(GL_ELEMENT_ARRAY_BUFFER); Haladó Grafika - Bálint Csaba
VAO beállítása – „új” módszer Open. GL 4. 3 1. gl. Gen. Vertex. Arrays, gl. Bind. Vertex. Array Memória struktúra és geometria struktúra szétválasztása: 2. Buffer Binding Point beállítása: Mekkora az adat, és össze Azaz, hogy az adott buffer hogyan olvasandó van-e fésülve más adattal? • gl. Bind. Vertex. Buffer(bindingindex, buffer, offset, stride) • gl. Vertex. Binding. Divisor(bindingindex, divisor) 3. Vertex Attribute Format beállítása: Azaz, a kiolvasott érték hogyan értelmezendő Hol kezdődik az ide tartozó adat? Hol kezdődik EZ a geometria? • gl. Vertex. Attrib. Format(attribindex, size, type, normalized, relativeoffset) 4. A kettő összekapcsolása: gl. Vertex. Attrib. Binding(attribindex, bindingindex) Haladó Grafika - Bálint Csaba Melyik bufferben van az attribútum tárolva?
Grafikus szerelőszalag és VAO Haladó Grafika - Bálint Csaba
Rajzolási parancsok: gl*Draw* Adat elérésének optimalizációja: • *Elements*: Index buffer használata (különben Arrays). • *Range*: Index buffer esetén megmondjuk hova képeznek az indexek. Rajzolások párhuzamosítása: • *Multi*: Több rajzolási parancs „egyidejű” meghívása. • *Instancing*: Egy hívásban ugyanazon geometria többszöri kirajzolása. A GPU CPU GPU oda-vissza út kioptimalizálása: • *Transform. Feedback*: Visszacsatolt geometria kirajzolása… • *Indirect*: A rajzolási parancs paramétereit bufferből olvassuk… • *gl{Begin, End}Conditional. Render*: Egy objektum láthatóságától függően más rajzolási parancsok végrehajtása. (Occlusion querie) Haladó Grafika - Bálint Csaba
Open. GL objektumok : Erőforrásnevek • Típusa: Gluint = int 32. Létrehozás: gl. Gen*, gl. Create*, törlés: gl. Delete. • Nulla alapértelmezett érték, ha gl. Gen* ilyet ad vissza, hiba van. • Minden contextnek saját névtere van, amíg nincs összekapcsolva egy másikkal (context sharing). • Open. GL objektumok tipikus használata: 1. 2. 3. 4. 5. Név generálása (deklaráció, gl. Gen*, gl. Create*) Erőforrás aktívvá tétele (bind-olás) gl. Bind* Műveletek elvégzése (definíció és használat) Állapot változtatás Erőforrás deaktiválása (más ugyanilyen típusú erőforrás aktiválása (pl. 0)) Erőforrás felszabadítása (gl. Delete*) Haladó Grafika - Bálint Csaba
Open. GL objektumok : Bind-olás • Bind-olás = Contextushoz csatolás • Ha egy másik objektumhoz történik a csatolás, akkor attachment! 1. Az első paraméter a target. Csak egy objektum csatolható egy ilyen pontra, ha nincs index paraméter. 2. Ha van második paraméter – index – akkor ez az egyedi csatlakozási pont. (Multibind) 3. Második vagy harmadik paraméter az objektum neve • Néha van több csatolási paraméter is • Egy objektumot az Open. GL akkor szabadít fel, ha már semmi nem mutat rá Beleértve attachement-et is! Deletion orphaning Haladó Grafika - Bálint Csaba
Open. GL Bufferek • Open. GL Objektumok • gl. Gen. Buffers(1, &buffer. Name) • gl. Bind. Buffer(GLenum target, GLuint buffer. Name) • Formázatlan összefüggő memóriaterület amit az • Open. GL context foglal le (a GPU-n). • Példák: • • • Vertex adatok (VBO = GL_ARRAY_BUFFER, index buffer = GL_ELEMENT_ARRAY_BUFFER) Tömbök shader-beli használatra (UBO, SSBO) Számlálók (atomic counter), Mérések (GL_QUERRY_BUFFER, pl futásidő) Transform feedback buffer, indirect buffer Textúrák speciális esetei: texture-, pixel unpack-, pixel pack buffer. Haladó Grafika - Bálint Csaba
Haladó Grafika - Bálint Csaba
Open. GL Bufferek típusai Open. GL 4. 4 Mutable Storage Immutable Storage • Akárhányszor lehet foglalni • Egyszer lehet lefoglalni (és feltöleni) • gl. Buffer. Storage(target, size, data, flags) • gl. Buffer. Data(target, size, data, usage) • Allokál és felötölt adattal! • GL_{DRAW, READ, COPY} • _{STATIC, DYNAMIC, STREAM} • Nem lehet CPU-ról írni és olvasni egyszerűen • • GL_MAP_{READ, WRITE}_BIT GL_DYNAMIC_STORAGE_BIT GL_{COHERENT, PERSISTENT}_BIT GL_CLIENT_STORAGE_BIT • Mindent lehet ami „server-side” művelet: • Nem tud persistent mapping-et • Sokszor nehezebben cache-elhetők • Néha felesleges szinkronizációt igényelhetnek • • Grafikus szerelőszalag részeként írható Törölhető (clearing) és (invalidating) Másik bufferbe másolás gl. Get. Buffer. Sub. Data kakukk tojás Haladó Grafika - Bálint Csaba
Open. GL Buffer műveletek Open. GL 4. 3 • Törlés: gl. Clear. Buffer[Sub]Data Open. GL 1. 5 • Felülírás: gl. Buffer. Sub. Data (nem allkál) sokszor lassú Open. GL 2. 0 • Lekérdezés: gl. Get. Buffer. Sub. Data • Másolás: GL_COPY_READ_BUFFER GL_COPY_WRITE_BUFFER Open. GL 3. 1 gl. Copy. Buffer. Sub. Data • Mapping: gl. Map. Buffer[Range] visszaad egy másolt/írható pointert. • • Ha vége: gl. Unmap. Buffer. Ezután a GPU-ra kerülnek a változtatások. Ha nincs GL_MAP_PERSISTENT_BIT, akkor mappelés közben zárolva van. Lehet explicit gl. Flush. Mapped. Buffer. Range-t hívni. Sokkal gyorsabb tud lenni mint a gl. Buffer. Sub. Data. Open. GL 1. 9! Haladó Grafika - Bálint Csaba
Adattíusok izelítő: (CPU oldal) Bitménység 8 16 32 64 Egész szám GLbyte GLshort GLint 64 Természetes szám GLubyte GLushort GLuint 64 GLhalf GLfloat GLdouble Lebegőpontos Egyéb típusok: GLboolean, GLfixed, GLbitfield, GLenum, GLsizei, GLclampf, GLintptr, GLsizeiptr, GLclampd. Haladó Grafika - Bálint Csaba
To be continued… Haladó Grafika - Bálint Csaba
- Slides: 20