8 #include <OpenGL/glew.h>
10 #include <GLUT/glut.h>
12 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
19 glClear(GL_COLOR_BUFFER_BIT);
20 for (int i = 0; i < 2; i++) {
21 glBindVertexArray(vaos[i]);
22 glDrawArrays(GL_TRIANGLES, 0, 3);
27 void attachShader(GLuint progId, const char* filePath, GLenum type) {
28 GLuint shader = glCreateShader(type);
31 fprintf(stderr, "error creating shader\n");
35 ifstream file(filePath);
37 buffer << file.rdbuf();
38 const char* contents = buffer.str().c_str();
40 glShaderSource(shader, 1, (const GLchar**)&contents, NULL);
41 glCompileShader(shader);
43 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
46 glGetShaderInfoLog(shader, 1024, NULL, log);
47 fprintf(stderr, "error: %s\n", log);
50 glAttachShader(progId, shader);
53 GLuint compileShaders() {
54 GLuint progId = glCreateProgram();
56 attachShader(progId, "vertex.glsl", GL_VERTEX_SHADER);
57 attachShader(progId, "fragment.glsl", GL_FRAGMENT_SHADER);
59 glLinkProgram(progId);
61 glGetProgramiv(progId, GL_LINK_STATUS, &success);
64 glGetProgramInfoLog(progId, sizeof(log), NULL, log);
65 fprintf(stderr, "error linking: %s\n", log);
73 #define BUFFER_OFFSET(i) ((char *)NULL + (i))
75 GLuint* setupBuffers(GLuint progId) {
76 GLfloat vertices[2][9] = {
99 glGenBuffers(2, vbos);
101 GLuint* vaos = new GLuint[2];
102 glGenVertexArrays(2, vaos);
104 GLuint posId = glGetAttribLocation(progId, "vPosition");
105 GLuint colorId = glGetAttribLocation(progId, "vColor");
107 GLuint vertsLen = numVerts * 3 * sizeof(GLfloat);
108 GLuint colorsLen = numVerts * 4 * sizeof(GLfloat);
111 for(int i = 0; i < 2; i++) {
112 glBindBuffer(GL_ARRAY_BUFFER, vbos[i]);
113 glBufferData(GL_ARRAY_BUFFER, vertsLen + colorsLen, NULL, GL_STATIC_DRAW);
115 glBufferSubData(GL_ARRAY_BUFFER, 0, vertsLen, vertices[i]);
116 glBufferSubData(GL_ARRAY_BUFFER, vertsLen, colorsLen, colors);
118 glBindVertexArray(vaos[i]);
120 glEnableVertexAttribArray(posId);
121 glEnableVertexAttribArray(colorId);
123 glVertexAttribPointer(posId, 3, GL_FLOAT, GL_FALSE, 0, 0);
124 glVertexAttribPointer(colorId, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVerts * 3 * sizeof(GLfloat)));
131 GLuint progId = compileShaders();
132 vaos = setupBuffers(progId);
134 glValidateProgram(progId);
137 glGetProgramiv(progId, GL_VALIDATE_STATUS, &success);
140 glGetProgramInfoLog(progId, sizeof(log), NULL, log);
141 fprintf(stderr, "error: %s\n", log);
146 int main(int argc, char** argv) {
147 glutInit(&argc, argv);
148 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_3_2_CORE_PROFILE);
149 glutInitWindowSize(800, 600);
150 glutCreateWindow("Hello Triangle");
151 glutDisplayFunc(display);