#include #include #include constexpr auto width = 640; constexpr auto height = 480; constexpr auto title = "sdf-winding"; static void APIENTRY debug_message_callback( GLenum /* source */, GLenum /* type */, GLuint /* id */, GLenum /* severity */, GLsizei /* length */, GLchar const * message, void const * /* param */ ) { std::cerr << message << std::endl; }; int main() { /// Window/context glfwInit(); auto window = glfwCreateWindow(width, height, title, nullptr, nullptr); glfwMakeContextCurrent(window); glewInit(); /// Debug glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); glDebugMessageCallback(debug_message_callback, nullptr); /// Shader auto make_program = [](char const * fragment_source) { auto program = glCreateProgram(); auto attach = [&](GLenum type, char const * source) { auto shader = glCreateShader(type); glShaderSource(shader, 1, &source, nullptr); glCompileShader(shader); glAttachShader(program, shader); }; attach(GL_VERTEX_SHADER, R"( #version 140 out vec2 tex_coord; void main() { tex_coord = vec2[]( vec2(0, 0), vec2(2, 0), vec2(0, 2) )[gl_VertexID]; gl_Position = vec4(tex_coord*2-1, 0, 1); } )"); attach(GL_FRAGMENT_SHADER, fragment_source); glLinkProgram(program); return program; }; auto tex_coord_program = make_program(R"( #version 140 in vec2 tex_coord; void main() { gl_FragColor = vec4(tex_coord, 0, 1); } )"); /// Draw loop while (glfwPollEvents(), !glfwWindowShouldClose(window)) { //// Input if (glfwGetKey(window, GLFW_KEY_Q)) glfwSetWindowShouldClose(window, GLFW_TRUE); //// Draw glClear(GL_COLOR_BUFFER_BIT); glUseProgram(tex_coord_program); glDrawArrays(GL_TRIANGLES, 0, 3); //// Swap glfwSwapBuffers(window); } /// Cleanup glfwDestroyWindow(window); glfwTerminate(); }