From 5ca6e8b16f28c1badc38bbca657380f412a855d8 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 22 Nov 2021 20:30:31 +0200 Subject: [PATCH] framebuffer related bugfixes setting already present material uniforms --- material.cpp | 6 ++++ material.h | 1 + mesh.cpp | 84 +++++++++++++++++++++++----------------------------- mesh.h | 6 ++-- texture.cpp | 30 +++++++++++-------- texture.h | 2 +- 6 files changed, 66 insertions(+), 63 deletions(-) diff --git a/material.cpp b/material.cpp index 3fa95a9..24558fc 100755 --- a/material.cpp +++ b/material.cpp @@ -26,6 +26,12 @@ namespace vb01{ return uni; } + void Material::setTexUniform(string name, Texture *texture, bool animatable){ + TextureUniform *uni = (TextureUniform*)getUniform(name); + uni->value = texture; + uni->animatable = animatable; + } + void Material::update(){ shader->use(); diff --git a/material.h b/material.h index 6b814d0..8642645 100755 --- a/material.h +++ b/material.h @@ -151,6 +151,7 @@ namespace vb01{ Material(std::string, bool = false); ~Material(); void update(); + void setTexUniform(std::string, Texture*, bool); Uniform* getUniform(std::string); inline Uniform* getUniform(int i){return uniforms[i];} inline void addIntUniform(std::string name, int value){uniforms.push_back(new IntUniform(name, value));} diff --git a/mesh.cpp b/mesh.cpp index 4aa6f20..96351fa 100755 --- a/mesh.cpp +++ b/mesh.cpp @@ -64,31 +64,28 @@ namespace vb01{ environmentShader = new Shader(libPath + "environmentPreFilter"); brdfIntegrationShader = new Shader(libPath + "brdfIntegration"); - environmentMap = new Texture(reflectionSize, 5, false); + environmentMap = new Texture(reflectionSize, false, 5); brdfIntegrationMap = new Texture(reflectionSize, reflectionSize, false); + int width = reflectionSize; - initFramebuffer(preFilterFramebuffer, preFilterRenderbuffer, environmentMap, reflectionSize); - initFramebuffer(brdfFramebuffer, brdfRenderbuffer, brdfIntegrationMap, reflectionSize); + initFramebuffer(preFilterFramebuffer, preFilterRenderbuffer, reflectionSize); + initFramebuffer(brdfFramebuffer, brdfRenderbuffer, reflectionSize); initMesh(); } - void Mesh::initFramebuffer(u32 &framebuffer, u32 &renderbuffer, Texture *map, int width){ + void Mesh::initFramebuffer(u32 &framebuffer, u32 &renderbuffer, int width){ glGenFramebuffers(1, &framebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - - if(map->isCubemap()) - glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, *map->getTexture(), 0); - else - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *map->getTexture(), 0); - glGenRenderbuffers(1, &renderbuffer); + + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, width); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuffer); + + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, width); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer); if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - cout << "Environment framebuffer not complete\n"; + cout << "Mesh framebuffer not complete\n"; glBindFramebuffer(GL_FRAMEBUFFER, 0); } @@ -170,7 +167,6 @@ namespace vb01{ shader->setBool(castShadow, "castShadow"); shader->setBool(skeleton, "animated"); - shader->setBool(false, "environmentMapEnabled"); shader->setMat4(view, "view"); shader->setMat4(proj, "proj"); shader->setVec3(camPos, "camPos"); @@ -246,16 +242,11 @@ namespace vb01{ } void Mesh::updatePrefilterMap(Vector3 pos){ - Root *root = Root::getSingleton(); - + /* Node *rootNode = root->getRootNode(); vector descendants; rootNode->getDescendants(descendants); - Mesh *skybox = root->getSkybox(); - Texture *skyboxTex = ((Material::TextureUniform*)skybox->getMaterial()->getUniform("skybox"))->value; - - /* for(Node *node : descendants){ for(Mesh *mesh : node->getMeshes()) if(mesh != this && mesh->isReflectible()){ @@ -283,40 +274,38 @@ namespace vb01{ } } */ - - vec3 dirs[]{vec3(1, 0, 0), vec3(-1, 0, 0), vec3(0, 1, 0), vec3(0, -1, 0), vec3(0, 0, 1), vec3(0, 0, -1)}; - float far = 100; - mat4 proj = perspective(radians(90.f), 1.f, .1f, far); + Root *root = Root::getSingleton(); + Mesh *skybox = root->getSkybox(); + Texture *skyboxTex = ((Material::TextureUniform*)skybox->getMaterial()->getUniform("skybox"))->value; glBindFramebuffer(GL_FRAMEBUFFER, preFilterFramebuffer); glBindRenderbuffer(GL_RENDERBUFFER, preFilterRenderbuffer); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + skyboxTex->select(); + + environmentShader->use(); + environmentShader->setInt(0, "environmentMap"); + mat4 proj = perspective(radians(90.f), 1.f, .1f, 100.f); + environmentShader->setMat4(proj, "proj"); + environmentShader->setMat4(mat4(1.f), "model"); int numMipmaps = environmentMap->getMipmapLevel(); - environmentShader->use(); + vec3 dirs[]{vec3(1, 0, 0), vec3(-1, 0, 0), vec3(0, 1, 0), vec3(0, -1, 0), vec3(0, 0, 1), vec3(0, 0, -1)}; for(int i = 0; i < numMipmaps; ++i){ u32 width = reflectionSize * pow(0.5, i); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, width); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, width); glViewport(0, 0, width, width); + environmentShader->setFloat((float)i / numMipmaps, "roughness"); + for(int j = 0; j < 6; j++){ - vec3 upVec; - - if(1 < j && j < 4) - upVec = vec3(0, 0, -1); - else - upVec = vec3(0, -1, 0); - - environmentShader->setMat4(proj, "proj"); - environmentShader->setMat4(lookAt(vec3(0), dirs[j], upVec), "view"); - environmentShader->setMat4(mat4(1.f), "model"); - environmentShader->setInt(0, "environmentMap"); - environmentShader->setFloat((float)i / numMipmaps, "roughness"); - - skyboxTex->select(); + vec3 v = vec3(pos.x, pos.y, pos.z); + vec3 upVec = (fabs(dirs[j].y) == 1 ? vec3(0, 0, -1) : vec3(0, 1, 0)); + environmentShader->setMat4(lookAt(v, v + dirs[j], upVec), "view"); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, *environmentMap->getTexture(), i); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(skybox) skybox->render(); @@ -329,13 +318,13 @@ namespace vb01{ void Mesh::updateBrdfLut(){ glBindFramebuffer(GL_FRAMEBUFFER, brdfFramebuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *brdfIntegrationMap->getTexture(), 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glViewport(0, 0, reflectionSize, reflectionSize); glBindRenderbuffer(GL_RENDERBUFFER, brdfRenderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, reflectionSize, reflectionSize); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, reflectionSize, reflectionSize); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *brdfIntegrationMap->getTexture(), 0); brdfIntegrationShader->use(); @@ -352,13 +341,14 @@ namespace vb01{ Shader *shader = material->getShader(); shader->use(); + int brdfId = 10, preFilterId = 11; - shader->setInt(brdfId, "brdfIntegrationMap"); shader->setInt(preFilterId, "preFilterMap"); + shader->setInt(brdfId, "brdfIntegrationMap"); - environmentMap->select(brdfId); - brdfIntegrationMap->select(preFilterId); + environmentMap->select(preFilterId); + brdfIntegrationMap->select(brdfId); } void Mesh::render(){ diff --git a/mesh.h b/mesh.h index e51052b..3f8b31d 100755 --- a/mesh.h +++ b/mesh.h @@ -57,9 +57,11 @@ namespace vb01{ inline u32* getIndices(){return indices;} inline ShapeKey& getShapeKey(int i){return shapeKeys[i];} inline int getNumShapeKeys(){return numShapeKeys;} + inline Texture* getEnvironmentMap(){return environmentMap;} + inline Texture* getBrdfIntegrationMap(){return brdfIntegrationMap;} private: void initMesh(); - void initFramebuffer(u32&, u32&, Texture*, int); + void initFramebuffer(u32&, u32&, int); void updateSkeleton(Shader*); void updatePrefilterMap(Vector3); void updateBrdfLut(); @@ -67,9 +69,9 @@ namespace vb01{ void updateShapeKeys(Shader*); int reflectionSize = 512; + Texture *environmentMap = nullptr, *brdfIntegrationMap = nullptr; Shader *environmentShader = nullptr, *brdfIntegrationShader = nullptr; u32 preFilterFramebuffer, preFilterRenderbuffer, brdfFramebuffer, brdfRenderbuffer; - Texture *environmentMap = nullptr, *brdfIntegrationMap = nullptr; Material *material = nullptr; Node *node = nullptr; std::vector meshes; diff --git a/texture.cpp b/texture.cpp index 16b8dc3..4aa5d3e 100755 --- a/texture.cpp +++ b/texture.cpp @@ -50,7 +50,7 @@ namespace vb01{ if(cubemap){ texture = new u32; - createCubemap(false, flip); + createCubemap(false, flip, true); } else{ texture = new u32[numPaths]; @@ -88,12 +88,13 @@ namespace vb01{ Texture::Texture(int width, bool depth, int mipmapLevel){ this->width = width; this->mipmapLevel = mipmapLevel; + this->cubemap = true; texture = new u32; - createCubemap(depth, false); + createCubemap(depth, false, false); } - void Texture::createCubemap(bool depth, bool flip){ + void Texture::createCubemap(bool depth, bool flip, bool fromFile){ glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_CUBE_MAP, texture[0]); @@ -102,18 +103,20 @@ namespace vb01{ for(int i = 0; i < 6; i++){ if(!depth){ - data = stbi_load(paths[i].c_str(), &width, &height, &numChannels, 0); + if(fromFile){ + data = stbi_load(paths[i].c_str(), &width, &height, &numChannels, 0); - if(data){ - glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); - stbi_image_free(data); + if(data){ + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, width, 0, GL_RGB, GL_UNSIGNED_BYTE, data); + stbi_image_free(data); + } + else{ + cout << "Failed to read cubemap texture " << i << endl; + exit(-1); + } } - else{ - cout << "Failed to read cubemap texture " << i << endl; - exit(-1); - } - - glGenerateMipmap(GL_TEXTURE_CUBE_MAP); + else + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, width, 0, GL_RGB, GL_FLOAT, NULL); } else{ glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT, width, width, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); @@ -125,6 +128,7 @@ namespace vb01{ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glGenerateMipmap(GL_TEXTURE_CUBE_MAP); } Texture::Texture(FT_Face &face, char ch){ diff --git a/texture.h b/texture.h index bc769ab..349f994 100755 --- a/texture.h +++ b/texture.h @@ -35,7 +35,7 @@ namespace vb01{ u8 *data; std::string *paths = nullptr; - void createCubemap(bool, bool); + void createCubemap(bool, bool, bool); void create2DTexture(bool); inline int getNextFrame(int frameId){return (frameId + 1 < numFrames ? frameId + 1 : 0);} };