I'm looking to render multiple objects (rectangles) with different shaders. So far I've managed to render one rectangle made out of 2 triangles and apply shader to it, but when it comes to render another I get stucked. Searched for documentations or stuffs that could help me, but everything shows how to render only 1 object. Any tips or help is highly appreciated, thanks!
Here's my code for rendering one object with shader!
#define GLEW_STATIC
#include <stdio.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "window.h"
#define GLSL(src) "#version 330 core\n" #src
// #define ASSERT(expression, msg) if(expression) {fprintf(stderr, "Error on line %d: %s\n", __LINE__, msg);return -1;}
int main() {
// Init GLFW
if (glfwInit() != GL_TRUE) {
std::cerr << "Failed to initialize GLFW\n" << std::endl;
exit(EXIT_FAILURE);
}
// Create a rendering window with OpenGL 3.2 context
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
// assing window pointer
GLFWwindow *window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);
glfwMakeContextCurrent(window);
// Init GLEW
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
std::cerr << "Failed to initialize GLEW\n" << std::endl;
exit(EXIT_FAILURE);
}
// ----------------------------- RESOURCES ----------------------------- //
// create gl data
const GLfloat positions[8] = {
-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
-0.5f, 0.5f,
};
const GLuint elements[6] = {
0, 1, 2,
2, 3, 0
};
// Create Vertex Array Object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Create a Vertex Buffer Object and copy the vertex data to it
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
// Specify the layout of the vertex data
glEnableVertexAttribArray(0); // layout(location = 0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
// Create a Elements Buffer Object and copy the elements data to it
GLuint ebo;
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
// Create and compile the vertex shader
const GLchar *vertexSource = GLSL(
layout(location = 0) in vec2 position;
void main() {
gl_Position = vec4(position, 0.0, 1.0);
}
);
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
// Create and compile the fragment shader
const char* fragmentSource = GLSL(
out vec4 gl_FragColor;
uniform vec2 u_resolution;
void main() {
vec2 pos = gl_FragCoord.xy / u_resolution;
gl_FragColor = vec4(1.0);
}
);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
// Link the vertex and fragment shader into a shader program
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
// get uniform's id by name and set value
GLint uRes = glGetUniformLocation(shaderProgram, "u_Resolution");
glUniform2f(uRes, 800.0f, 600.0f);
// ---------------------------- RENDERING ------------------------------ //
while(!glfwWindowShouldClose(window)) {
// Clear the screen to black
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.5f, 1.0f, 1.0f);
// Draw a rectangle made of 2 triangles -> 6 vertices
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);
// Swap buffers and poll window events
glfwSwapBuffers(window);
glfwPollEvents();
}
// ---------------------------- CLEARING ------------------------------ //
// Delete allocated resources
glDeleteProgram(shaderProgram);
glDeleteShader(fragmentShader);
glDeleteShader(vertexShader);
glDeleteBuffers(1, &vbo);
glDeleteVertexArrays(1, &vao);
return 0;
}
↧