Created
October 17, 2021 22:49
Revisions
-
bert created this gist
Oct 17, 2021 .There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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 This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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); }