Vertex Buffer Object

A Vertex Buffer Object (VBO) az OpenGL egyik funkciója , amely módszereket biztosít az adatok ( csúcsok , normál vektorok , színek és így tovább) videoeszközre való kiírásához nem élő rendereléshez. A VBO-k jelentős teljesítménynövekedést adtak a közvetlen renderelési módhoz képest, elsősorban azért, mert az adatok a videoeszköz memóriájában vannak, nem a RAM-ban, és így közvetlenül a videoeszköz képes renderelni.

A Vertex Buffer Object specifikációt az OpenGL Architecture Review Board szabványosította az OpenGL 1.5-ös verziójaként (2003-ban). Hasonló funkciók a VBO-k szabványosítása előtt is elérhetők voltak az Nvidia "Vertex Array Range" [1] és az ATI "Vertex Array Object" [2] kiterjesztései révén .

A VBO fő funkciói

A következő funkciók képezik a VBO hozzáférés és manipuláció alapját:

OpenGL 1.4 -ben : GenBuffersARB (méret n, uint *pufferek) Létrehoz n új VBO-t, és előjel nélküli egész számként adja vissza az azonosítószámukat. A 0-s azonosító foglalt. BindBufferARB (enum target, uint puffer) A korábban létrehozott puffert használja aktív VBO-ként. BufferDataARB (enum target, sizeiptrARB méret, const void *data, enum használat) Adatokat tölt fel az aktív VBO-ra. DeleteBuffersARB (méret n, const uint *pufferek) Eltávolítja a megadott VBO-kat a tömbből vagy VBO-azonosítóból. OpenGL 2.1 : [3] , OpenGL 3.x [4] és OpenGL 4.x esetén az ARB utótag elhagyható a függvényekből: [5] GenBufferek (méret n, uint *pufferek) Létrehoz n új VBO-t, és előjel nélküli egész számként adja vissza az azonosítószámukat. A 0-s azonosító foglalt. BindBuffer (enum target, uint puffer) A korábban létrehozott puffert használja aktív VBO-ként. BufferData (enum target, sizeiptrARB méret, const void *data, enum használat) Adatokat tölt fel az aktív VBO-ra. DeleteBuffers (méret n, const uint *pufferek) Eltávolítja a megadott VBO-kat a tömbből vagy VBO-azonosítóból.

Példa a C-ben és az OpenGL 2.1-ben

//VBO inicializálás - egyszer, a program indításakor //Változó létrehozása a VBO azonosító tárolására GLUint triangleVBO ; // Háromszög csúcsok (az óramutató járásával ellentétes megkerülése) lebegő adatok [] = { 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , -1.0 , -1.0 , 0.0 , 1.0 }; //Új VBO létrehozása és a VBO azonosító mentése glGenBuffers ( 1 , & triangleVBO ); //VBO tevékenység beállítása glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO ); //Csúcspont adatok feltöltése videoeszközre glBufferData ( GL_ARRAY_BUFFER , sizeof ( data ), data , GL_STATIC_DRAW ); //Háromszög rajzolása VBO-ból - minden alkalommal megtörténik, amikor az ablak, a nézőpont vagy az adatok megváltoznak //Minden csúcsnak 3 koordinátáját állítsa be 0 lépésekben ebben a tömbben; szüksége van a glVertexPointerre ( 3 , GL_FLOAT , 0 , NULL ); //Az új VBO aktiválása. Ismételje meg ezt, ha megváltoztatta az inicializálást glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO ); //Ez a tömb csúcsokat tartalmaz (nem normálokat, színeket, textúrákat stb.) glEnableClientState ( GL_VERTEX_ARRAY ); //Háromszög rajzolása a csúcsok számának megadásával glDrawArrays ( GL_TRIANGLES , 0 , sizeof ( data ) / sizeof ( float ) / 3 ); //Utasítás az azonnali rajzolt megjelenítéshez glFlush ();

Példa C-ben és OpenGL 3.x-ben vagy OpenGL 4.x-ben

Egy függvény, amely bármilyen szöveges vagy bináris fájlt be tud olvasni egy bájtpufferbe:

/* Szöveges fájl beolvasása egy lefoglalt karakter pufferbe */ char * filetobuf ( char * fájl ) { FÁJL * fptr ; hosszú hosszúság ; char * buf ; fptr = fopen ( fájl , "rb" ); /* Fájl megnyitása olvasásra */ if ( ! fptr ) /* Hiba esetén NULL értéket ad vissza */ return NULL ; fseek ( fptr , 0 , SEEK_END ); /* A fájl végének megkeresése */ hossz = ftell ( fptr ); /* A fájl méretének kiszámítása bájtban */ buf = malloc ( hossz + 1 ); /* Még egy puffer lefoglalása a fájlhoz és a nullmutatóhoz */ fseek ( fptr , 0 , SEEK_SET ); /* Ugrás vissza a fájl elejére */ fread ( buf , hossz , 1 , fptr ); /* Olvassa be a fájl tartalmát a pufferbe */ fclose ( fptr ); /* Zárja be a fájlt */ buf [ hossz ] = 0 ; /* Null mutató beállítása puffervégi jelzőként */ return buf ; /* A kapott puffer visszaküldése */ }


Vertex shader:

/*----------------- "exampleVertexShader.vert" ------------------*/ #version 150 // Adja meg a GLSL általunk használt verzióját. // Az in_Position egy 0 indexű attribútumhoz lett társítva ("shaderAttribute") a vec3 in_Position -ban ; void main ( void ) { gl_Position = vec4 ( in_Position .x , in_Position .y , in_Position . z , 1.0 ) ; _ } /*------------------------------------------------ --------------- ---------------*/


Töredék árnyékoló:

