Oscuridao Admin
Mesaje : 352 Data de inscriere : 27/08/2011 Varsta : 29 Localizare : Romania
| Subiect: How to get attributes to a shader, bind locations, get location, for older version like 100, 110, 120, 130, 150, opengl short guide Lun Apr 04, 2016 6:51 pm | |
| How to bind attributes to a shader, how to get attributes location, how to send data like: color, to a shader, on older version like 100, 110, 120, 130, 140, 150 etc, here is an opengl and C++ guide. This should be working for all. Simple Example of Vertex Shader://the vertex shader starts here:#version 130 //the version used
in vec2 vertexPosition; //get input a vec2 containing the position of the vertices attribute vec3 color; //get an attribute vec3 containing the color for each vertex out vec3 thecolor; //get to the fragment shader a vec3 called thecolor.
void main() { gl_Position.xy=vertexPosition; //the position for X and Y is given in the vertexPosition //(2d) gl_Position.z=-1.0; //set the third dimension for Z to 1.0; gl_Position.w=1.0; //set the value for W to 1.0, thecolor=color; //thecolor is now getting information from color (which was the color input from the source code). }
//the vertex shader ends here:This particular shader doesn't do much, but it does well. Just gets the position and color from the program's source code. The position which is a 2d position (containing only X and Y), and then get a 1.0 position for Z (automatically), and 1.0 position for W, in the same way. The color gets into the vertex shader with the name "color" and then is copied to a new vector on the same size called "thecolor" and sent it to the fragment shader. Simple Example of Fragment Shader://the fragment shader starts here
#version 130 //the version used in vec3 thecolor; //gets as input a vec3 named "the color" which comes here from the vertex shader aboveout vec3 color; //outputs on the screen the information of a vec3 named "color"
void main() { color=thecolor; //"color" gets all the information from "thecolor"; }
//the fragment shader ends hereNow in the source code: GLfloat triangle[] //the position of the vertices { 0.2,0.2, 0.6,0.2, 0.4,0.5, -0.6,0.0, 0.4,-0.5, };//Creating a buffer which contains all the position above (from triangle):GLuint trianglebufferID; glGenBuffers(1, &trianglebufferID); glBindBuffer(GL_ARRAY_BUFFER, trianglebufferID); glBufferData(GL_ARRAY_BUFFER,sizeof(triangle), triangle, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0,2,GL_FLOAT, GL_FALSE, 0, 0); //Creating a buffer for the indices (just to let the vertexshader know, how many of these vertices we want drew);
GLuint vertices[] = {0,1,2,0,3,4}; //important to use for vertices only GLuint, and GLushort; GLuint indices; glGenBuffers(1, &indices); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //The color value for each vertex:GLfloat color[] { 1.0,0.0,0.0, 0.0,1.0,0.0, 0.0,0.0,1.0, 0.0,1.0,1.0, 1.0,0.0,1.0 };
//Getting a buffer for the color: GLint colorlocation; //this variable will store the value of the colorlocation attribute from the vertex shader (in our case was named "color" see this line: attribute vec3 color;) GLuint colorbufferID; glGenBuffers(1,&colorbufferID); colorlocation = glGetAttribLocation(programID, "color"); //this function return the //value of the location which is set in the vertexshader for the color attribute: glBindBuffer(GL_ARRAY_BUFFER, colorbufferID); glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW); glEnableVertexAttribArray(colorlocation); glVertexAttribPointer(colorlocation,3,GL_FLOAT,GL_FALSE,0,0);
//Drawing to the screen: glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_INT, nullptr); //because we have a buffer for indices; SDL_GL_SwapWindow(window); //put the drew window on the screen;
If you are stuck understanding this, here is the code for the entire project! | |
|