Vertex buffertobjekt
Vertex Buffer Object (VBO) är en funktion i OpenGL som tillhandahåller metoder för att dumpa data ( hörn , normala vektorer , färger och så vidare) till videoenheten för icke-live-rendering. VBO:er gav en betydande prestandaökning jämfört med direktåtergivningsläge, främst för att data finns i videoenhetens minne, inte i RAM, och så att den kan renderas direkt av videoenheten.
Vertex Buffer Object-specifikationen standardiserades av OpenGL Architecture Review Board som OpenGL version 1.5 (2003). Liknande funktionalitet var tillgänglig före standardiseringen av VBO:er genom Nvidias "Vertex Array Range" [1] och ATI :s "Vertex Array Object" [2] tillägg .
Huvudfunktioner för VBO
Följande funktioner utgör grunden för VBO-åtkomst och manipulation:
I OpenGL 1.4 :
GenBuffersARB (storlek n, uint *buffertar)
Skapar n nya VBO och returnerar deras ID-nummer som ett osignerat heltal. ID 0 är reserverat.
BindBufferARB (enum target, uint buffer)
Använder den tidigare skapade bufferten som aktiv VBO.
BufferDataARB (enum target, sizeiptrARB size, const void *data, enum use)
Laddar upp data till den aktiva VBO:n.
DeleteBuffersARB (sizei n, const uint *buffers)
Tar bort de angivna VBO:erna från arrayen eller VBO-id.
I OpenGL 2.1 :
[3] , OpenGL 3.x
[4] och OpenGL 4.x kan ARB-suffixet utelämnas från funktionerna:
[5]
Genbuffertar (storlek n, uint *buffrar)
Skapar n nya VBO och returnerar deras ID-nummer som ett osignerat heltal. ID 0 är reserverat.
BindBuffer (enum target, uint buffer)
Använder den tidigare skapade bufferten som aktiv VBO.
BufferData (enum target, sizeiptrARB size, const void *data, enum use)
Laddar upp data till den aktiva VBO:n.
Ta bort buffertar (storlek, konst uint *buffertar)
Tar bort de angivna VBO:erna från arrayen eller VBO-id.
Exempel i C och OpenGL 2.1
//VBO-initiering - gjort en gång, vid programstart
//Skapar en variabel för att lagra VBO-identifieraren
GLuint triangleVBO ;
// Triangelhörn (förbikoppling moturs)
flytdata [ ] = { 1,0 , 0,0 , 1,0 , 0,0 , 0,0 , -1,0 , -1,0 , 0,0 , 1,0 };
//Skapa en ny VBO och spara VBO ID
glGenBuffers ( 1 , & triangleVBO );
//Ställ in VBO-aktivitet
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
//Ladda upp vertexdata till videoenheten
glBufferData ( GL_ARRAY_BUFFER , sizeof ( data ), data , GL_STATIC_DRAW );
//Rita triangel från VBO - händer varje gång fönstret, synvinkeln eller data ändras
//Ange 3 koordinater för varje vertex i 0 steg i denna array; den behöver
glVertexPointer ( 3 , GL_FLOAT , 0 , NULL );
//Gör den nya VBO:en aktiv. Upprepa detta om ändrat från initialisering
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
//Denna array innehåller hörn (inte normaler, färger, texturer, etc.)
glEnableClientState ( GL_VERTEX_ARRAY );
//Rita en triangel genom att ange antalet hörn
glDrawArrays ( GL_TRIANGLES , 0 , sizeof ( data ) / sizeof ( float ) / 3 );
//Instruktion att visa ritad omedelbart
glFlush ();
Exempel i C och OpenGL 3.x eller OpenGL 4.x
En funktion som kan läsa vilken text eller binär fil som helst i en bytebuffert:
/* Funktion för att läsa en textfil i en allokerad char-buffert */
char * filetobuf ( char * fil )
{
FIL * fptr ;
lång längd ;
char * buf ;
fptr = fopen ( fil , "rb" ); /* Öppna fil för läsning */
if ( ! fptr ) /* Returnera NULL vid fel */
returnera NULL ;
fseek ( fptr , 0 , SEEK_END ); /* Hitta slutet av filen */
längd = ftell ( fptr ); /* Beräkna filstorlek i byte */
buf = malloc ( längd + 1 ); /* Tilldela ytterligare en buffert för fil och nollpekare */
fseek ( fptr , 0 , SEEK_SET ); /* Hoppa tillbaka till början av filen */
fread ( buf , längd , 1 , fptr ); /* Läs innehållet i filen i bufferten */
fclose ( fptr ); /* Stäng filen */
buf [ längd ] = 0 ; /* Ställ in nollpekare som slutmarkör för buffert */
returnera buff ; /* Returnera den mottagna bufferten */
}
Vertex shader:
/*----------------- "exampleVertexShader.vert" ------------------*/
#version 150 // Ange vilken version av GLSL vi använder.
// in_Position har associerats med ett attribut med index 0 ("shaderAttribute")
i vec3 in_Position ;
void main ( void )
{
gl_Position = vec4 ( in_Position . x , in_Position . y , in_Position . z , 1.0 );
}
/*------------------------------------------------------- --------------- -------------------/
Fragment Shader:
/*---------------- "exampleFragmentShader.frag" ----------------*/
#version 150 // Ange vilken version av GLSL vi använder.
precision högt flytande ; // Drivrutiner för grafikkort kräver detta för att nästa rad ska fungera korrekt
ut vec4 fragColor ;
void main ( void )
{
fragColor = vec4 ( 1.0 , 1.0 , 1.0 , 1.0 ); //Ställ in färgen på varje fragment till vit
}
/*------------------------------------------------ ----------- --------------------------------*/
Huvudprogram för OpenGL:
/*--------------------- Huvud OpenGL-program ---------------------*/
/* Skapa en variabel för att lagra VBO-identifieraren */
GLuint triangel VBO ;
/* Detta är namnet på shader-programmet */
GLuint shaderProgram ;
/* Dessa pekare kommer att få adresser i shaderns källkodsminne */
GLchar * vertexSource , * fragmentSource ;
/* Dessa variabler används för shaders */
GLuint vertexShader , fragmentShader ;
const unsigned int shaderAttribute = 0 ;
const float NUM_OF_VERTICES_IN_DATA = 3 ;
/* Triangelhörn (traverseringsriktning: moturs) */
flytdata [ 3 ] [ 3 ] = {
{ 0,0 , 1,0 , 0,0 },
{ -1,0 , -1,0 , 0,0 },
{ 1,0 , -1,0 , 0,0 }
};
/*--------------------- VBO-initiering - (gjord en gång, vid programstart) --------------- - -----*/
/* Skapa en ny VBO och använd variabeln "triangleVBO" för att lagra VBO-id */
glGenBuffers ( 1 , & triangleVBO );
/* Gör den nya VBO aktiv */
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
/* Ladda upp data till videoenhet */
glBufferData ( GL_ARRAY_BUFFER , NUM_OF_VERTICES_IN_DATA * 3 * storlek på ( flytande ), data , GL_STATIC_DRAW );
/* Ange att vår koordinatdata i attributindex är 0 (shaderAttribute) och innehåller 3 flytningar per vertex */
glVertexAttribPointer ( shaderAttribute , 3 , GL_FLOAT , GL_FALSE , 0 , 0 );
/* Inkludera attributindex lika med 0 (shaderAttribute) som används */
glEnableVertexAttribArray ( shaderAttribute );
/* Gör den nya VBO aktiv */
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
/*------------------------------------------------ -------------------------------------------------- -----*/
/*--------------------- Ladda Vertex och Fragment från filer och kompilera dem ------------------ --*/
/* Läs skuggningskod i lämpliga dynamiskt allokerade buffertar */
vertexSource = filetobuf ( "exampleVertexShader.vert" );
fragmentSource = filetobuf ( "exampleFragmentShader.frag" );
/* Tilldela "namn" till våra hanterare för de nya shader-objekten */
vertexShader = glCreateShader ( GL_VERTEX_SHADER );
fragmentShader = glCreateShader ( GL_FRAGMENT_SHADER );
/* Slå ihop skuggkällbuffertarna med deras respektive hanterare */
glShaderSource ( vertexShader , 1 , ( const GLchar ** ) & vertexSource , 0 );
glShaderSource ( fragmentShader , 1 , ( const GLchar ** ) & fragmentSource , 0 );
/* Frigör det tidigare tilldelade minnet */
gratis ( vertexSource );
gratis ( fragmentkälla );
/* Sammanställ våra shader-koder */
glCompileShader ( vertexShader );
glCompileShader ( fragmentShader );
/*------------------------------------------------ -------------------------------------------------- -----*/
/*-------------------- Skapa ett skuggningsprogram, fästa skuggningen till det och länka ---------------- ----*/
/* Tilldela ett namn till vårt hanterarprogram */
shaderProgram = glCreateProgram ();
/* Fäst våra shaders till shaderprogrammet */
glAttachShader ( shaderProgram , vertexShader );
glAttachShader ( shaderProgram , fragmentShader );
/* Associera ett attributindex på 0 (shaderAttribute) med in_Position */
/* "in_Position" kommer att representera datamatrisen i vertex shader */
glBindAttribLocation ( shaderProgram , shaderAttribute , "in_Position" );
/* Länka shader-programmet */
glLinkProgram ( shaderProgram );
/*------------------------------------------------ -------------------------------------------------- -----*/
/* Aktivera vårt shader-program */
glUseProgram ( shaderProgram );
/* Ställ in bakgrunden till svart */
glClearColor ( 0,0 , 0,0 , 0,0 , 1,0 );
/* Rensa bakgrundsfärg */
glClear ( GL_COLOR_BUFFER_BIT );
/* Rita en triangel, vertexnummer passeras genom att anropa glDrawArrays
och säger att våra givna trianglar och vi vill rita hörn 0-3
*/
glDrawArrays ( GL_TRIANGLES , 0 , 3 );
/*------------------------------------------------ ---------------*/
Se även
Anteckningar
- ↑ GL_NV_vertex_array_range Whitepaper . Arkiverad från originalet den 22 maj 2013. (obestämd)
- ↑ ATI_vertex_array_object . Arkiverad från originalet den 22 maj 2013. (obestämd)
- ↑ Funktionsreferens för OpenGL 2.1 . Arkiverad från originalet den 22 maj 2013. (obestämd)
- ↑ Funktionsreferens för OpenGL 3.3 . Arkiverad från originalet den 22 maj 2013. (obestämd)
- ↑ Funktionsreferens för OpenGL 4.2 (inte tillgänglig länk) . Hämtad 5 maj 2013. Arkiverad från originalet 22 maj 2013. (obestämd)
Länkar