Skip to content

Instantly share code, notes, and snippets.

@k3ut0i
Last active November 28, 2017 19:22
Show Gist options
  • Save k3ut0i/cb4150938d03632cafac23efb78a8f7b to your computer and use it in GitHub Desktop.
Save k3ut0i/cb4150938d03632cafac23efb78a8f7b to your computer and use it in GitHub Desktop.
OpenGL basics with GLFW library
#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