Vertex Buffer Object - Example Usage in C Using OpenGL 3.x and OpenGL 4.x

Example Usage in C Using OpenGL 3.x and OpenGL 4.x

Function which can read any text or binary file into char buffer:

/* Function will read a text file into allocated char buffer */ char* filetobuf(char *file) { FILE *fptr; long length; char *buf; fptr = fopen(file, "rb"); /* Open file for reading */ if (!fptr) /* Return NULL on failure */ return NULL; fseek(fptr, 0, SEEK_END); /* Seek to the end of the file */ length = ftell(fptr); /* Find out how many bytes into the file we are */ buf = malloc(length+1); /* Allocate a buffer for the entire length of the file and a null terminator */ fseek(fptr, 0, SEEK_SET); /* Go back to the beginning of the file */ fread(buf, length, 1, fptr); /* Read the contents of the file in to the buffer */ fclose(fptr); /* Close the file */ buf = 0; /* Null terminator */ return buf; /* Return the buffer */ }


Vertex Shader:

/*----------------- "exampleVertexShader.vert" -----------------*/ #version 150 // Specify which version of GLSL we are using. // in_Position was bound to attribute index 0("shaderAttribute") in 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 // Specify which version of GLSL we are using. precision highp float; // Video card drivers require this next line to function properly out vec4 fragColor; void main(void) { fragColor = vec4(1.0,1.0,1.0,1.0); //Set colour of each fragment to WHITE } /*--------------------------------------------------------------*/


Main OpenGL Program:

/*--------------------- Main OpenGL Program ---------------------*/ /* Create a variable to hold the VBO identifier */ GLuint triangleVBO; /* This is a handle to the shader program */ GLuint shaderProgram; /* These pointers will receive the contents of our shader source code files */ GLchar *vertexSource, *fragmentSource; /* These are handles used to reference the shaders */ GLuint vertexShader, fragmentShader; const unsigned int shaderAttribute = 0; const float NUM_OF_VERTICES_IN_DATA=3; /* Vertices of a triangle (counter-clockwise winding) */ float data = { { 0.0, 1.0, 0.0 }, { -1.0, -1.0, 0.0 }, { 1.0, -1.0, 0.0 } }; /*---------------------- Initialise VBO - (Note: do only once, at start of program) ---------------------*/ /* Create a new VBO and use the variable "triangleVBO" to store the VBO id */ glGenBuffers(1, &triangleVBO); /* Make the new VBO active */ glBindBuffer(GL_ARRAY_BUFFER, triangleVBO); /* Upload vertex data to the video device */ glBufferData(GL_ARRAY_BUFFER, NUM_OF_VERTICES_IN_DATA * 3 * sizeof(float), data, GL_STATIC_DRAW); /* Specify that our coordinate data is going into attribute index 0(shaderAttribute), and contains three floats per vertex */ glVertexAttribPointer(shaderAttribute, 3, GL_FLOAT, GL_FALSE, 0, 0); /* Enable attribute index 0(shaderAttribute) as being used */ glEnableVertexAttribArray(shaderAttribute); /* Make the new VBO active. */ glBindBuffer(GL_ARRAY_BUFFER, triangleVBO); /*-------------------------------------------------------------------------------------------------------*/ /*--------------------- Load Vertex and Fragment shaders from files and compile them --------------------*/ /* Read our shaders into the appropriate buffers */ vertexSource = filetobuf("exampleVertexShader.vert"); fragmentSource = filetobuf("exampleFragmentShader.frag"); /* Assign our handles a "name" to new shader objects */ vertexShader = glCreateShader(GL_VERTEX_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); /* Associate the source code buffers with each handle */ glShaderSource(vertexShader, 1, (const GLchar**)&vertexSource, 0); glShaderSource(fragmentShader, 1, (const GLchar**)&fragmentSource, 0); /* Free the temporary allocated memory */ free(vertexSource); free(fragmentSource); /* Compile our shader objects */ glCompileShader(vertexShader); glCompileShader(fragmentShader); /*-------------------------------------------------------------------------------------------------------*/ /*-------------------- Create shader program, attach shaders to it and then link it ---------------------*/ /* Assign our program handle a "name" */ shaderProgram = glCreateProgram; /* Attach our shaders to our program */ glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); /* Bind attribute index 0 (shaderAttribute) to in_Position*/ /* "in_Position" will represent "data" array's contents in the vertex shader */ glBindAttribLocation(shaderProgram, shaderAttribute, "in_Position"); /* Link shader program*/ glLinkProgram(shaderProgram); /*-------------------------------------------------------------------------------------------------------*/ /* Set shader program as being actively used */ glUseProgram(shaderProgram); /* Set background colour to BLACK */ glClearColor(0.0, 0.0, 0.0, 1.0); /* Clear background with BLACK colour */ glClear(GL_COLOR_BUFFER_BIT); /* Actually draw the triangle, giving the number of vertices provided by invoke glDrawArrays while telling that our data is a triangle and we want to draw 0-3 vertexes */ glDrawArrays(GL_TRIANGLES, 0, 3); /*---------------------------------------------------------------*/

Read more about this topic:  Vertex Buffer Object

Famous quotes containing the word usage:

    Pythagoras, Locke, Socrates—but pages
    Might be filled up, as vainly as before,
    With the sad usage of all sorts of sages,
    Who in his life-time, each was deemed a bore!
    The loftiest minds outrun their tardy ages.
    George Gordon Noel Byron (1788–1824)