Last active
November 28, 2017 19:22
-
-
Save k3ut0i/cb4150938d03632cafac23efb78a8f7b to your computer and use it in GitHub Desktop.
OpenGL basics with GLFW library
This file contains hidden or 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
#define GLEW_STATIC | |
#include <GL/glew.h> | |
#include <GLFW/glfw3.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sys/time.h> | |
#include <limits.h> | |
#include <math.h> | |
#define BUF_SIZE 512 | |
float vertices[] = { | |
0.0f, 0.5f, 0.0f, 0.0f, 1.0f, | |
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, | |
-0.5f, -0.5f, 1.0f, 0.0f, 0.0f, | |
}; | |
const char * vertexSource = "#version 130\n" | |
"in vec2 position;\n" | |
"in vec3 color;\n" | |
"out vec3 Color;\n" | |
"void main()\n" | |
"{\n" | |
" Color = color;\n" | |
" gl_Position = vec4(position, 0.0, 1.0);\n" | |
"}\n"; | |
const char * fragmentSource = "#version 130\n" | |
"in vec3 Color;\n" | |
"out vec4 outColor;\n" | |
"void main()\n" | |
"{\n" | |
" outColor = vec4(Color, 1.0);\n" | |
"}\n"; | |
void error_callback(int num, const char * desc){ | |
fprintf(stderr, "Error:[%d]\t%s", num, desc); | |
} | |
void init(){ | |
if(!glfwInit()){ | |
fprintf(stderr, "Cannot Initialize GLFW\n"); | |
exit(EXIT_FAILURE); | |
} | |
glfwSetErrorCallback(error_callback); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); | |
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); | |
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); | |
} | |
void finl(){ | |
glfwTerminate(); | |
} | |
int main(){ | |
init(); | |
GLFWwindow * win = glfwCreateWindow(640, 480, "GLFW Basics", NULL, NULL); | |
if(!win){ | |
fprintf(stderr, "Cannot create window"); | |
return -1; | |
} | |
glfwMakeContextCurrent(win); | |
glewExperimental = GL_TRUE; | |
glewInit(); | |
GLuint vertexBuffer; | |
glGenBuffers(1, &vertexBuffer); | |
GLuint vbo; | |
glGenBuffers(1, &vbo); | |
glBindBuffer(GL_ARRAY_BUFFER, vbo); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); | |
GLuint vao; | |
glGenVertexArrays(1, &vao); | |
glBindVertexArray(vao); | |
GLint status; | |
char buffer[BUF_SIZE]; | |
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); | |
glShaderSource(vertexShader, 1, &vertexSource, NULL); | |
glCompileShader(vertexShader); | |
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); | |
if(status != GL_TRUE){ | |
glGetShaderInfoLog(vertexShader, BUF_SIZE, NULL, buffer); | |
fprintf(stderr, "Error compiling vertex shader: %s\n", buffer); | |
return -1; | |
} | |
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); | |
glShaderSource(fragmentShader, 1, &fragmentSource, NULL); | |
glCompileShader(fragmentShader); | |
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status); | |
if(status != GL_TRUE){ | |
glGetShaderInfoLog(fragmentShader, BUF_SIZE, NULL, buffer); | |
fprintf(stderr, "Error compiling fragment shader: %s\n", buffer); | |
return -1; | |
} | |
GLuint shaderProgram = glCreateProgram(); | |
glAttachShader(shaderProgram, vertexShader); | |
glAttachShader(shaderProgram, fragmentShader); | |
glBindFragDataLocation(shaderProgram, 0, "outColor"); | |
glLinkProgram(shaderProgram); | |
glUseProgram(shaderProgram); | |
GLint posAttrib = glGetAttribLocation(shaderProgram, "position"); | |
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, | |
5*sizeof(float), 0); | |
glEnableVertexAttribArray(posAttrib); | |
GLint colorAttrib = glGetAttribLocation(shaderProgram, "color"); | |
glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, | |
5*sizeof(float), (void*)(2*sizeof(float))); | |
glEnableVertexAttribArray(colorAttrib); | |
/* Uniforms */ | |
/* GLint uniColor = glGetUniformLocation(shaderProgram, "triangleColor"); */ | |
/* glUniform3f(uniColor, 1.0f, 0.0f, 0.0f); */ | |
/* /\* Time variables *\/ */ | |
/* struct timeval tnow, tstart; */ | |
/* gettimeofday(&tstart, NULL); */ | |
while(!glfwWindowShouldClose(win)){ | |
/* gettimeofday(&tnow, NULL); */ | |
/* long int secs = tnow.tv_sec - tstart.tv_sec; */ | |
/* long int usecs = tnow.tv_usec - tstart.tv_sec; */ | |
/* glUniform3f(uniColor, (sin(secs+1e-6*usecs) + 1.0f)/2.0f, 0.0f, 0.0f); */ | |
/* glClearColor(0.0f, 0.0f, 0.0f, 1.0f); */ | |
/* glClear(GL_COLOR_BUFFER_BIT); */ | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
glfwSwapBuffers(win); | |
glfwPollEvents(); | |
} | |
glfwDestroyWindow(win); | |
finl(); | |
return 0; | |
} | |
/* Local Variables: */ | |
/* compile-command: "gcc -o glfw_basics glfw_basics.c -lglfw `pkg-config --cflags --libs glew` -lm" */ | |
/* End: */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment