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
- ↑ GL_NV_vertex_array_range Whitepaper . Archiválva az eredetiből 2013. május 22-én. (határozatlan)
- ↑ ATI_vertex_array_object . Archiválva az eredetiből 2013. május 22-én. (határozatlan)
- ↑ OpenGL 2.1 funkcióhivatkozás . Archiválva az eredetiből 2013. május 22-én. (határozatlan)
- ↑ OpenGL 3.3 funkcióhivatkozás . Archiválva az eredetiből 2013. május 22-én. (határozatlan)
- ↑ 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.. (határozatlan)
Linkek