/*---------------- "exampleFragmentShader.frag" -----------------*/ #version 150 // Adja meg a GLSL általunk használt verzióját. precíziós highp float ; // A videokártya illesztőprogramjai ezt követelik meg a következő sor megfelelő működéséhez out vec4 fragColor ; void main ( void ) { fragColor = vec4 ( 1.0 , 1.0 , 1.0 , 1.0 ); //Minden töredék színének beállítása fehérre } /*-------------------------------------- ----------- ------------------------*/


Fő OpenGL program:

/*--------------------- Fő OpenGL program ----------------------*/ /* Hozzon létre egy változót a VBO azonosító tárolására */ Gluint háromszög VBO ; /* Ez a shader program neve */ Gluint shaderProgram ; /* Ezek a mutatók címeket kapnak a shader forráskód memóriájában */ GLchar * vertexSource , * fragmentSource ; /* Ezeket a változókat a shaderekhez használják */ Gluint vertexShader , fragmentShader ; const unsigned int shaderAttribute = 0 ; const float NUM_OF_VERTICES_IN_DATA = 3 ; /* Háromszög csúcsai (bejárási irány: óramutató járásával ellentétes) */ lebegő adatok [ 3 ][ 3 ] = { { 0,0 , 1,0 , 0,0 }, { -1,0 , -1,0 , 0,0 }, { 1.0 , -1.0 , 0.0 } }; /*--------------------- VBO inicializálás - (egyszer megtörtént, a program indításakor) ---------------- -----*/ /* Hozzon létre egy új VBO-t, és használja a "triangleVBO" változót a VBO azonosító tárolásához */ glGenBuffers ( 1 , & triangleVBO ); /* Az új VBO aktiválása */ glBindBuffer ( GL_ARRAY_BUFFER , háromszögVBO ); /* Adatok feltöltése videoeszközre */ glBufferData ( GL_ARRAY_BUFFER , NUM_OF_VERTICES_IN_DATA * 3 * mérete ( float ), adat , GL_STATIC_DRAW ); /* Adja meg, hogy az attribútumindexben lévő koordinátaadatunk 0 (shaderAttribute), és csúcsonként 3 lebegést tartalmazzon */ glVertexAttribPointer ( shaderAttribute , 3 , GL_FLOAT , GL_FALSE , 0 , 0 ); /* A használt attribútumindex szerepeltetése 0 (shaderAttribute) */ glEnableVertexAttribArray ( shaderAttribute ); /* Az új VBO aktiválása */ glBindBuffer ( GL_ARRAY_BUFFER , háromszögVBO ); /*------------------------------------------------- -------------------------------------------------- -----*/ /*--------------------- Csúcs és töredék betöltése fájlokból, és lefordításuk ------------------- --*/ /* A shader kód beolvasása a megfelelő dinamikusan lefoglalt pufferekbe */ vertexSource = filetobuf ( "exampleVertexShader.vert" ); fragmentSource = filetobuf ( "exampleFragmentShader.frag" ); /* Rendeljen "neveket" kezelőinknek az új shader objektumokhoz */ vertexShader = glCreateShader ( GL_VERTEX_SHADER ); fragmentShader = glCreateShader ( GL_FRAGMENT_SHADER ); /* A shader forráspufferek egyesítése a megfelelő kezelőkkel */ glShaderSource ( vertexShader , 1 , ( const GLchar ** ) & vertexSource , 0 ); glShaderSource ( fragmentShader , 1 , ( const GLchar ** ) & fragmentSource , 0 ); /* A korábban lefoglalt memória felszabadítása */ ingyenes ( vertexSource ); ingyenes ( fragmentSource ); /* Állítsd össze shader kódjainkat */ glCompileShader ( vertexShader ); glCompileShader ( fragmentShader ); /*------------------------------------------------- -------------------------------------------------- -----*/ /*-------------------- Shader program készítése, a shader csatolása és linkelése ----------------- ----*/ /* Adjon nevet a kezelő programunknak */ shaderProgram = glCreateProgram (); /* Shadereink csatolása a shader programhoz */ glAttachShader ( shaderProgram , vertexShader ); glAttachShader ( shaderProgram , fragmentShader ); /* 0 attribútumindex (shaderAttribute) társítása az in_Position elemhez */ /* Az "in_Position" az adattömböt jelenti a vertex shaderben */ glBindAttribLocation ( shaderProgram , shaderAttribute , "in_Position" ); /* Linkelje be a shader programot */ glLinkProgram ( shaderProgram ); /*------------------------------------------------- -------------------------------------------------- -----*/ /* A shader programunk aktiválása */ glUseProgram ( shaderProgram ); /* A háttér beállítása feketére */ glClearColor ( 0.0 , 0.0 , 0.0 , 1.0 ); /* Tiszta háttérszín */ glClear ( GL_COLOR_BUFFER_BIT ); /* Háromszög rajzolásakor a csúcsszámokat a glDrawArrays meghívásával adjuk át, mondván, hogy a megadott háromszögeink és 0-3 csúcsokat akarunk rajzolni */ glDrawArrays ( GL_TRIANGLES , 0 , 3 ); /*------------------------------------------------- ---------------*/

Lásd még

Jegyzetek

  1. GL_NV_vertex_array_range Whitepaper . Archiválva az eredetiből 2013. május 22-én.
  2. ATI_vertex_array_object . Archiválva az eredetiből 2013. május 22-én.
  3. OpenGL 2.1 funkcióhivatkozás . Archiválva az eredetiből 2013. május 22-én.
  4. OpenGL 3.3 funkcióhivatkozás . Archiválva az eredetiből 2013. május 22-én.
  5. OpenGL 4.2 funkcióhivatkozás (nem elérhető hivatkozás) . Letöltve: 2013. május 5. Az eredetiből archiválva : 2013. május 22.. 

Linkek