Skip to content

Instantly share code, notes, and snippets.

@bert
Created October 17, 2021 22:49

Revisions

  1. bert created this gist Oct 17, 2021.
    3 changes: 3 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,3 @@
    # GLFW Simple tutorial demo

    https://www.glfw.org/docs/latest/quick.html
    157 changes: 157 additions & 0 deletions simple.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,157 @@
    #include <glad/gl.h>
    #define GLFW_INCLUDE_NONE
    #include <GLFW/glfw3.h>


    #include "linmath.h"


    #include <stdlib.h>
    #include <stdio.h>


    static const struct
    {
    float x, y;
    float r, g, b;
    } vertices[3] =
    {
    {-0.6f, -0.4f, 1.f, 0.f, 0.f},
    { 0.6f, -0.4f, 0.f, 1.f, 0.f},
    { 0.f, 0.6f, 0.f, 0.f, 1.f}
    };


    static const char *
    vertex_shader_text =
    "#version 110\n"
    "uniform mat4 MVP;\n"
    "attribute vec3 vCol;\n"
    "attribute vec2 vPos;\n"
    "varying vec3 color;\n"
    "void main()\n"
    "{\n"
    " gl_Position = MVP * vec4(vPos, 0.0, 1.0);\n"
    " color = vCol;\n"
    "}\n";


    static const char *
    fragment_shader_text =
    "#version 110\n"
    "varying vec3 color;\n"
    "void main()\n"
    "{\n"
    " gl_FragColor = vec4(color, 1.0);\n"
    "}\n";


    static void
    error_callback (int error, const char* description)
    {
    fprintf(stderr, "Error: %s\n", description);
    }


    static void
    key_callback (GLFWwindow* window, int key, int scancode, int action, int mods)
    {
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
    glfwSetWindowShouldClose(window, GLFW_TRUE);
    }


    int
    main (void)
    {
    GLFWwindow* window;
    GLuint vertex_buffer;
    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;
    GLint mvp_location;
    GLint vpos_location;
    GLint vcol_location;

    glfwSetErrorCallback (error_callback);

    if (!glfwInit ())
    exit (EXIT_FAILURE);

    glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 2);
    glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 0);

    window = glfwCreateWindow (640, 480, "Simple example", NULL, NULL);
    if (!window)
    {
    glfwTerminate ();
    exit (EXIT_FAILURE);
    }

    glfwSetKeyCallback (window, key_callback);

    glfwMakeContextCurrent (window);
    gladLoadGL (glfwGetProcAddress);
    glfwSwapInterval (1);

    /* NOTE: OpenGL error checks have been omitted for brevity. */

    glGenBuffers (1, &vertex_buffer);
    glBindBuffer (GL_ARRAY_BUFFER, vertex_buffer);
    glBufferData (GL_ARRAY_BUFFER, sizeof (vertices), vertices, GL_STATIC_DRAW);

    vertex_shader = glCreateShader (GL_VERTEX_SHADER);
    glShaderSource (vertex_shader, 1, &vertex_shader_text, NULL);
    glCompileShader (vertex_shader);

    fragment_shader = glCreateShader (GL_FRAGMENT_SHADER);
    glShaderSource (fragment_shader, 1, &fragment_shader_text, NULL);
    glCompileShader (fragment_shader);

    program = glCreateProgram ();
    glAttachShader (program, vertex_shader);
    glAttachShader (program, fragment_shader);
    glLinkProgram (program);

    mvp_location = glGetUniformLocation (program, "MVP");
    vpos_location = glGetAttribLocation (program, "vPos");
    vcol_location = glGetAttribLocation (program, "vCol");

    glEnableVertexAttribArray (vpos_location);
    glVertexAttribPointer (vpos_location, 2, GL_FLOAT, GL_FALSE, sizeof (vertices[0]), (void*) 0);
    glEnableVertexAttribArray (vcol_location);
    glVertexAttribPointer (vcol_location, 3, GL_FLOAT, GL_FALSE, sizeof (vertices[0]), (void*) (sizeof (float) * 2));

    while (!glfwWindowShouldClose (window))
    {
    float ratio;
    int width;
    int height;
    mat4x4 m;
    mat4x4 p;
    mat4x4 mvp;

    glfwGetFramebufferSize (window, &width, &height);
    ratio = width / (float) height;

    glViewport (0, 0, width, height);
    glClear (GL_COLOR_BUFFER_BIT);

    mat4x4_identity (m);
    mat4x4_rotate_Z (m, m, (float) glfwGetTime ());
    mat4x4_ortho (p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);
    mat4x4_mul (mvp, p, m);

    glUseProgram (program);
    glUniformMatrix4fv (mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);
    glDrawArrays (GL_TRIANGLES, 0, 3);

    glfwSwapBuffers (window);
    glfwPollEvents ();
    }

    glfwDestroyWindow (window);

    glfwTerminate ();
    exit (EXIT_SUCCESS);
    }