Skip to content

Instantly share code, notes, and snippets.

@luigifcruz
Last active June 6, 2020 03:55
Show Gist options
  • Save luigifcruz/2b0ee50412248259c4414a4874f57927 to your computer and use it in GitHub Desktop.
Save luigifcruz/2b0ee50412248259c4414a4874f57927 to your computer and use it in GitHub Desktop.
/*
Compilation (macOS):
gcc test.c -o test -lglfw -framework OpenGL -Wno-deprecated-declarations
*/
#include <stdio.h>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
const char *vertex_shader_str =
"#version 330 core\n"
"layout(location = 0) in vec4 position;\n"
"layout(location = 1) in vec3 color;\n"
"out vec3 ourColor;\n"
"void main() {\n"
" ourColor = color;\n"
" gl_Position = position;\n"
"}\0";
const char *fragment_shader_str =
"#version 330 core\n"
"out vec4 color;\n"
"in vec3 ourColor;\n"
"void main() {\n"
" color = vec4(ourColor, 1.0f);\n"
"}\0";
unsigned int compile_shader(unsigned int type, const char* code) {
unsigned int shader = glCreateShader(type);
glShaderSource(shader, 1, &code, NULL);
glCompileShader(shader);
int success;
char info_log[512];
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(shader, 512, NULL, info_log);
printf("%s", info_log);
return 0;
}
return shader;
}
unsigned int create_shader(const char* vertex_shader_str, const char* fragment_shader_str) {
unsigned int program = glCreateProgram();
unsigned int vertex_shader = compile_shader(GL_VERTEX_SHADER, vertex_shader_str);
unsigned int fragment_shader = compile_shader(GL_FRAGMENT_SHADER, fragment_shader_str);
if (vertex_shader == 0 || fragment_shader == 0)
return 0;
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
glValidateProgram(program);
int success;
char info_log[512];
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(program, 512, NULL, info_log);
printf("%s", info_log);
return 0;
}
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
return program;
}
int main(void)
{
GLFWwindow* window;
if (!glfwInit())
return -1;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
if (!(window = glfwCreateWindow(480, 480, "Hello Triangle", NULL, NULL))) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
printf("Failed to initialize GLAD\n");
return -1;
}
float vertices[] = {
// positions // colors
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom left
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // top
};
unsigned int VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
unsigned int program;
if ((program = create_shader(vertex_shader_str, fragment_shader_str)) == 0) {
return -1;
}
glUseProgram(program);
while (!glfwWindowShouldClose(window)) {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment