From 5fc6ad7c007d92cf505fc3e5421f50a2c96002ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ciesi=C3=B3=C5=82ka?= Date: Mon, 30 Jan 2023 23:53:19 +0100 Subject: [PATCH] =?UTF-8?q?Prze=C5=9Blij=20pliki=20do=20'src'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ex_9_1.hpp | 139 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 136 insertions(+), 3 deletions(-) diff --git a/src/ex_9_1.hpp b/src/ex_9_1.hpp index 6689b21..1bf386f 100644 --- a/src/ex_9_1.hpp +++ b/src/ex_9_1.hpp @@ -15,12 +15,16 @@ #include #include #include +#include "SOIL/stb_image_aug.h" const unsigned int SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024; int WIDTH = 900, HEIGHT = 900; +unsigned int skyboxVAO, skyboxVBO, skyboxEBO; +unsigned int cubemapTexture; + namespace models { Core::RenderContext spaceshipContext; Core::RenderContext sphereContext; @@ -117,7 +121,40 @@ glm::vec3 spotlightConeDir = glm::vec3(0, 0, 0); glm::vec3 spotlightColor = glm::vec3(0.4, 0.4, 0.9)*3; float spotlightPhi = 3.14 / 4; +float skyboxVertices[] = +{ + // Coordinates + -1.0f, -1.0f, 1.0f,// 7--------6 + 1.0f, -1.0f, 1.0f,// /| /| + 1.0f, -1.0f, -1.0f,// 4--------5 | + -1.0f, -1.0f, -1.0f,// | | | | + -1.0f, 1.0f, 1.0f,// | 3------|-2 + 1.0f, 1.0f, 1.0f,// |/ |/ + 1.0f, 1.0f, -1.0f,// 0--------1 + -1.0f, 1.0f, -1.0f +}; +unsigned int skyboxIndices[] = +{ + // Right + 1, 2, 6, + 6, 5, 1, + // Left + 0, 4, 7, + 7, 3, 0, + // Top + 4, 5, 6, + 6, 7, 4, + // Bottom + 0, 3, 2, + 2, 1, 0, + // Back + 0, 1, 5, + 5, 4, 0, + // Front + 3, 7, 6, + 6, 2, 3 +}; float lastTime = -1.f; float deltaTime = 0.f; @@ -287,6 +324,9 @@ void renderScene(GLFWwindow* window) glUniform1f(glGetUniformLocation(programSun, "exposition"), exposition); Core::DrawContext(sphereContext); + glUseProgram(programSkybox); + glUniform1i(glGetUniformLocation(programSkybox, "skybox"), 0); + glUseProgram(program); drawObjectPBR(models::floor, glm::mat4(), @@ -402,6 +442,30 @@ void renderScene(GLFWwindow* window) spotlightConeDir = spaceshipDir; else spotlightConeDir = -spaceshipDir; + + glDepthFunc(GL_LEQUAL); + + glUseProgram(programSkybox); + glm::mat4 view = glm::mat4(1.0f); + glm::mat4 projection = glm::mat4(1.0f); + // We make the mat4 into a mat3 and then a mat4 again in order to get rid of the last row and column + // The last row and column affect the translation of the skybox (which we don't want to affect) + view = glm::mat4(glm::mat3(glm::lookAt(cameraPos, cameraPos + cameraDir, Up))); + projection = glm::perspective(glm::radians(45.0f), (float)WIDTH / HEIGHT, 0.1f, 100.0f); + glUniformMatrix4fv(glGetUniformLocation(programSkybox, "view"), 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(glGetUniformLocation(programSkybox, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); + + // Draws the cubemap as the last object so we can save a bit of performance by discarding all fragments + // where an object is present (a depth of 1.0f will always fail against any object's depth value) + glBindVertexArray(skyboxVAO); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture); + glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); + glBindVertexArray(0); + + // Switch back to the normal depth function + glDepthFunc(GL_LESS); + glUseProgram(0); glfwSwapBuffers(window); } @@ -425,6 +489,73 @@ void loadModelToContext(std::string path, Core::RenderContext& context) context.initFromAssimpMesh(scene->mMeshes[0]); } +void initSkybox() { + + glUseProgram(programSkybox); + //unsigned int skyboxVAO, skyboxVBO, skyboxEBO; + glGenVertexArrays(1, &skyboxVAO); + glGenBuffers(1, &skyboxVBO); + glGenBuffers(1, &skyboxEBO); + glBindVertexArray(skyboxVAO); + glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, skyboxEBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(skyboxIndices), &skyboxIndices, GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + std::string facesCubemap[6] = + { + "./top.jpg", + "./top.jpg", + "./top.jpg", + "./top.jpg", + "./top.jpg", + "./top.jpg" + }; + + //unsigned int cubemapTexture; + glGenTextures(1, &cubemapTexture); + glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // These are very important to prevent seams + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + for (unsigned int i = 0; i < 6; i++) + { + int width, height, nrChannels; + unsigned char* data = stbi_load(facesCubemap[i].c_str(), &width, &height, &nrChannels, 0); + if (data) + { + //stbi_set_flip_vertically_on_load(false); + glTexImage2D + ( + GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, + 0, + GL_RGB, + width, + height, + 0, + GL_RGB, + GL_UNSIGNED_BYTE, + data + ); + stbi_image_free(data); + } + else + { + std::cout << "Failed to load texture: " << facesCubemap[i] << std::endl; + stbi_image_free(data); + } + } +} + void initDepthMap() { glGenFramebuffers(1, &depthMapFBO); @@ -449,12 +580,14 @@ void init(GLFWwindow* window) { glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); initDepthMap(); + initSkybox(); glEnable(GL_DEPTH_TEST); program = shaderLoader.CreateProgram("shaders/shader_9_1.vert", "shaders/shader_9_1.frag"); programSun = shaderLoader.CreateProgram("shaders/shader_8_sun.vert", "shaders/shader_8_sun.frag"); programDepth = shaderLoader.CreateProgram("shaders/shader_depth.vert", "shaders/shader_depth.frag"); - + programSkybox = shaderLoader.CreateProgram("shaders/skybox.vert", "shaders/skybox.frag"); + loadModelToContext("./models/sphere.obj", sphereContext); loadModelToContext("./models/spaceship.obj", shipContext); @@ -513,9 +646,9 @@ void processInput(GLFWwindow* window) glfwSetWindowShouldClose(window, true); } if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) - spaceshipPos += spaceshipDir * moveSpeed; + spaceshipPos += glm::vec3(cameraDir.x, 0.0f, cameraDir.z) * moveSpeed; if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) - spaceshipPos -= spaceshipDir * moveSpeed; + spaceshipPos -= glm::vec3(cameraDir.x, 0.0f, cameraDir.z) * moveSpeed; if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) spaceshipPos += spaceshipSide * moveSpeed; if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)