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

  1. GL_NV_vertex_array_range Whitepaper . Arkiveret fra originalen den 22. maj 2013.
  2. ATI_vertex_array_object . Arkiveret fra originalen den 22. maj 2013.
  3. OpenGL 2.1 funktionsreference . Arkiveret fra originalen den 22. maj 2013.
  4. OpenGL 3.3 funktionsreference . Arkiveret fra originalen den 22. maj 2013.
  5. OpenGL 4.2 funktionsreference (utilgængeligt link) . Hentet 5. maj 2013. Arkiveret fra originalen 22. maj 2013. 

Links