Skip to content

Instantly share code, notes, and snippets.

@paulfrische
Created October 2, 2022 20:07
Show Gist options
  • Select an option

  • Save paulfrische/16e2b6c130eb545bed0a77e22ce89446 to your computer and use it in GitHub Desktop.

Select an option

Save paulfrische/16e2b6c130eb545bed0a77e22ce89446 to your computer and use it in GitHub Desktop.
first triangle in opengl
#include <iostream>
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
const char *vertex_shader_source =
"#version 330 core\n"
"layout (location = 0) in vec3 pos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(pos, 1.0);\n"
"}";
const char *fragment_shader_source =
"#version 330 core\n"
"out vec4 Color;\n"
"void main()\n"
"{\n"
" Color = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
struct vertex
{
float x;
float y;
float z;
};
vertex vertices[] = {
vertex { -0.5f, -0.5f, 0.0f },
vertex { 0.5f, -0.5f, 0.0f },
vertex { 0.0f, 0.5f, 0.0f },
};
int main(int argc, char **argv)
{
glfwInit();
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);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(1280, 720, "OpenGL", nullptr, nullptr);
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit();
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex) * 3, vertices, GL_STATIC_DRAW);
unsigned int vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, nullptr);
glCompileShader(vertex_shader);
int success;
char infoLog[1024];
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex_shader, 1024, nullptr, infoLog);
std::cout << infoLog << std::endl;
}
unsigned int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_source, nullptr);
glCompileShader(fragment_shader);
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex_shader, 1024, nullptr, infoLog);
std::cout << infoLog << std::endl;
}
unsigned int shader = glCreateProgram();
glAttachShader(shader, vertex_shader);
glAttachShader(shader, fragment_shader);
glLinkProgram(shader);
glGetProgramiv(shader, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(shader, 1024, nullptr, infoLog);
std::cout << infoLog << std::endl;
}
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
glUseProgram(shader);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex), (void*)0);
glEnableVertexAttribArray(0);
while (!glfwWindowShouldClose(window))
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
glfwTerminate();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment