Update Framebuffer resize code

This commit is contained in:
2021-01-12 09:17:48 +01:00
parent 737747a46c
commit e1a51b86b6
6 changed files with 56 additions and 38 deletions

View File

@@ -1,5 +1,5 @@
[Window][Debug##Default] [Window][Debug##Default]
Pos=60,60 Pos=-18,59
Size=400,400 Size=400,400
Collapsed=0 Collapsed=0
@@ -9,7 +9,7 @@ Size=894,195
Collapsed=0 Collapsed=0
[Window][Debug Utils] [Window][Debug Utils]
Pos=10,7 Pos=-18,7
Size=871,365 Size=871,365
Collapsed=0 Collapsed=0

View File

@@ -79,16 +79,15 @@ Controller::~Controller()
ImGui::DestroyContext(); ImGui::DestroyContext();
#endif #endif
delete gameWindow;
delete gameEventHandler;
delete camera;
for (auto it = shaderPrograms.begin(); it != shaderPrograms.end(); it++) { for (auto it = shaderPrograms.begin(); it != shaderPrograms.end(); it++) {
delete *it; delete *it;
} }
delete pp_framebuffer; delete camera;
delete menu; delete menu;
delete pp_framebuffer;
delete gameEventHandler;
delete gameWindow;
glfwTerminate(); glfwTerminate();
} }
@@ -116,7 +115,7 @@ void Controller::run()
// This is the game loop // This is the game loop
while (!glfwWindowShouldClose(gameWindow->getGLFWwindow())) { while (!glfwWindowShouldClose(gameWindow->getGLFWwindow())) {
// --- Timing --- // --- Timing ---
limit_framerate(); //limit_framerate();
// --- Update game --- // --- Update game ---
@@ -174,7 +173,7 @@ void Controller::run()
// Update window size // Update window size
if (gameWindow->checkWindowWasResized()) { if (gameWindow->checkWindowWasResized()) {
updateWindowSize(getShaderProgramByName("postProcessingProgram")); updateWindowSize();
} }
// --- Check events, handle input --- // --- Check events, handle input ---
@@ -218,13 +217,12 @@ void Controller::error_callback(int error, const char *description)
fprintf(stderr, "Error: %s\n", description); fprintf(stderr, "Error: %s\n", description);
} }
void Controller::updateWindowSize(ShaderProgram *pp_program) void Controller::updateWindowSize()
{ {
camera->updateAspectRatio(gameWindow->getWindowAspectRatio()); camera->updateAspectRatio(gameWindow->getWindowAspectRatio());
gameEventHandler->setFirstMouseInput(1); gameEventHandler->setFirstMouseInput(1);
delete pp_framebuffer; pp_framebuffer->changeDimensions(gameWindow->getWindowWidth(), gameWindow->getWindowHeight());
pp_framebuffer = new Framebuffer(gameWindow->getWindowWidth(), gameWindow->getWindowHeight(), pp_program);
} }
void Controller::updateExposure(ShaderProgram *shaderProgram) void Controller::updateExposure(ShaderProgram *shaderProgram)
@@ -276,7 +274,7 @@ void Controller::renderImGui(World &world, PointLight *pointLight, glm::vec3 *li
ImGui::Checkbox("Rotate Object", rotateEntity); ImGui::Checkbox("Rotate Object", rotateEntity);
Entity *mainObject = world.getEntityById(0); Entity *mainObject = world.getEntityById(0);
//mainObject->setPosition(glm::vec3(translation[0], translation[1], translation[2])); mainObject->setPosition(glm::vec3(translation[0], translation[1], translation[2]));
if (!*rotateEntity) { if (!*rotateEntity) {
//mainObject->setRotation(glm::vec3(0.f, 1.0f, 0.f), rotation); //mainObject->setRotation(glm::vec3(0.f, 1.0f, 0.f), rotation);
} }

View File

@@ -28,7 +28,7 @@ public:
private: private:
void limit_framerate(); void limit_framerate();
void updateWindowSize(ShaderProgram *pp_program); void updateWindowSize();
void updateExposure(ShaderProgram *shaderProgram); void updateExposure(ShaderProgram *shaderProgram);
ShaderProgram* getShaderProgramByName(const char *name); ShaderProgram* getShaderProgramByName(const char *name);

View File

@@ -3,30 +3,12 @@
#include <cstddef> #include <cstddef>
#include <iostream> #include <iostream>
Framebuffer::Framebuffer(uint32_t width, uint32_t height, ShaderProgram *shaderProgram) Framebuffer::Framebuffer(uint32_t width, uint32_t height, ShaderProgram *shaderProgram) :
shaderProgram(shaderProgram)
{ {
this->shaderProgram = shaderProgram;
glGenFramebuffers(1, &FBO); glGenFramebuffers(1, &FBO);
glGenTextures(2, textures); generateTextutes(width, height);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, width, height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
bind();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, textures[1], 0);
unbind();
} }
Framebuffer::~Framebuffer() Framebuffer::~Framebuffer()
@@ -73,6 +55,38 @@ void Framebuffer::render(GLuint customTextureId)
shaderProgram->unbind(); shaderProgram->unbind();
} }
void Framebuffer::changeDimensions(uint32_t width, uint32_t height)
{
// Delete old textures
glDeleteTextures(2, textures);
generateTextutes(width, height);
}
void Framebuffer::generateTextutes(uint32_t width, uint32_t height)
{
// Create new textures
glGenTextures(2, textures);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, width, height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
bind();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, textures[1], 0);
unbind();
}
void Framebuffer::setExposureCorrection(bool exposureCorrection) void Framebuffer::setExposureCorrection(bool exposureCorrection)
{ {
shaderProgram->bind(); shaderProgram->bind();

View File

@@ -7,7 +7,7 @@
class Framebuffer class Framebuffer
{ {
public: public:
Framebuffer(uint32_t width, uint32_t height, ShaderProgram *ShaderProgram); Framebuffer(uint32_t width, uint32_t height, ShaderProgram* shaderProgram);
~Framebuffer(); ~Framebuffer();
void bind(); void bind();
@@ -15,6 +15,8 @@ public:
void render(GLuint customTextureId = 0); void render(GLuint customTextureId = 0);
void changeDimensions(uint32_t width, uint32_t height);
GLuint getTextureId() GLuint getTextureId()
{ {
return textures[0]; return textures[0];
@@ -22,6 +24,8 @@ public:
void setExposureCorrection(bool exposureCorrection); void setExposureCorrection(bool exposureCorrection);
private: private:
void generateTextutes(uint32_t width, uint32_t height);
GLuint FBO; GLuint FBO;
GLuint textures[2]; GLuint textures[2];

View File

@@ -37,8 +37,10 @@ std::vector<Model*> JsonParser::getModels()
std::string model_name = modelsJson[index]["unique_name"].asString(); std::string model_name = modelsJson[index]["unique_name"].asString();
std::string model_path = modelsJson[index]["path"].asString(); std::string model_path = modelsJson[index]["path"].asString();
Model *current_model = new Model(model_name, model_path); Model *current_model = new Model(model_name, model_path);
temp_models.push_back(current_model); if(current_model) {
std::cout << "Loaded Model \"" << model_name << "\" from \"" << model_path << "\"" << std::endl; temp_models.push_back(current_model);
std::cout << "Loaded Model \"" << model_name << "\" from \"" << model_path << "\"" << std::endl;
}
} }
return temp_models; return temp_models;