#include #include #include using namespace std; enum VAO_IDs {Triangles, NumVAOs}; enum Buffer_IDs {ArrayBuffer, NumBuffers}; enum Attrib_IDs {vPosition, vColor, Scalefactor}; GLuint VAOs[NumVAOs]; GLuint Buffers[NumBuffers]; const GLuint NumVertices = 6; const GLuint VertexSize = 9; struct Vstruct { GLfloat vertex[2*NumVertices]; GLfloat colors[4*NumVertices]; GLfloat scale [3*NumVertices]; }; Vstruct vertices = { .vertex = {{ -0.90, -0.90}, { 0.85, -0.90}, { -0.90, 0.85}, { 0.90, -0.85}, { 0.90, 0.90}, { -0.85, 0.90}}, .colors = {{1.0, 1.0 , 0.0, 1.0}, {0.0, 1.0 , 0.0, 1.0}, {0.0, 0.0 , 1.0, 1.0}, {1.0, 1.0 , 0.0, 1.0}, {1.0, 0.0 , 1.0, 1.0}, {0.0, 1.0 , 1.0, 1.0}}, .scale = {{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {0.9, 0.9, 0.9}, {0.3, 0.3, 0.3}, {0.5, 0.5, 0.5}} }; ShaderInfo shaders[] = { { GL_VERTEX_SHADER, "color.vert" }, { GL_FRAGMENT_SHADER, "triangles.frag"}, { GL_NONE, NULL} }; void DoErrorReport(string header ) { GLenum err = GL_NO_ERROR; bool firstPass = true; while ((err = glGetError()) != GL_NO_ERROR) { if(firstPass) { cout << header << endl; firstPass = false; } cout << "Got error " << err << ": " ; cout << gluErrorString(err) << endl; } } void setup() { GLuint program; program = LoadShaders(shaders); glUseProgram(program); glGenVertexArrays(NumVAOs, VAOs); glBindVertexArray(VAOs[Triangles]); // set up the triangles glGenBuffers(NumBuffers, Buffers); glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); GLsizei stride =0; glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(0)); glEnableVertexAttribArray(vPosition); glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(vertices.colors)); glEnableVertexAttribArray(vColor); glVertexAttribPointer(Scalefactor, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(vertices.scale)); glEnableVertexAttribArray(Scalefactor); DoErrorReport("End of Setup"); return; } void display(){ glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(VAOs[Triangles]); glDrawArrays(GL_TRIANGLES, 0, NumVertices); glFlush(); DoErrorReport("End of Display"); return; } void keypress(unsigned char key, int x, int y) { switch(key) { case 'q': exit(0); } glutPostRedisplay(); return; } int main(int argc, char * argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitContextVersion(3,0); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutKeyboardFunc(keypress); glewExperimental = GL_TRUE; if (glewInit()) { cerr << "Unable to initialize glew, exiting " << endl; exit (-1); } setup(); glutMainLoop(); return 0; }