RyanHub - file viewer
filename: examples/hello_triangle.c
branch: main
back to repo
#include "rch.h"

#include <glad.h>  
#include <glfw3.h>  

#include <string.h>  
#include <stdio.h>  

const char* vert_src = "#version 330 core\n"  
"layout (location = 0) in vec3 aPos;\n"  
"void main() {\n"  
"    gl_Position = vec4(aPos, 1.0);\n"  
"}\n";  

const char* frag_src = "#version 330 core\n"  
"out vec4 FragColor;\n"  
"void main() {\n"  
"    FragColor = vec4(1.0, 0.5, 0.2, 1.0);\n"  
"}\n";  

int main() {  
   if (!glfwInit()) {  
       fprintf(stderr, "failed to initialize GLFW\n");  
       return -1;  
   }  

   // OpenGL version 3.3 core 
   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);  
   glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);  
   glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  

   // create window  
   GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);  
   if (!window) {  
       fprintf(stderr, "failed to create GLFW window\n");  
       glfwTerminate();  
       return -1;  
   }  
   glfwMakeContextCurrent(window);  

   // load OpenGL functions with GLAD  
   if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {  
       fprintf(stderr, "failed to initialize GLAD\n");  
       return -1;  
   }  

   // vertex data for hello triangle 
   float vertices[] = {  
        0.0f,  0.5f, 0.0f,  
       -0.5f, -0.5f, 0.0f,  
        0.5f, -0.5f, 0.0f   
   };  

   unsigned int vao, vbo;  
   glGenVertexArrays(1, &vao);  
   glGenBuffers(1, &vbo);  

   glBindVertexArray(vao);  

   glBindBuffer(GL_ARRAY_BUFFER, vbo);  
   glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);  

   // define vertexes  
   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);  
   glEnableVertexAttribArray(0);  

   // compile shaders  
   unsigned int vert_shader = glCreateShader(GL_VERTEX_SHADER);  
   glShaderSource(vert_shader, 1, &vert_src, NULL);  
   glCompileShader(vert_shader);  
   unsigned int frag_shader = glCreateShader(GL_FRAGMENT_SHADER);  
   glShaderSource(frag_shader, 1, &frag_src, NULL);  
   glCompileShader(frag_shader);  

   // link shaders  
   unsigned int shader_program = glCreateProgram();  
   glAttachShader(shader_program, vert_shader);  
   glAttachShader(shader_program, frag_shader);  
   glLinkProgram(shader_program);  

   // delete local shader data  
   glDeleteShader(vert_shader);  
   glDeleteShader(frag_shader);  

   // main loop
   while (!glfwWindowShouldClose(window)) {  
       glClearColor(0.2f, 0.3f, 0.3f, 1.0f);  
       glClear(GL_COLOR_BUFFER_BIT);  

       glUseProgram(shader_program);  
       glBindVertexArray(vao);  
       glDrawArrays(GL_TRIANGLES, 0, 3);  

       glfwSwapBuffers(window);  
       glfwPollEvents();  
   }  


   // free and clear
   glDeleteVertexArrays(1, &vao);  
   glDeleteBuffers(1, &vbo);  
   glDeleteProgram(shader_program);  

   glfwDestroyWindow(window);  
   glfwTerminate();  
   return 0;  
}