Created
June 23, 2020 21:03
-
-
Save LewkyB/5e916a52acef30d6adbd31eb8c328a1b to your computer and use it in GitHub Desktop.
This file contains hidden or 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 <glad/glad.h> | |
#include <GLFW/glfw3.h> | |
#include <iostream> | |
// used to allow for window resizing | |
void framebuffer_size_callback(GLFWwindow* window, int width, int height); | |
void processInput(GLFWwindow* window); | |
const char* vertex_shader_source = "#version 330 core\n" | |
"layout (location = 0) in vec3 aPos;\n" | |
"void main()\n" | |
"{\n" | |
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" | |
"}\0"; | |
const char* fragment_shader_source = "#version 330 core\n" | |
"out vec4 FragColor;\n" | |
"void main()\n" | |
"{\n" | |
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" | |
"}\0"; | |
int main() | |
{ | |
glfwInit(); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | |
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |
// glfw window creation | |
// -------------------- | |
GLFWwindow* window = glfwCreateWindow(800, 600, "Luke's Window", NULL, NULL); | |
if (window == NULL) | |
{ | |
std::cout << "Failed to create GLFW window" << std::endl; | |
glfwTerminate(); | |
return -1; | |
} | |
glfwMakeContextCurrent(window); | |
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); | |
// glad: load all OpenGL function pointers | |
// --------------------------------------- | |
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) | |
{ | |
std::cout << "Failed to initialize GLAD" << std::endl; | |
return -1; | |
} | |
// build and compile shader program | |
// -------------------------------- | |
//vertex shader | |
unsigned int vertexShader; | |
vertexShader = glCreateShader(GL_VERTEX_SHADER); | |
glShaderSource(vertexShader, 1, &vertex_shader_source, NULL); | |
glCompileShader(vertexShader); | |
// error check vertex shader | |
int success; | |
char infoLog[512]; | |
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); | |
if (!success) | |
{ | |
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); | |
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; | |
} | |
// fragment shader | |
unsigned int fragmentShader; | |
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); | |
glShaderSource(fragmentShader, 1, &fragment_shader_source, NULL); | |
glCompileShader(fragmentShader); | |
// error check fragment shader | |
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); | |
if (!success) | |
{ | |
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); | |
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; | |
} | |
// link shaders | |
unsigned int shaderProgram; | |
shaderProgram = glCreateProgram(); | |
glAttachShader(shaderProgram, vertexShader); | |
glAttachShader(shaderProgram, fragmentShader); | |
glLinkProgram(shaderProgram); | |
// error check link shaders | |
glGetShaderiv(shaderProgram, GL_COMPILE_STATUS, &success); | |
if (!success) | |
{ | |
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); | |
std::cout << "ERROR::SHADER::PROGRAM::COMPILATION_FAILED\n" << infoLog << std::endl; | |
} | |
// delete shaders after linking | |
glDeleteShader(vertexShader); | |
glDeleteShader(fragmentShader); | |
// set up vertex data, buffers, and configure vertex attributes | |
// ------------------------------------------------------------ | |
/* | |
float vertices[] = { | |
0.5f, 0.5f, 0.0f, // top right | |
0.5f, -0.5f, 0.0f, // bottom right | |
-0.5f, -0.5f, 0.0f, // bottom left | |
-0.5f, 0.5f, 0.0f // top left | |
}; | |
*/ | |
float vertices1[] = { | |
// triangle 1 | |
-0.0f, 0.5f, 0.0f, | |
-0.0f, 0.1f, 0.0f, | |
-0.9f, 0.1f, 0.0f, | |
}; | |
float vertices2[] = { | |
// triangle 2 | |
0.0f, 0.5f, 0.0f, | |
0.0f, 0.1f, 0.0f, | |
0.9f, 0.1f, 0.0f | |
}; | |
unsigned int indices[] = { | |
0, 1, 3, // triangle one | |
1, 2, 3 // triangle two | |
}; | |
// variables | |
unsigned int VAOs[2], VBOs[2]; | |
// generate buffers | |
glGenVertexArrays(2, VAOs); | |
glGenBuffers(2, VBOs); | |
// TRIANGLE 1 | |
// bind VAO | |
glBindVertexArray(VAOs[0]); | |
// copy vertices array to buffer | |
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW); | |
// set vertex attribute pointers | |
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); | |
glEnableVertexAttribArray(0); | |
// TRIANGE 2 | |
// bind VAO | |
glBindVertexArray(VAOs[1]); | |
// copy vertices array to buffer | |
glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW); | |
// set vertex attribute pointers | |
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); | |
glEnableVertexAttribArray(0); | |
// uncomment to change from fill to wireframe | |
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | |
// render loop | |
// ----------- | |
while (!glfwWindowShouldClose(window)) // run window until close it pressed? | |
{ | |
// input | |
processInput(window); | |
// rendering commands here | |
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); | |
glClear(GL_COLOR_BUFFER_BIT); | |
glUseProgram(shaderProgram); | |
// TRIANGLE 1 | |
glBindVertexArray(VAOs[0]); | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
// TRIANGLE 2 | |
glBindVertexArray(VAOs[1]); | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
//glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)0); | |
glBindVertexArray(0); | |
// check and call events and swap the buffers | |
glfwSwapBuffers(window); // used to draw to screen | |
glfwPollEvents(); // the event this one is looking for is pressing the close button | |
} | |
glfwTerminate(); | |
return 0; | |
} | |
void framebuffer_size_callback(GLFWwindow* window, int width, int height) | |
{ | |
glViewport(0, 0, width, height); | |
} | |
void processInput(GLFWwindow* window) | |
{ | |
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) | |
glfwSetWindowShouldClose(window, true); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment