25 std::cerr <<
"GLFW init failed\n";
26 std::exit(EXIT_FAILURE);
29 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
30 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
31 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
34 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
38 glfwCreateWindow(800, 600,
"glbinding + GLFW",
nullptr,
nullptr);
40 std::cerr <<
"Failed to create GLFW window\n";
42 std::exit(EXIT_FAILURE);
45 glfwMakeContextCurrent(win);
67 auto compile = [](GLenum type,
const char* src) ->
GLuint {
68 GLuint sh = glCreateShader(type);
69 glShaderSource(sh, 1, &src,
nullptr);
73 glGetShaderiv(sh, GL_COMPILE_STATUS, &ok);
76 glGetShaderiv(sh, GL_INFO_LOG_LENGTH, &len);
77 std::string log(len,
'\0');
78 glGetShaderInfoLog(sh, len, &len, log.data());
79 std::cerr <<
"Shader compile error:\n" << log <<
'\n';
80 std::exit(EXIT_FAILURE);
85 GLuint prog = glCreateProgram();
86 GLuint vs = compile(GL_VERTEX_SHADER, vs_src);
87 GLuint fs = compile(GL_FRAGMENT_SHADER, fs_src);
89 glAttachShader(prog, vs);
90 glAttachShader(prog, fs);
94 glGetProgramiv(prog, GL_LINK_STATUS, &ok);
97 glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);
98 std::string log(len,
'\0');
99 glGetProgramInfoLog(prog, len, &len, log.data());
100 std::cerr <<
"Program link error:\n" << log <<
'\n';
101 std::exit(EXIT_FAILURE);
115 float vertices[] = {-0.5f, -0.5f, 0.0f, 0.5f, -0.5f,
116 0.0f, 0.0f, 0.5f, 0.0f};
119 glGenVertexArrays(1, &vao);
120 glGenBuffers(1, &vbo);
122 glBindVertexArray(vao);
123 glBindBuffer(GL_ARRAY_BUFFER, vbo);
124 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertices), vertices, GL_STATIC_DRAW);
125 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 *
sizeof(
float),
nullptr);
126 glEnableVertexAttribArray(0);
131 layout (location = 0) in vec3 aPos;
132 void main() { gl_Position = vec4(aPos, 1.0); }
137 void main() { FragColor = vec4(0.2, 0.5, 0.8, 1.0); }
143 while (!glfwWindowShouldClose(win)) {
144 if (glfwGetKey(win, GLFW_KEY_ESCAPE) == GLFW_PRESS)
145 glfwSetWindowShouldClose(win,
true);
147 glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
148 glClear(GL_COLOR_BUFFER_BIT);
151 glBindVertexArray(vao);
152 glDrawArrays(GL_TRIANGLES, 0, 3);
154 glfwSwapBuffers(win);
158 glDeleteVertexArrays(1, &vao);
159 glDeleteBuffers(1, &vbo);
160 glDeleteProgram(prog);