Vertex Buffer Objekt
Vertex Buffer Object (VBO) er en funktion i OpenGL , der giver metoder til at dumpe data ( hjørner , normale vektorer , farver og så videre) til videoenheden til ikke-live-gengivelse. VBO'er gav et betydeligt ydelsesboost i forhold til direkte gengivelsestilstand, primært fordi dataene ligger i videoenhedens hukommelse, ikke i RAM, og derfor kan de gengives direkte af videoenheden.
Vertex Buffer Object-specifikationen blev standardiseret af OpenGL Architecture Review Board som OpenGL version 1.5 (i 2003). Lignende funktionalitet var tilgængelig før standardiseringen af VBO'er gennem Nvidias "Vertex Array Range" [1] og ATI 's "Vertex Array Object" [2] udvidelser .
VBO's hovedfunktioner
Følgende funktioner danner grundlag for VBO-adgang og -manipulation:
I OpenGL 1.4 :
GenBuffersARB (størrelse n, uint *buffere)
Opretter n nye VBO'er og returnerer deres ID-nummer som et usigneret heltal. ID 0 er reserveret.
BindBufferARB (enum target, uint buffer)
Bruger den tidligere oprettede buffer som den aktive VBO.
BufferDataARB (enum target, sizeiptrARB size, const void *data, enum usage)
Uploader data til den aktive VBO.
DeleteBuffersARB (størrelse n, const uint *buffere)
Fjerner de angivne VBO'er fra arrayet eller VBO-id'et.
I OpenGL 2.1 :
[3] , OpenGL 3.x
[4] og OpenGL 4.x kan ARB-suffikset udelades fra funktionerne:
[5]
Genbuffere (størrelse n, uint *buffere)
Opretter n nye VBO'er og returnerer deres ID-nummer som et usigneret heltal. ID 0 er reserveret.
BindBuffer (enum target, uint buffer)
Bruger den tidligere oprettede buffer som den aktive VBO.
BufferData (enum target, sizeiptrARB size, const void *data, enum usage)
Uploader data til den aktive VBO.
Slet Buffere (størrelse, konstitueret *buffere)
Fjerner de angivne VBO'er fra arrayet eller VBO-id'et.
Eksempel i C og OpenGL 2.1
//VBO initialisering - udført én gang, ved programstart
//Oprettelse af en variabel til at gemme VBO identifikatoren
GLuint triangleVBO ;
// Trekanthjørnepunkter (omgået mod uret)
flydedata [ ] = { 1,0 , 0,0 , 1,0 , 0,0 , 0,0 , -1,0 , -1,0 , 0,0 , 1,0 };
//Opret en ny VBO og gem VBO ID
glGenBuffers ( 1 , & triangleVBO );
//Set VBO-aktivitet
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
//Upload toppunktsdata til videoenheden
glBufferData ( GL_ARRAY_BUFFER , sizeof ( data ), data , GL_STATIC_DRAW );
//Tegnende trekant fra VBO - sker hver gang vinduet, synspunktet eller data ændres
//Sæt 3 koordinater for hvert toppunkt i 0 intervaller i dette array; den har brug for
glVertexPointer ( 3 , GL_FLOAT , 0 , NULL );
//Gør den nye VBO aktiv. Gentag dette hvis ændret fra initialisering
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
//Dette array indeholder hjørner (ikke normaler, farver, teksturer osv.)
glEnableClientState ( GL_VERTEX_ARRAY );
//Tegn en trekant ved at angive antallet af hjørner
glDrawArrays ( GL_TRIANGLES , 0 , sizeof ( data ) / sizeof ( float ) / 3 );
//Instruktion til at vise tegnet straks
glFlush ();
Eksempel i C og OpenGL 3.x eller OpenGL 4.x
En funktion, der kan læse enhver tekst eller binær fil i en bytebuffer:
/* Funktion til at læse en tekstfil ind i en tildelt tegnbuffer */
char * filetobuf ( char * fil )
{
FIL * fptr ;
lang længde ;
char * buf ;
fptr = fopen ( fil , "rb" ); /* Åbn fil til læsning */
if ( ! fptr ) /* Returner NULL ved fejl */
returner NULL ;
fseek ( fptr , 0 , SEEK_END ); /* Find slutningen af filen */
længde = ftell ( fptr ); /* Beregn filstørrelse i bytes */
buf = malloc ( længde + 1 ); /* Tildel en buffer mere til fil og nul-markør */
fseek ( fptr , 0 , SEEK_SET ); /* Hop tilbage til begyndelsen af filen */
fread ( buf , længde , 1 , fptr ); /* Læs indholdet af filen ind i bufferen */
fclose ( fptr ); /* Luk filen */
buf [ længde ] = 0 ; /* Indstil null-markør som ende-på-buffermarkør */
returnere buf ; /* Returner den resulterende buffer */
}
Vertex shader:
/*----------------- "eksempelVertexShader.vert" ------------------*/
#version 150 // Angiv den version af GLSL vi bruger.
// in_Position er blevet forbundet med en attribut med indeks 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:
/*---------------- "eksempelFragmentShader.frag" ----------------*/
#version 150 // Angiv den version af GLSL vi bruger.
præcision highp flyder ; // Videokortdrivere kræver dette, for at næste linje kan fungere korrekt
ud vec4 fragColor ;
void main ( void )
{
fragColor = vec4 ( 1.0 , 1.0 , 1.0 , 1.0 ); //Sæt farven på hvert fragment til hvid
}
/*------------------------------------------------ ----------- --------------------------------*/
Hoved OpenGL-program:
/*--------------------- Hoved OpenGL-program ---------------------*/
/* Opret en variabel for at gemme VBO-id'et */
GLuint trekant VBO ;
/* Dette er navnet på shader-programmet */
GLuint shaderProgram ;
/* Disse pointere vil få adresser i shaderens kildekodehukommelse */
GLchar * vertexSource , * fragmentSource ;
/* Disse variabler bruges til shaders */
GLuint vertexShader , fragmentShader ;
const unsigned int shaderAttribute = 0 ;
const float NUM_OF_VERTICES_IN_DATA = 3 ;
/* Trekanthjørnepunkter (traverseringsretning: mod uret) */
flydende data [ 3 ][ 3 ] = {
{ 0,0 , 1,0 , 0,0 },
{ -1,0 , -1,0 , 0,0 },
{ 1,0 , -1,0 , 0,0 }
};
/*--------------------- VBO initialisering - (udført én gang, ved programstart) --------------- - -----*/
/* Opret en ny VBO og brug variablen "triangleVBO" til at gemme VBO-id'et */
glGenBuffere ( 1 , & triangleVBO );
/* Gør den nye VBO aktiv */
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
/* Upload data til videoenhed */
glBufferData ( GL_ARRAY_BUFFER , NUM_OF_VERTICES_IN_DATA * 3 * størrelse på ( float ), data , GL_STATIC_DRAW );
/* Angiv, at vores koordinatdata i attributindekset er 0 (shaderAttribute) og indeholder 3 flydere pr. vertex */
glVertexAttribPointer ( shaderAttribute , 3 , GL_FLOAT , GL_FALSE , 0 , 0 );
/* Inkluder attributindeks lig med 0 (shaderAttribute) som brugt */
glEnableVertexAttribArray ( shaderAttribute );
/* Gør den nye VBO aktiv */
glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO );
/*------------------------------------------------ -------------------------------------------------- -----*/
/*--------------------- Indlæs Vertex og Fragment fra filer og kompiler dem ------------------ --*/
/* Læs shader-kode i passende dynamisk allokerede buffere */
vertexSource = filetobuf ( "exampleVertexShader.vert" );
fragmentSource = filetobuf ( "exampleFragmentShader.frag" );
/* Tildel "navne" til vores handlere for de nye shader-objekter */
vertexShader = glCreateShader ( GL_VERTEX_SHADER );
fragmentShader = glCreateShader ( GL_FRAGMENT_SHADER );
/* Flet shader-kildebufferne med deres respektive handlere */
glShaderSource ( vertexShader , 1 , ( const GLchar ** ) & vertexSource , 0 );
glShaderSource ( fragmentShader , 1 , ( const GLchar ** ) & fragmentSource , 0 );
/* Frigør den tidligere tildelte hukommelse */
gratis ( vertexSource );
gratis ( fragmentkilde );
/* Kompiler vores shader-koder */
glCompileShader ( vertexShader );
glCompileShader ( fragmentShader );
/*------------------------------------------------ -------------------------------------------------- -----*/
/*-------------------- Oprettelse af et shader-program, vedhæftning af shaderen til det og linking -------------------- ----*/
/* Tildel et navn til vores handlerprogram */
shaderProgram = glCreateProgram ();
/* Vedhæft vores shaders til shader-programmet */
glAttachShader ( shaderProgram , vertexShader );
glAttachShader ( shaderProgram , fragmentShader );
/* Tilknyt et attributindeks på 0 (shaderAttribute) med in_Position */
/* "in_Position" vil repræsentere dataarrayet i vertex shader */
glBindAttribLocation ( shaderProgram , shaderAttribute , "in_Position" );
/* Link shader-programmet */
glLinkProgram ( shaderProgram );
/*------------------------------------------------ -------------------------------------------------- -----*/
/* Indstil vores shader-program aktivt */
glUseProgram ( shaderProgram );
/* Indstil baggrunden til sort */
glClearColor ( 0.0 , 0.0 , 0.0 , 1.0 );
/* Ryd baggrundsfarve */
glClear ( GL_COLOR_BUFFER_BIT );
/* Tegning af en trekant, vertex-numre passeres ved at kalde glDrawArrays
og sige, at vores givne trekanter og vi vil tegne toppunkter 0-3
*/
glDrawArrays ( GL_TRIANGLES , 0 , 3 );
/*------------------------------------------------ -------------/
Se også
Noter
- ↑ GL_NV_vertex_array_range Whitepaper . Arkiveret fra originalen den 22. maj 2013. (ubestemt)
- ↑ ATI_vertex_array_object . Arkiveret fra originalen den 22. maj 2013. (ubestemt)
- ↑ OpenGL 2.1 funktionsreference . Arkiveret fra originalen den 22. maj 2013. (ubestemt)
- ↑ OpenGL 3.3 funktionsreference . Arkiveret fra originalen den 22. maj 2013. (ubestemt)
- ↑ OpenGL 4.2 funktionsreference (utilgængeligt link) . Hentet 5. maj 2013. Arkiveret fra originalen 22. maj 2013. (ubestemt)
Links