Last active
May 9, 2020 18:01
-
-
Save eduardonunesp/e3462d0ae04baa85ba65bb8cdaa4f2d0 to your computer and use it in GitHub Desktop.
OpenGL Triangle
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 <stdlib.h> | |
#define GLEW_STATIC | |
#include <GL/glew.h> | |
#include <GLFW/glfw3.h> | |
#include <iostream> | |
//macro to write shader programs inline | |
#ifndef GLSL | |
#define GLSL(version,A) "#version " #version "\n" #A | |
#endif | |
void error_callback(int error, const char* description) | |
{ | |
fprintf(stderr, "%s\n", description); | |
} | |
static unsigned int compile_shader(unsigned int type, const std::string& source) | |
{ | |
const unsigned int id = glCreateShader(type); | |
const char* src = source.c_str(); | |
glShaderSource(id, 1, &src, nullptr); | |
glCompileShader(id); | |
int result; | |
glGetShaderiv(id, GL_COMPILE_STATUS, &result); | |
if (result == GL_FALSE) | |
{ | |
int length; | |
glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length); | |
char* message = (char*) alloca(length * sizeof(char)); | |
glGetShaderInfoLog(id, length, &length, message); | |
const std::string stype = (type == GL_VERTEX_SHADER ? "GL_VERTEX_SHADER" : "GL_FRAGMENT_SHADER"); | |
std::cout << "Failed to compile " << stype << " shader" << std::endl; | |
std::cout << message << std::endl; | |
glDeleteShader(id); | |
return 0; | |
} | |
return id; | |
} | |
static unsigned int create_shader(const std::string& vertex_shader, const std::string& fragment_shader) | |
{ | |
const unsigned int program = glCreateProgram(); | |
const unsigned int vs = compile_shader(GL_VERTEX_SHADER, vertex_shader); | |
const unsigned int fs = compile_shader(GL_FRAGMENT_SHADER, fragment_shader); | |
glAttachShader(program, vs); | |
glAttachShader(program, fs); | |
glLinkProgram(program); | |
glValidateProgram(program); | |
glDeleteShader(vs); | |
glDeleteShader(fs); | |
return program; | |
} | |
int main(int argc, char *argv[]) | |
{ | |
GLFWwindow *window; | |
if (!glfwInit()) | |
{ | |
return -1; | |
} | |
#ifdef __APPLE__ | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); | |
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); | |
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |
#endif | |
glfwSetErrorCallback(error_callback); | |
const int width = 640; | |
const int height = 480; | |
window = glfwCreateWindow(width, height, "glfw", NULL, NULL); | |
if (!window) | |
{ | |
glfwTerminate(); | |
return -1; | |
} | |
glfwMakeContextCurrent(window); | |
glewExperimental = true; | |
GLenum glewError = glewInit(); | |
if (glewError != GLEW_OK) | |
{ | |
std::cerr << "Glew init error " << glewGetErrorString(glewError) << std::endl; | |
return 1; | |
} | |
std::cout << glGetString(GL_VERSION) << std::endl; | |
float positions[6] = { | |
-0.5f, -0.5f, | |
0.0f, 0.5f, | |
0.5f, -0.5f | |
}; | |
unsigned int buffer; | |
glGenBuffers(1, &buffer); | |
glBindBuffer(GL_ARRAY_BUFFER, buffer); | |
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW); | |
unsigned int vertex_array_id; | |
glGenVertexArrays(1, &vertex_array_id); | |
glBindVertexArray(vertex_array_id); | |
glEnableVertexAttribArray(0); | |
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0); | |
const char* vertex_shader = GLSL(410, | |
layout(location = 0) in vec4 position; | |
void main(){ | |
gl_Position = position; | |
} | |
); | |
const char* fragment_shader = GLSL(410, | |
layout(location = 0) out vec4 color; | |
void main(){ | |
color = vec4(1.0, 0.0, 0.0, 1.0); | |
} | |
); | |
unsigned int shader = create_shader(vertex_shader, fragment_shader); | |
glUseProgram(shader); | |
while (!glfwWindowShouldClose(window)) | |
{ | |
glClear(GL_COLOR_BUFFER_BIT); | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
glfwSwapBuffers(window); | |
glfwPollEvents(); | |
} | |
glfwDestroyWindow(window); | |
glfwTerminate(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment