8 #include <OpenGL/glew.h>
10 #include <GLUT/glut.h>
12 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
17 glClear(GL_COLOR_BUFFER_BIT);
18 glDrawArrays(GL_TRIANGLES, 0, 6);
22 void attachShader(GLuint progId, const char* filePath, GLenum type) {
23 GLuint shader = glCreateShader(type);
26 fprintf(stderr, "error creating shader\n");
30 ifstream file(filePath);
32 buffer << file.rdbuf();
33 const char* contents = buffer.str().c_str();
35 glShaderSource(shader, 1, (const GLchar**)&contents, NULL);
36 glCompileShader(shader);
38 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
41 glGetShaderInfoLog(shader, 1024, NULL, log);
42 fprintf(stderr, "error: %s\n", log);
45 glAttachShader(progId, shader);
48 GLuint compileShaders() {
49 GLuint progId = glCreateProgram();
51 attachShader(progId, "vertex.glsl", GL_VERTEX_SHADER);
52 attachShader(progId, "fragment.glsl", GL_FRAGMENT_SHADER);
54 glLinkProgram(progId);
56 glGetProgramiv(progId, GL_LINK_STATUS, &success);
59 glGetProgramInfoLog(progId, sizeof(log), NULL, log);
60 fprintf(stderr, "error linking: %s\n", log);
68 void generateObjectBuffers() {
69 GLfloat vertices[] = {
92 glGenBuffers(1, &VBO);
93 glBindBuffer(GL_ARRAY_BUFFER, VBO);
94 glBufferData(GL_ARRAY_BUFFER, numVerts * 7 * sizeof(GLfloat), NULL, GL_STATIC_DRAW);
96 GLuint vertsLen = numVerts * 3 * sizeof(GLfloat);
97 GLuint colorsLen = numVerts * 4 * sizeof(GLfloat);
98 glBufferSubData(GL_ARRAY_BUFFER, 0, vertsLen, vertices);
99 glBufferSubData(GL_ARRAY_BUFFER, vertsLen, colorsLen, colors);
102 #define BUFFER_OFFSET(i) ((char *)NULL + (i))
104 void linkBuffers(GLuint progId) {
106 GLuint posId = glGetAttribLocation(progId, "vPosition");
107 GLuint colorId = glGetAttribLocation(progId, "vColor");
110 glGenVertexArrays(1, &vao);
111 glBindVertexArray(vao);
113 glEnableVertexAttribArray(posId);
114 glVertexAttribPointer(posId, 3, GL_FLOAT, GL_FALSE, 0, 0);
116 glEnableVertexAttribArray(colorId);
117 glVertexAttribPointer(colorId, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVerts * 3 * sizeof(GLfloat)));
122 GLuint progId = compileShaders();
123 generateObjectBuffers();
126 glValidateProgram(progId);
129 glGetProgramiv(progId, GL_VALIDATE_STATUS, &success);
132 glGetProgramInfoLog(progId, sizeof(log), NULL, log);
133 fprintf(stderr, "error: %s\n", log);
138 int main(int argc, char** argv) {
139 glutInit(&argc, argv);
140 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_3_2_CORE_PROFILE);
141 glutInitWindowSize(800, 600);
142 glutCreateWindow("Hello Triangle");
143 glutDisplayFunc(display);