Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <GL/glew.h>
- #include <GLFW/glfw3.h>
- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- #include <glm/gtc/type_ptr.hpp>
- #include "common/shader.h"
- //This is something you can’t change, it’s built in your graphics card. So (-1,-1) is the bottom left corner of your screen.
- // (1,-1) is the bottom right, and (0,1) is the middle top. So this triangle should take most of the screen.
- // If w == 1, then the vector (x,y,z,1) is a position in space.
- // If w == 0, then the vector(x, y, z, 0) is a direction.
- int main()
- {
- // Initialise GLFW
- glewExperimental = true; // Needed for core profile
- if (!glfwInit())
- {
- std::cerr<< "Failed to initialize GLFW\n";
- return -1;
- }
- glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // OpenGL 3.3
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Don't want the old OpenGL
- // Open a window and create its OpenGL context
- std::unique_ptr<GLFWwindow, decltype(&glfwDestroyWindow)> window(
- glfwCreateWindow(1600, 768, "Tutorial 01", NULL, NULL),
- glfwDestroyWindow
- );
- if (window == NULL)
- {
- std::cerr << "Failed to open GLFW window.\n";
- glfwTerminate();
- return -1;
- }
- glfwMakeContextCurrent(window.get()); // Initialize GLEW
- glewExperimental = true; // Needed for core profile
- if (glewInit() != GLEW_OK)
- {
- std::cerr << "Failed to initialize GLEW\n";
- return -1;
- }
- GLuint VertexArrayID{};
- glGenVertexArrays(1, &VertexArrayID);
- glBindVertexArray(VertexArrayID);
- static const GLfloat gVertexBufferDataSquareOne[] = {
- -1.0f,-1.0f,-1.0f, // triangle 1 : begin
- -1.0f,-1.0f, 1.0f,
- -1.0f, 1.0f, 1.0f, // triangle 1 : end
- 1.0f, 1.0f,-1.0f, // triangle 2 : begin
- -1.0f,-1.0f,-1.0f,
- -1.0f, 1.0f,-1.0f, // triangle 2 : end
- 1.0f,-1.0f, 1.0f,
- -1.0f,-1.0f,-1.0f,
- 1.0f,-1.0f,-1.0f,
- 1.0f, 1.0f,-1.0f,
- 1.0f,-1.0f,-1.0f,
- -1.0f,-1.0f,-1.0f,
- -1.0f,-1.0f,-1.0f,
- -1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f,-1.0f,
- 1.0f,-1.0f, 1.0f,
- -1.0f,-1.0f, 1.0f,
- -1.0f,-1.0f,-1.0f,
- -1.0f, 1.0f, 1.0f,
- -1.0f,-1.0f, 1.0f,
- 1.0f,-1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- 1.0f,-1.0f,-1.0f,
- 1.0f, 1.0f,-1.0f,
- 1.0f,-1.0f,-1.0f,
- 1.0f, 1.0f, 1.0f,
- 1.0f,-1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f,-1.0f,
- -1.0f, 1.0f,-1.0f,
- 1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f,-1.0f,
- -1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f, 1.0f,
- 1.0f,-1.0f, 1.0f
- };
- static const GLfloat gVertexBufferDataTriangle[] = {
- -1.0f, -1.0f, 0.0f,
- 1.0f, -1.0f, 0.0f,
- 0.0f, 1.0f, 0.0f,
- };
- static const GLfloat gVertexBufferDataSquareTwo[] = {
- -1.0f, -1.0f, -1.0f, // triangle 1 : begin
- -1.0f, -1.0f, 1.0f,
- -1.0f, 1.0f, 1.0f, // triangle 1 : end
- 1.0f, 1.0f, -1.0f, // triangle 2 : begin
- -1.0f, -1.0f, -1.0f,
- -1.0f, 1.0f, -1.0f, // triangle 2 : end
- 1.0f, -1.0f, 1.0f,
- -1.0f, -1.0f, -1.0f,
- 1.0f, -1.0f, -1.0f,
- 1.0f, 1.0f, -1.0f,
- 1.0f, -1.0f, -1.0f,
- -1.0f, -1.0f, -1.0f,
- -1.0f, -1.0f, -1.0f,
- -1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f, -1.0f,
- 1.0f, -1.0f, 1.0f,
- -1.0f, -1.0f, 1.0f,
- -1.0f, -1.0f, -1.0f,
- -1.0f, 1.0f, 1.0f,
- -1.0f, -1.0f, 1.0f,
- 1.0f, -1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- 1.0f, -1.0f, -1.0f,
- 1.0f, 1.0f, -1.0f,
- 1.0f, -1.0f, -1.0f,
- 1.0f, 1.0f, 1.0f,
- 1.0f, -1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f, -1.0f,
- -1.0f, 1.0f, -1.0f,
- 1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f, -1.0f,
- -1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f, 1.0f,
- 1.0f, -1.0f, 1.0f
- };
- static const GLfloat gColorBufferData[] = {
- 0.583f, 0.771f, 0.014f,
- 0.609f, 0.115f, 0.436f,
- 0.327f, 0.483f, 0.844f,
- 0.822f, 0.569f, 0.201f,
- 0.435f, 0.602f, 0.223f,
- 0.310f, 0.747f, 0.185f,
- 0.597f, 0.770f, 0.761f,
- 0.559f, 0.436f, 0.730f,
- 0.359f, 0.583f, 0.152f,
- 0.483f, 0.596f, 0.789f,
- 0.559f, 0.861f, 0.639f,
- 0.195f, 0.548f, 0.859f,
- 0.014f, 0.184f, 0.576f,
- 0.771f, 0.328f, 0.970f,
- 0.406f, 0.615f, 0.116f,
- 0.676f, 0.977f, 0.133f,
- 0.971f, 0.572f, 0.833f,
- 0.140f, 0.616f, 0.489f,
- 0.997f, 0.513f, 0.064f,
- 0.945f, 0.719f, 0.592f,
- 0.543f, 0.021f, 0.978f,
- 0.279f, 0.317f, 0.505f,
- 0.167f, 0.620f, 0.077f,
- 0.347f, 0.857f, 0.137f,
- 0.055f, 0.953f, 0.042f,
- 0.714f, 0.505f, 0.345f,
- 0.783f, 0.290f, 0.734f,
- 0.722f, 0.645f, 0.174f,
- 0.302f, 0.455f, 0.848f,
- 0.225f, 0.587f, 0.040f,
- 0.517f, 0.713f, 0.338f,
- 0.053f, 0.959f, 0.120f,
- 0.393f, 0.621f, 0.362f,
- 0.673f, 0.211f, 0.457f,
- 0.820f, 0.883f, 0.371f,
- 0.982f, 0.099f, 0.879f
- };
- GLuint vertexBufferSquareOne{};
- glGenBuffers(1, &vertexBufferSquareOne);
- glBindBuffer(GL_ARRAY_BUFFER, vertexBufferSquareOne);
- glBufferData(GL_ARRAY_BUFFER, sizeof(gVertexBufferDataSquareOne), gVertexBufferDataSquareOne, GL_STATIC_DRAW);
- GLuint vertexBufferTriangle{};
- glGenBuffers(1, &vertexBufferTriangle);
- glBindBuffer(GL_ARRAY_BUFFER, vertexBufferTriangle);
- glBufferData(GL_ARRAY_BUFFER, sizeof(gVertexBufferDataTriangle), gVertexBufferDataTriangle, GL_STATIC_DRAW);
- GLuint vertexBufferSquareTwo{};
- glGenBuffers(1, &vertexBufferSquareTwo);
- glBindBuffer(GL_ARRAY_BUFFER, vertexBufferSquareTwo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(gVertexBufferDataSquareTwo), gVertexBufferDataSquareTwo, GL_STATIC_DRAW);
- GLuint colorbuffer{};
- glGenBuffers(1, &colorbuffer);
- glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(gColorBufferData), gColorBufferData, GL_STATIC_DRAW);
- GLuint programID = LoadShaders("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader");
- glfwSetInputMode(window.get(), GLFW_STICKY_KEYS, GL_TRUE);
- glm::mat4 myMatrix{};
- glm::vec4 myVector{};
- // fill myMatrix and myVector somehow
- glm::vec4 transformedVector = myMatrix * myVector;
- do {
- // Clear the screen. It's not mentioned before Tutorial 02, but it can cause flickering, so it's there nonetheless.
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glUseProgram(programID);
- // Enable depth test
- glEnable(GL_DEPTH_TEST);
- // Accept fragment if it closer to the camera than the former one
- glDepthFunc(GL_LESS);
- int width, height;
- glfwGetFramebufferSize(window.get(), &width, &height);
- GLuint MatrixIDS = glGetUniformLocation(programID, "MVP");
- // The perspective matrix simulates the way the human eye sees things: objects farther away appear smaller.
- glm::mat4 Projection = glm::perspective(glm::radians(90.0f), (float)width / height, 0.1f, 100.0f);
- //which defines the camera's position and orientation in the scene.
- // It’s like setting up where your camera is and where it’s looking.
- //camera pos, object pos, upwards direction in world
- glm::mat4 View = glm::lookAt(glm::vec3(4, 3, -6), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
- // creates a model matrix. This matrix is used to position,
- // scale, and rotate objects in the world. By default, it's the identity matrix (1.0f),
- // which means no transformation. If you wanted to move or rotate your object, you would modify this matrix.
- glm::mat4 ModelSquareOne = glm::mat4(1.0f);
- glm::vec3 translateSquareOne(-3.0f, 0.0f, 0.0f);
- ModelSquareOne = glm::translate(ModelSquareOne, translateSquareOne);
- glm::mat4 MVPOne = Projection * View * ModelSquareOne; // Combine them into the MVP matrix
- // Get the location of the MVP uniform
- glm::mat4 ModelTriangle = glm::mat4(1.0f);
- glm::vec3 translateTriangle(2.0f, 0.0f, 0.0f);
- ModelTriangle = glm::translate(ModelTriangle, translateTriangle);
- constexpr float angle = glm::radians(90.0f);
- ModelTriangle = glm::rotate(ModelTriangle, angle, glm::vec3(0.0f, 1.0f, 0.0f));
- glm::mat4 MVPTwo = Projection * View * ModelTriangle; // Combine them into the MVP matrix
- glm::mat4 ModelSquareTwo = glm::mat4(1.0f);
- glm::vec3 translateSquareTwo(6.0f, 0.0f, 0.0f);
- ModelSquareTwo = glm::translate(ModelSquareTwo, translateSquareTwo);
- glm::mat4 MVPThree = Projection * View * ModelSquareTwo; // Combine them into the MVP matrix
- // Send the MVP matrix to the shader
- glUniformMatrix4fv(MatrixIDS, 1, GL_FALSE, glm::value_ptr(MVPOne));
- glEnableVertexAttribArray(0);
- glBindBuffer(GL_ARRAY_BUFFER, vertexBufferSquareOne);
- glVertexAttribPointer(
- 0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glEnableVertexAttribArray(1);
- glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
- glVertexAttribPointer(
- 1, // attribute. No particular reason for 1, but must match the layout in the shader.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glDrawArrays(GL_TRIANGLES, 0, 12 * 3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
- glUniformMatrix4fv(MatrixIDS, 1, GL_FALSE, glm::value_ptr(MVPTwo));
- glEnableVertexAttribArray(2);
- glBindBuffer(GL_ARRAY_BUFFER, vertexBufferTriangle);
- glVertexAttribPointer(
- 2, // attribute 0. No particular reason for 0, but must match the layout in the shader.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glEnableVertexAttribArray(1);
- glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
- glVertexAttribPointer(
- 1, // attribute. No particular reason for 1, but must match the layout in the shader.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glDrawArrays(GL_TRIANGLES, 0, 3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
- glUniformMatrix4fv(MatrixIDS, 1, GL_FALSE, glm::value_ptr(MVPThree));
- glEnableVertexAttribArray(3);
- glBindBuffer(GL_ARRAY_BUFFER, vertexBufferSquareTwo);
- glVertexAttribPointer(
- 2, // attribute 0. No particular reason for 0, but must match the layout in the shader.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glEnableVertexAttribArray(1);
- glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
- glVertexAttribPointer(
- 1, // attribute. No particular reason for 1, but must match the layout in the shader.
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- glDrawArrays(GL_TRIANGLES, 0, 12 * 3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
- glDisableVertexAttribArray(0);
- glDisableVertexAttribArray(1);
- // Swap buffers
- glfwSwapBuffers(window.get());
- glfwPollEvents();
- } // Check if the ESC key was pressed or the window was closed
- while (glfwGetKey(window.get(), GLFW_KEY_ESCAPE) != GLFW_PRESS &&
- glfwWindowShouldClose(window.get()) == 0);
- }
- -------------------Shader code
- #version 330 core
- in vec3 fragmentColor;
- out vec3 color;
- void main()
- {
- color = fragmentColor;
- }
- #version 330 core
- layout(location = 0) in vec3 vertexPosition_modelspace;
- layout(location = 1) in vec3 vertexColor;
- uniform mat4 MVP; // Model-View-Projection matrix
- out vec3 fragmentColor;
- void main()
- {
- // Output position of the vertex, in clip space
- gl_Position = MVP * vec4(vertexPosition_modelspace, 1.0);
- fragmentColor = vertexColor;
- }
- ---------------Shader CPP and header
- #include "shader.h"
- #include <fstream>
- #include <sstream>
- #include <vector>
- #include <GL/glew.h>
- GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) {
- // Create the shaders
- GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
- GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
- // Read the Vertex Shader code from the file
- std::string VertexShaderCode;
- std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
- if (VertexShaderStream.is_open()) {
- std::stringstream sstr;
- sstr << VertexShaderStream.rdbuf();
- VertexShaderCode = sstr.str();
- VertexShaderStream.close();
- }
- else {
- printf("Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !\n", vertex_file_path);
- getchar();
- return 0;
- }
- // Read the Fragment Shader code from the file
- std::string FragmentShaderCode;
- std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
- if (FragmentShaderStream.is_open()) {
- std::stringstream sstr;
- sstr << FragmentShaderStream.rdbuf();
- FragmentShaderCode = sstr.str();
- FragmentShaderStream.close();
- }
- GLint Result = GL_FALSE;
- int InfoLogLength;
- // Compile Vertex Shader
- printf("Compiling shader : %s\n", vertex_file_path);
- char const* VertexSourcePointer = VertexShaderCode.c_str();
- glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL);
- glCompileShader(VertexShaderID);
- // Check Vertex Shader
- glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
- glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
- if (InfoLogLength > 0) {
- std::vector<char> VertexShaderErrorMessage(InfoLogLength + 1);
- glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
- printf("%s\n", &VertexShaderErrorMessage[0]);
- }
- // Compile Fragment Shader
- printf("Compiling shader : %s\n", fragment_file_path);
- char const* FragmentSourcePointer = FragmentShaderCode.c_str();
- glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL);
- glCompileShader(FragmentShaderID);
- // Check Fragment Shader
- glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
- glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
- if (InfoLogLength > 0) {
- std::vector<char> FragmentShaderErrorMessage(InfoLogLength + 1);
- glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
- printf("%s\n", &FragmentShaderErrorMessage[0]);
- }
- // Link the program
- printf("Linking program\n");
- GLuint ProgramID = glCreateProgram();
- glAttachShader(ProgramID, VertexShaderID);
- glAttachShader(ProgramID, FragmentShaderID);
- glLinkProgram(ProgramID);
- // Check the program
- glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
- glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
- if (InfoLogLength > 0) {
- std::vector<char> ProgramErrorMessage(InfoLogLength + 1);
- glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
- printf("%s\n", &ProgramErrorMessage[0]);
- }
- glDetachShader(ProgramID, VertexShaderID);
- glDetachShader(ProgramID, FragmentShaderID);
- glDeleteShader(VertexShaderID);
- glDeleteShader(FragmentShaderID);
- return ProgramID;
- }
- ---------
- #ifndef SHADER_H
- #define SHADER_H
- #include <GL/glew.h>
- GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path);
- #endif // SHADER_H
Advertisement
Add Comment
Please, Sign In to add comment