Created
October 17, 2021 22:49
-
-
Save bert/cfe99fde7b238cb593fcdbe5b6d1d4e3 to your computer and use it in GitHub Desktop.
GLFW Simple tutorial demo
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 characters
#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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment