Bartos Baluk DEFINIOWANIE GEOMETRII Sposob opisu geometrii brł w OpenGL. http://baluk.net/psb Grafika Komputerowa, Informatka, I Rok
Renderowanie geometrii Wierchołki Pretwaranie wierchołków Łącenie w prmitw Geometria jest opisana prede wsstkim pocjami wierchołków Podcas procesu renderowania powierchnie obiektów rsowane są a pomocą tw. prmitwów Prmitw to figur geometrcne odpowiadające a to, jak informacja o kolejnch pocjach ostanie wkorstana podcas rsowania Mogą to bć np. punkt, linie, łamane, trójkąt, pas trójkątów, cworokąt, wielokąt, itp. Rasteracja prmitwów Operacje na fragmentach Operacje na pikselach Bufor klatki Źródło obrau: GPU Design 11 maja 2018 r. Bartos Baluk 2
Renderowanie geometrii Prmitw obsługiwane pre OpenGL: Źródło obrau: http://www.opengl.org 11 maja 2018 r. Bartos Baluk 3
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Mślim o punktach w prestreni 3D, nie na płascźnie 11 maja 2018 r. Bartos Baluk 4
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Użcie prmitwu punkt (ang. points) 11 maja 2018 r. Bartos Baluk 5
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Użcie prmitwu linie (ang. lines) 11 maja 2018 r. Bartos Baluk 6
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Użcie prmitwu łamana (ang. line strip) 11 maja 2018 r. Bartos Baluk 7
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Użcie prmitwu łamana amknięta (ang. line loop) 11 maja 2018 r. Bartos Baluk 8
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Użcie prmitwu trójkąt (ang. triangles) 11 maja 2018 r. Bartos Baluk 9
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Użcie prmitwu wachlar (ang. triangle fan) 11 maja 2018 r. Bartos Baluk 10
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Użcie prmitwu pas trójkątów (ang. triangle strip) 11 maja 2018 r. Bartos Baluk 11
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Dwa ostatnie wierchołki nie są wkorstane - ab powstał kolejn quad, potrebne błb dwa następne! Użcie prmitwu cworokąt (ang. quads) 11 maja 2018 r. Bartos Baluk 12
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Ten cworokąt jest niepoprawn ( degenerowan ) nie jest wpukł! Użcie prmitwu pas cworokątów (ang. quad strip) 11 maja 2018 r. Bartos Baluk 13
Renderowanie geometrii Prkład: Mam dane 6 wierchołków o następującch położeniach: v 5 Ten wielokąt jest niepoprawn ( degenerowan ) nie jest wpukł! Użcie prmitwu wielokąt (ang. polgon) 11 maja 2018 r. Bartos Baluk 14
Face culling Ropatrm prpadek: scena awiera seścian Wierchołki Pretwaranie wierchołków Łącenie w prmitw Rasteracja prmitwów Operacje na fragmentach Operacje na pikselach Bufor klatki Ile jego ścian jest widocnch na danej klatce animacji? Ile ścian jest renderowanch podcas rsowania klatki? W którm momencie potoku pomijane są tlne ścian? 11 maja 2018 r. Bartos Baluk 15
Face culling Technika face culling powala na pominięcie ścian widocnch określonej stron jesce pred ropocęciem ich rasteracji O odruceniu decduje kolejność wierchołków po ich projekcji (ang. winding order) Zgodnie ruchem wskaówek egara (ang. clockwise) Preciwnie do wskaówek egara (ang. counter-clockwise) Koniecne jest więc ustalenie w jakiej kolejności definiowane są wierchołki ścian gd patrm na ich prednią stronę, a potem konsekwentne trmanie się ustalonej kolejności podcas opiswania geometrii obiektów. CCW 11 maja 2018 r. Bartos Baluk 16
Face culling Jeśli po prejściu do współrędnch kamer kolejność wierchołków gada się tą unaną a prednią, to nac że widim prednią stronę ścian i należ ją poddać rasteracji Jeśli kolejność jest odwrotna, to widim tlną stronę ścian i możem ją pominąć (jeśli użwam techniki back face culling) Źródło obrau: http://www.learningopengl.com 11 maja 2018 r. Bartos Baluk 17
Face culling Jak karta graficna porównuje kolejność wierchołków? C kąt pomęd wektorem normalnm ścian, a wektorem obserwacji jest mniejs lub równ 90 stopni? Wektor normaln oblicam a pomocą ilocnu wektorowego trech kolejnch wierchołków w kolejności ich definiowania Równoważne ptanie: C ilocn skalarn międ tmi wektorami jest więks lub równ ero? Jeśli tak, to kolejność jest różna od pocątkowej ścianę należ pominąć! N N=( ) ( ) V 0 N 0 V 0 - - 11 maja 2018 r. Bartos Baluk 18
Face culling Kied back face culling jest problematcn? Gd na scenie są prerocste obiekt Wówcas pomijanie tlnch ścian może bć widocne Gd wstępują obiekt o erowej grubości, w którch obie stron ścian są widocne Do cego dodatkowo może służć back face culling? Usuwanie "niewidocnch" linii w renderowaniu wireframe, pod warunkiem że geometria jest wpukła Do cego mógłb służć front face culling? Ukrwanie prednich ścian może bć prdatne podcas renderowania map cieni, b uniknąć efektu self-shadowing gd sprawdane jest prsłonięcie scen punktu widenia źródła światła 11 maja 2018 r. Bartos Baluk 19
Face culling Jak korstać face cullingu w OpenGL? Włącanie: glenable(gl_cull_face); Wbór kolejności definicji prednich ścian: glfrontface(gl_ccw); // preciwnie do ruchu wskaówek egara glfrontface(gl_cw); // godnie ruchem wskaówek egara dotc wierchołków definiowanch po wwołaniu tej funkcji Wbór ścian, które mają bć pomijane: glcullface(gl_back); glcullface(gl_front); glcullface(gl_front_and_back); 11 maja 2018 r. Bartos Baluk 20
Definicja geometrii w OpenGL Najprostsą metodą definicji i renderowania geometrii jest tw. immediate mode Definicja własności wsstkich wierchołków w każdej klatce Podejście którego współceśnie się już nie stosuje Jest nieefektwne W każdej klatce duża ilość danch prekawana do kart graficnej Współceśnie użwa się buforów w pamięci kart graficnej Jest najłatwiejse w roumieniu Prmitw glbegin(gl_quads); glverte3f(-1.0f, -1.0f, 0.0f); glverte3f(1.0f, -1.0f, 0.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(-1.0f, 1.0f, 0.0f); glend(); 11 maja 2018 r. Bartos Baluk 21
Atrbut wierchołków Prkładowm atrbutem wierchołka jest jego kolor Kolor określa się a pomocą komponentów RGB(A) Wartości są normaliowane (0.0-1.0) Cwart kanał A może określać prerocstość Prkład: (1.0, 0.0, 0.0) (0.0, 1.0, 0.0) (0.0, 0.0, 1.0) (0.0, 0.0, 0.0) (1.0, 1.0, 1.0) (0.5, 0.5, 0.5) (1.0, 0.5, 0.5) (0.0, 0.6, 1.0) Użwa się do tego celu funkcji: glcolor3f(float r, float g, float b) lub analogicnch (4f, 3fv, 4fv,...) 11 maja 2018 r. Bartos Baluk 22
Atrbut wierchołków Atrbut wierchołków ustawiam pred utworeniem danego wierchołka. Na prkład ustawienie koloru tc się wsstkich wierchołków, które będą definiowane po określeniu tego koloru, dopóki kolor nie ostanie mienion na inn. Innm prkładem atrbutów wierchołków mogą bć wektor normalne i współrędne tekstur. Prkład: glcolor3f(1.0f, 0.0f, 0.0f); glbegin(gl_quads); glverte3f(-1.0f, -1.0f, 0.0f); glverte3f(1.0f, -1.0f, 0.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(-1.0f, 1.0f, 0.0f); glend(); glbegin(gl_quads); glcolor3f(0.0f, 0.0f, 0.0f); glverte3f(-1.0f, -1.0f, 0.0f); glcolor3f(1.0f, 0.0f, 0.0f); glverte3f(1.0f, -1.0f, 0.0f); glcolor3f(0.0f, 1.0f, 0.0f); glverte3f(1.0f, 1.0f, 0.0f); glcolor3f(0.0f, 0.0f, 1.0f); glverte3f(-1.0f, 1.0f, 0.0f); glend(); 11 maja 2018 r. Bartos Baluk 23
DEFINICJA GEOMETRII Prkładowe dane Prkład będą dotcł prostego seścianu: v 5 v 6 Dla uproscenia na raie pomijam wsstko poa pocjami wierchołków 11 maja 2018 r. Bartos Baluk 24
DEFINICJA GEOMETRII Prkładowe dane Pocje wierchołków: = (0,1,0) = (1,1,0) = (0,1,1) = (1,1,1) v 5 = (0,0,0) v 6 = (1,0,0) = (0,0,1) = (1,0,1) 11 maja 2018 r. Bartos Baluk 25
DEFINICJA GEOMETRII Prkładowe dane Kolejność definicji ścian nasego seścianu: Zakładam użcie prmitwu GL_QUADS v 5 v 6 Ocwiście możliwe będie skanie na wdajności np. użwając GL_QUAD_STRIP, ale chcem prost prpadek GL_QUADS nie jest dostępn we współcesnch wersjach OpenGL, ale powala łatwiej obraować agadnienie 11 maja 2018 r. Bartos Baluk 26
DEFINICJA GEOMETRII Prkładowe dane Kolejność definicji wierchołków: v0 -> v1 -> v2 -> v3 v3 -> v2 -> v6 -> v7 v7 -> v6 -> v5 -> v4 v4 -> v5 -> v1 -> v0 v0 -> v3 -> v7 -> v4 v1 -> v5 -> v6 -> v2 Cli: 24 estaw po 3 współrędne po 4 bajt 24 3 4 = 288 bajtów Pamiętam o backface cullingu akładam że front-face' definiowane są preciwnie do ruchu wskaówek egara (CCW) v 5 v 6 11 maja 2018 r. Bartos Baluk 27
IMMEDIATE MODE Najprostse podejście polegające na bepośredniej Ogólna charakterstka definicji geometrii Wartości (np. współrędne wierchołków) dla każdoraowego żądania renderowania, prekawane są do serwera od nowa Onaca to ogromną ilość danch presłaną co klatkę od klienta do serwera Onaca to ogromną licbę wwołań funkcji OpenGL v 5 v 6 11 maja 2018 r. Bartos Baluk 28
IMMEDIATE MODE Otwarcie bloku definicji geometrii Sposób użcia Wskaanie pożądanego prmitwu Definicja geometrii Wierchołki, wektor normalne, współrędne tekstur... Zamknięcie bloku Zlecenie renderowania, ewentualne buforowanie Prkład dla pierwsego quada: v v 5 v 6 1 v 2 glbegin(gl_quads); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(1.0f, 0.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glend(); 11 maja 2018 r. Bartos Baluk 29
IMMEDIATE MODE Dla całego seścianu: Prkład użcia glbegin(gl_quads); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(1.0f, 0.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 0.0f, 1.0f); glverte3f(1.0f, 0.0f, 0.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(1.0f, 0.0f, 0.0f); glverte3f(0.0f, 0.0f, 0.0f); glverte3f(0.0f, 1.0f, 0.0f); W każdej klatce wsłam do serwera pocje wsstkich wierchołków Nie mieniają się po co? Powtarające się wierchołki wsłane są kilkukrotnie Już ostał presłane po co? glverte3f(0.0f, 1.0f, 0.0f); glverte3f(0.0f, 0.0f, 0.0f); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(0.0f, 1.0f, 0.0f); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(0.0f, 1.0f, 0.0f); v 5 v 6 glend(); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(0.0f, 0.0f, 0.0f); glverte3f(1.0f, 0.0f, 0.0f); glverte3f(1.0f, 0.0f, 1.0f); 11 maja 2018 r. Bartos Baluk 30
DISPLAY LIST Skompilowana sekwencja instrukcji mieniającch Ogólna charakterstka stan serwera Prechowwana w pamięci kart graficnej Ra utworona nie może bć modfikowana Nie nadaje się do animacji brł Sterownik odpowiada a to, b lista ostała wkonana efektwnie Każda lista ma prpisan identfikator, któr służ jej późniejsemu wwołaniu (żądaniu renderowania) v 5 v 6 11 maja 2018 r. Bartos Baluk 31
DISPLAY LIST Utworenie displa list Sposób użcia Żądanie identfikatora Kompilacja displa list Wierchołki, wektor normalne, współrędne tekstur... Można dołącć inne mian stanu serwera Wwołanie displa list Żądanie renderowania użciem identfikatora v v 5 v 6 1 v 2 Prkład dla pierwsego quada: GLuint id = glgenlists(1); glnewlist(id, GL_COMPILE); glbegin(gl_quads); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(1.0f, 0.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glend(); glendlist(); // Renderowanie: glcalllist(id); 11 maja 2018 r. Bartos Baluk 32
DISPLAY LIST Dla całego seścianu: Prkład użcia v 5 v 6 GLuint id = glgenlists(1); glnewlist(id, GL_COMPILE); glbegin(gl_quads); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(1.0f, 0.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 0.0f, 1.0f); glverte3f(1.0f, 0.0f, 0.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(1.0f, 0.0f, 0.0f); glverte3f(0.0f, 0.0f, 0.0f); glverte3f(0.0f, 1.0f, 0.0f); glverte3f(0.0f, 1.0f, 0.0f); glverte3f(0.0f, 0.0f, 0.0f); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(0.0f, 1.0f, 0.0f); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(0.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 1.0f); glverte3f(1.0f, 1.0f, 0.0f); glverte3f(0.0f, 1.0f, 0.0f); glverte3f(0.0f, 0.0f, 1.0f); glverte3f(0.0f, 0.0f, 0.0f); glverte3f(1.0f, 0.0f, 0.0f); glverte3f(1.0f, 0.0f, 1.0f); glend(); glendlist(); // // Dla każdej klatki: Pocje wsstkich wierchołków wsłam tlko ra Podcas renderowania kolejnch klatek korstam danch najdującch się w pamięci graficnej Znacąco skuje na tm wdajność Możliwości list wkracają poa wkłą definicję geometrii Możliwość użcia innch instrukcji mieniającch stan Nie ma możliwości modfikacji list po jej skompilowaniu glcalllist(id); 11 maja 2018 r. Bartos Baluk 33
VERTEX ARRAY Ciągła tablica po stronie klienta (w pamięci głównej) Ogólna charakterstka awierająca dane wierchołków Możliwość dowolnej manipulacji awartości Możliwość wbiórcego renderowania Rowiąuje problem redefinicji powtarającch się wierchołków, co daje oscędność pamięci Interleaved arras, cli łącone tablice dla różnch danch per-verte Np. pocja, wektor normaln, kolor, współrędne tekstur... Wsstko w jednej tablic (co ma i alet, i wad) v 5 v 6 11 maja 2018 r. Bartos Baluk 34
VERTEX ARRAY Utworenie tablic wartościami Sposób użcia Zwcajna tablica po stronie klienta Wskaanie serwerowi miejsca w pamięci, gdie najdują się dane Prekaanie adresu tablic Żądanie renderowania Można określić, które danch i w jakiej kolejności nas interesują v 5 v 6 11 maja 2018 r. Bartos Baluk 35
VERTEX ARRAY Prkład dla pierwsego quada: Sposób użcia (c.d.) GLfloat buffer[] = { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; // Renderowanie: glenableclientstate(gl_vertex_array); glvertepointer(3, GL_FLOAT, 0, buffer); gldrawarras(gl_quads, 0, 4); gldisableclientstate(gl_vertex_array); v 5 v 6 Ab wskaać gdie prechowwane są wartości innch atrbutów, można posłużć się funkcjami: glnormalpointer(), gltecoordpointer(), glverteattribpointer(),... 11 maja 2018 r. Bartos Baluk 36
VERTEX ARRAY Wbiórce renderowanie można realiować Wbiórce renderowanie na kilka różnch sposobów: Podakres tablic od-do: gldrawarras(primitive, from, to) Wskaanie indeksów wierchołków: gldrawelements(primitive, num_indices, inde_tpe, indices) Dięki temu nie musim redefiniować wierchołków! Prkład cał seścian: v v 5 v 6 1 v 2 GLfloat buffer[] = { 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f }; GLubte indices[] = { 0, 1, 2, 3, 3, 2, 6, 7, 7, 6, 5, 4, 4, 5, 1, 0, 0, 3, 7, 4, 1, 5, 6, 2 }; // Renderowanie: glenableclientstate(gl_vertex_array); glvertepointer(3, GL_FLOAT, 0, buffer); gldrawelements(gl_quads, 24, GL_UNSIGNED_BYTE, indices); gldisableclientstate(gl_vertex_array); 11 maja 2018 r. Bartos Baluk 37
VERTEX ARRAY Wbiórce renderowanie można realiować Wbiórce renderowanie na kilka różnch sposobów (c.d.): Wskaanie indeksów wierchołków ora ich akresu: gldrawrangeelements(primitive, start, end, num_indices, inde_tpe, indices) start i end określają akres wartości elementów tablic indeksów (nie akres tablic, któr ostanie użt!) Służ to do małej optmaliacji OpenGL będie wiediał, jakiego akresu indeksów się spodiewać be koniecności iterowania po tablic indeksów. W ten sposób może lepiej aplanować odct VA. Co cechuje Verte Arras? Możliwość dowolnej kontroli wartości w trakcie renderowania Prdatne pr animacji brł v 5 v 6 Koniecność presłania tablic do pamięci kart graficnej Dużo mniej odwołań do funkcji OpenGL 11 maja 2018 r. Bartos Baluk 38
WYBIÓRCZE RENDEROWANIE Prkład astosowania Inn prkład praktcnego wkorstania selektwnego renderowania geometrii użciem indeksów wierchołków: Level of detail (LOD) dla map wsokości v 5 v 6 Źródło obrau: http://windows-tech.info 11 maja 2018 r. Bartos Baluk 39
VERTEX ARRAY Prekawanie wartości dodatkowch atrbutów Dodatkowe atrbut wierchołków Nie tlko pocja (współrędne) jest wartością per-verte Wektor normalne, współrędne tekstur, wektor stcne, kolor, stopień niscenia, wiek, stopień deformacji, abrudenie, następna pocja,... Możem definiować własne atrbut, które wkorstam w nasch shaderach Są dwa podejścia rowiąania tej kwestii: Oddielne tablice dla każdego atrbutów Jedna tablica awierająca preplatające się wartości atrbutów (tw. interleaved arras) v 5 v 6 11 maja 2018 r. Bartos Baluk 40
INTERLEAVED ARRAYS Sposób diałania Interleaved arras prkład: Współrędne pocji (p) Wektor normaln (n) Współrędne 2D tekstur (t)... Parametr każdego atrbutu: offset odległość w bajtach od pocątku wierchołka v 5 v 6 stride odległość w bajtach pomięd wierchołkami Zakładając, że serokość każdej wartości to 4B, mam: offset(p) = 0, stride(p) = 32 offset(n) = 12, stride(n) = 32 offset(t) = 24, stride(t) = 32 11 maja 2018 r. Bartos Baluk 41
INTERLEAVED ARRAYS Sposób użcia Repreentacja interleaved arra w pamięci głównej punktu widenia programu Wgodnm podejściem jest użcie struktur C++ gwarantuje, że struktura ajmuje ciągł obsar pamięci, a składowe mają achowaną kolejność tpedef struct { GLfloat pos[3]; GLfloat normal[3]; GLfloat te[2]; } SVerte; SVerte buffer[]; v 5 v 6 glvertepointer(3, GL_FLOAT, sieof(sverte), buffer); glnormalpointer(gl_float, sieof(sverte), buffer + 3 * sieof(glfloat)); gltecoordpointer(2, GL_FLOAT, sieof(sverte), buffer + 6 * sieof(glfloat)); Zamiast artmetki wskaźników (mogącej doprowadić do problemów), warto wkorstać po prostu: &buffer[0].pos, &buffer[0].normal, &buffer[0].te 11 maja 2018 r. Bartos Baluk 42
INTERLEAVED ARRAYS Dodatkowe informacje Interleaved arras dodatkowe informacje: Jeśli np. planujem cęsto mieniać pocję wierchołków, poostawiając poostałe atrbut be mian, warto użć oddielnch tablic Warto dążć do tego, b stride bł równ wielokrotności 32. Wiele kart graficnch potrafi wted lepiej organiować odct pamięci Nawet kostem więksonego użcia pamięci, wprowadając padding! Możem określić stride jako 0, jeśli nase dane są ciasno upakowane (żadnego paddingu) i tablice awierają wartości tlko pojedncch atrbutów Jeśli nas układ danch jest standardow, można użć funkcji glinterleavedarras() w celu wboru tego układu (oscęda licbę wwołań funkcji OpenGL) v 5 v 6 11 maja 2018 r. Bartos Baluk 43
VBO Verte Buffer Object (VBO) technika powalająca Ogólna charakterstka na łatwe manipulowanie awartością pamięci kart graficnej Siostrana technika do Frame Buffer Object (FBO) i Piel Buffer Object (PBO) Powala areerwować, wpełnić, odctać, modfikować awartość bufora Po stronie klienta prechowwan jest jednie identfikator bufora Klient Serwer v 5 v 6 id (dane) VBO 11 maja 2018 r. Bartos Baluk 44
Sposób użcia VBO Wgenerowanie nowego bufora Otrmujem id bufora Bindowanie bufora Wbór bufora, któr ma stać się aktwn Określenie rodaju bufora (GL_ARRAY_BUFFER) Alokacja bufora Prekaanie danch do pamięci kart graficnej Określenie charakteru danch: c będą cęsto modfikowane, c też nie... Wpłwa na optmaln prdiał pamięci Wskaanie miejsc w pamięci v 5 v 6 Nie prekaujem wskaźników (bo ich nie mam), tlko określam licbowo offset i stride dla VBO Żądanie renderowania Można określić, które danch i w jakiej kolejności nas interesują 11 maja 2018 r. Bartos Baluk 45
Prkład użcia VBO Prkład dla pierwsego quada: GLfloat buffer[] = {0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f}; GLuint vbo; glgenbuffers(1, &vbo); glbindbuffer(gl_array_buffer, vbo); glbufferdata(gl_array_buffer, sieof(buffer), buffer, GL_STATIC_DRAW); delete[] buffer; // Ocwiście jest to błędne użcie (alokacja podcas kompilacji) glbindbuffer(gl_array_buffer, 0); // Renderowanie: glbindbuffer(gl_array_buffer, vbo); glenableclientstate(gl_vertex_array); glvertepointer(3, GL_FLOAT, 0, 0); v 5 v 6 gldrawarras(gl_quads, 0, 4); gldisableclientstate(gl_vertex_array); glbindbuffer(gl_array_buffer, 0); // Sprątanie: gldeletebuffers(1, &vbo); 11 maja 2018 r. Bartos Baluk 46
Modfikacja awartości VBO Istnieje możliwość modfikacji awartości VBO: Ponowna alokacja pamięci i wsłanie danch glbufferdata(target, sie, data, usage) Popre astąpienie cęści danch glbuffersubdata(target, offset, sie, data) Pamięć nie jest realokowana! Warto użć nawet, jeśli amieniam całą awartość bufora. Popre mapowanie pamięci glmapbuffer(target, access) glunmapbuffer(target) Otrmujem wskaźnik do pamięci, możem dowolnie ją ctać i mieniać Kostowna snchroniacja GPU Warto astanowić się nad wdajnością i snchroniacją v 5 v 6 Wkorstanie techniki podwójnego buforowania (dwa VBO, które amieniam miejscami rsujem jednego, drugi uaktualniam) może rowiąać problem snchroniacji 11 maja 2018 r. Bartos Baluk 47
Indeksowanie VBO IBO Wbiórce renderowanie VBO jest jesce lepse Mam możliwość stworenia bufora indeksów: Inde Buffer Object (IBO) IBO diała analogicnie do VBO: Musim go stworć, wbrać, aalokować, wpełnić, wolnić GL_ELEMENT_ARRAY_BUFFER IBO jest prechowwan w pamięci kart graficnej odct podcas renderowania nie wmaga presłania danch pamięci głównej! v 5 v 6 11 maja 2018 r. Bartos Baluk 48
Prkład użcia IBO Prkład cał seścian: GLfloat buffer[] = { 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f }; GLubte indices[] = { 0, 1, 2, 3, 3, 2, 6, 7, 7, 6, 5, 4, 4, 5, 1, 0, 0, 3, 7, 4, 1, 5, 6, 2 }; GLuint vbo, ibo; glgenbuffers(1, &vbo); glbindbuffer(gl_array_buffer, vbo); glbufferdata(gl_array_buffer, sieof(buffer), buffer, GL_STATIC_DRAW); delete[] buffer; glgenbuffers(1, &ibo); glbindbuffer(gl_element_array_buffer, ibo); glbufferdata(gl_element_array_buffer, sieof(indices), indices, GL_STATIC_DRAW); delete[] indices; v 5 v 6 // Renderowanie: glenableclientstate(gl_vertex_array); glvertepointer(3, GL_FLOAT, 0, buffer); gldrawelements(gl_quads, 24, GL_UNSIGNED_BYTE, 0); gldisableclientstate(gl_vertex_array); // Sprątanie: glbindbuffer(gl_array_buffer, 0); glbindbuffer(gl_element_array_buffer, 0); gldeletebuffers(1, &vbo); gldeletebuffers(1, &ibo); 11 maja 2018 r. Bartos Baluk 49
Bartos Baluk DEFINIOWANIE GEOMETRII Sposob opisu geometrii brł w OpenGL. http://baluk.net/psb Grafika Komputerowa, Informatka, I Rok