mirror of
https://github.com/ApfelTeeSaft/vb01.git
synced 2026-08-26 19:33:45 +00:00
framebuffer related bugfixes
setting already present material uniforms
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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));}
|
||||
|
||||
@@ -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<Node*> 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(){
|
||||
|
||||
@@ -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<Mesh*> meshes;
|
||||
|
||||
+17
-13
@@ -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){
|
||||
|
||||
Reference in New Issue
Block a user