#pragma once #include "glew.h" #include "glm.hpp" #include "ext.hpp" #include #include #include #include "Shader_Loader.h" #include "Render_Utils.h" #include "Box.cpp" GLuint program; Core::Shader_Loader shaderLoader; glm::vec4 background_color = glm::vec4(0.3, 0.3, 0.5, 1.0); GLuint VAO,VBO; void renderScene(GLFWwindow* window) { float time = glfwGetTime(); //glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearColor(background_color[0], background_color[1], background_color[2], background_color[3]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // ZADANIE: W zalaczonym wyzej pliku Box.cpp znajduja sie tablice pozycji i kolorow wierzcholkow prostopadloscianu. Przesun go o wektor (0.5, 0.5, -0.2) i wyswietl go. // // Do shadera uzytego w tym zadaniu nalezy przeslac nie tylko pozycje, ale rowniez kolory wierzcholkow. // W funkcji init należy przesłać pozycje i kolory do GPU //Zad 5 glUseProgram(program); glUniform1f(glGetUniformLocation(program, "time"), time); //zad 6* glUniform4fv(glGetUniformLocation(program, "background_color"), 1, (GLfloat*)&background_color); glm::mat4 transformation = glm::eulerAngleXYZ(1.0f, 0.f, 50.f); glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); // Powiąż stworzone VAO za pomocą funkcji glBindVertexArray glBindVertexArray(VAO); // wykorzystaj glDrawArrays do narysowania prostopadłościanu glDrawArrays(GL_TRIANGLES, 0, 36); glUseProgram(0); glfwSwapBuffers(window); } void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } void init(GLFWwindow* window) { glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glEnable(GL_DEPTH_TEST); program = shaderLoader.CreateProgram("shaders/shader_2_1.vert", "shaders/shader_2_1.frag"); // Dokładny opis działania funkcji z poniższych punktów można znaleźć na slajdach z wykładu, w dokumentacji https://www.khronos.org/registry/OpenGL-Refpages/gl4/ funkcje są opisane także na stronach https://learnopengl.com/Getting-started/Hello-Triangle https://learnopengl.com/Getting-started/Shaders oraz https://open.gl/drawing // W tablicy box są pozycje i kolory kostki, celem zajęć jest narysowanie tej kostki // Zainicjalizuj VertexArrayObject (VAO) i zapisz w nim atrybuty prostopadłościanu // I Stwórz VAO // 1. Stwórz nowy VAO za pomocą glGenVertexArrays i przypisz jego adres do zmiennej globalnej glGenVertexArrays(1, &VAO); // 2. Powiąż stworzone VAO za pomocą funkcji glBindVertexArray glBindVertexArray(VAO); // II Zainicjalizuj VBO // 3. Stwórz VertexBufferObject do przechowywania pozycji wierzchołków za pomocą funkcji glGenBuffers glGenBuffers(1, &VBO); // 4. Powiąż stworzone VBO za pomocą funkcji glBindBuffer(GLenum target, GLuint ) glBindBuffer(GL_ARRAY_BUFFER, VBO); // 5. Zaalokuj w GPU miejsce na tablice box i zaalakokuj ją za pomocą glBufferData glBufferData(GL_ARRAY_BUFFER, sizeof(box), box, GL_STATIC_DRAW); //std::cout << sizeof(box); // II Stwórz definicję danych w buforze // 6. Aktywuj atrybut powiązany z pozycją wierchołków za pomocą glEnableVertexAttribArray(GLuint index). Indeks jest zapisany w shaderze wierzchołków w 3. lini. Można odpytać shader o indeks za pomocą funkcji glGetAttribLocation(GL uint program, const GLchar *name) glEnableVertexAttribArray(0); // 6. Aktywuj atrybut powiązany z kolorem wierchołków za pomocą glEnableVertexAttribArray(GLuint index). Indeks jest zapisany w shaderze wierzchołków w 4. lini. Można odpytać shader o indeks za pomocą funkcji glGetAttribLocation(GL uint program, const GLchar *name) glEnableVertexAttribArray(1); // 8. Zdefiniuj jak OpenGL powinien interpretować dane za pomocą glVertexAttribPointer glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*) (4 * sizeof(float))); // w renderScene! //glBindVertexArray(VAO); ///glDrawArrays(GL_TRIANGLES, 0, 36); // 9. Uwolnij VAO za pomocą funkcji glBindVertexArray(0) glBindVertexArray(0); } void shutdown(GLFWwindow* window) { shaderLoader.DeleteProgram(program); } //obsluga wejscia void processInput(GLFWwindow* window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } // funkcja jest glowna petla void renderLoop(GLFWwindow* window) { while (!glfwWindowShouldClose(window)) { processInput(window); renderScene(window); glfwPollEvents(); } } //}