From 385161352767b3f9d4c2487c165c7d9821ab3711 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 6 Jan 2024 15:33:39 +0200 Subject: [PATCH] optional generation of PBR elements --- mesh.cpp | 74 +++++++++++++++++++++++++++++--------------------------- mesh.h | 3 +-- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/mesh.cpp b/mesh.cpp index 46ff1d6..c8c8a25 100755 --- a/mesh.cpp +++ b/mesh.cpp @@ -38,43 +38,8 @@ namespace vb01{ glDeleteBuffers(1, &VBO); } - void Mesh::construct(){ - string libPath = Root::getSingleton()->getLibPath(); - environmentShader = new Shader(libPath + "environmentPreFilter"); - irradianceShader = new Shader(libPath + "irradiance"); - brdfIntegrationShader = new Shader(libPath + "brdfIntegration"); - - prefilterMap = new Texture(preFilterMapSize, false); - irradianceMap = new Texture(irradianceMapSize, false); - postfilterMap = new Texture(environmentMapSize, false, 5); - brdfIntegrationMap = new Texture(brdfMapSize, brdfMapSize, false); - - initFramebuffer(preFilterFramebuffer, preFilterRenderbuffer, preFilterMapSize); - initFramebuffer(irrandianceFramebuffer, irradianceRenderbuffer, irradianceMapSize); - initFramebuffer(postFilterFramebuffer, postFilterRenderbuffer, environmentMapSize); - initFramebuffer(brdfFramebuffer, brdfRenderbuffer, brdfMapSize); - - initMesh(); - } - - void Mesh::initFramebuffer(u32 &framebuffer, u32 &renderbuffer, int width){ - glGenFramebuffers(1, &framebuffer); - glGenRenderbuffers(1, &renderbuffer); - - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - glBindRenderbuffer(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 << "Mesh framebuffer not complete\n"; - - glBindFramebuffer(GL_FRAMEBUFFER, *Root::getSingleton()->getFBO()); - } - //TODO allow to init meshes to be drawn statically or dynamically - void Mesh::initMesh(){ + void Mesh::construct(){ glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); @@ -108,6 +73,22 @@ namespace vb01{ } } + void Mesh::initFramebuffer(u32 &framebuffer, u32 &renderbuffer, int width){ + glGenFramebuffers(1, &framebuffer); + glGenRenderbuffers(1, &renderbuffer); + + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glBindRenderbuffer(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 << "Mesh framebuffer not complete\n"; + + glBindFramebuffer(GL_FRAMEBUFFER, *Root::getSingleton()->getFBO()); + } + void Mesh::updateVerts(MeshData meshData){ glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferSubData(GL_ARRAY_BUFFER, 0, 3 * sizeof(MeshData::Vertex) * meshBase.numTris, meshData.vertices); @@ -417,4 +398,25 @@ namespace vb01{ glPolygonMode(GL_FRONT_AND_BACK, wireframe ? GL_LINE : GL_FILL); glDrawElements(GL_TRIANGLES, 3 * meshBase.numTris, GL_UNSIGNED_INT, 0); } + + void Mesh::setReflect(bool reflect){ + this->reflect = reflect; + + if(reflect && !environmentShader){ + string libPath = Root::getSingleton()->getLibPath(); + environmentShader = new Shader(libPath + "environmentPreFilter"); + irradianceShader = new Shader(libPath + "irradiance"); + brdfIntegrationShader = new Shader(libPath + "brdfIntegration"); + + prefilterMap = new Texture(preFilterMapSize, false); + irradianceMap = new Texture(irradianceMapSize, false); + postfilterMap = new Texture(environmentMapSize, false, 5); + brdfIntegrationMap = new Texture(brdfMapSize, brdfMapSize, false); + + initFramebuffer(preFilterFramebuffer, preFilterRenderbuffer, preFilterMapSize); + initFramebuffer(irrandianceFramebuffer, irradianceRenderbuffer, irradianceMapSize); + initFramebuffer(postFilterFramebuffer, postFilterRenderbuffer, environmentMapSize); + initFramebuffer(brdfFramebuffer, brdfRenderbuffer, brdfMapSize); + } + } } diff --git a/mesh.h b/mesh.h index c73d7cd..6d69172 100755 --- a/mesh.h +++ b/mesh.h @@ -24,9 +24,9 @@ namespace vb01{ void updateVerts(MeshData); virtual void update(); void render(); + void setReflect(bool); inline void setMaterial(Material *mat){this->material = mat;} inline void setCastShadow(bool castShadow){this->castShadow = castShadow;} - inline void setReflect(bool r){this->reflect = r;} inline void setReflective(bool r){this->reflective = r;} inline void setWireframe(bool w){this->wireframe = w;} inline void setSkeleton(Skeleton *sk){this->skeleton = sk;} @@ -41,7 +41,6 @@ namespace vb01{ inline Texture* getBrdfIntegrationMap(){return brdfIntegrationMap;} inline MeshData getMeshBase(){return meshBase;} private: - void initMesh(); void initFramebuffer(u32&, u32&, int); void updateSkeleton(Shader*); void updatePrefilterMap(Vector3, glm::mat4&, glm::vec3[6]);