Program Listing for File GeometryPass.cpp
↰ Return to documentation for file (Src/GraphicsEngineOpenGL/renderer/deferred/GeometryPass.cpp
)
#include "renderer/deferred/GeometryPass.hpp"
#include "scene/ViewFrustumCulling.hpp"
#include "scene/atmospheric_effects/clouds/Clouds.hpp"
#include "scene/light/directional_light/DirectionalLight.hpp"
#include <sstream>
GeometryPass::GeometryPass() : skybox() { create_shader_program(); }
void GeometryPass::execute(glm::mat4 projection_matrix,
std::shared_ptr<Camera> main_camera,
GLuint window_width,
GLuint window_height,
GLuint gbuffer_id,
GLfloat delta_time,
std::shared_ptr<Scene> scene)
{
glBindFramebuffer(GL_FRAMEBUFFER, gbuffer_id);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, window_width, window_height);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
shader_program->use_shader_program();
glm::mat4 view_matrix = main_camera->get_viewmatrix();
std::vector<ObjMaterial> materials = scene->get_materials();
shader_program->setUniformMatrix4fv(projection_matrix, "projection");
shader_program->setUniformMatrix4fv(view_matrix, "view");
std::stringstream ss;
for (uint32_t i = 0; i < static_cast<uint32_t>(scene->get_texture_count(0)); i++) {
ss << "model_textures[" << i << "]";
shader_program->setUniformInt(MODEL_TEXTURES_SLOT + i, ss.str());
ss.clear();
ss.str(std::string());
}
for (uint32_t i = 0; i < static_cast<uint32_t>(materials.size()); i++) {
ss << "materials[" << i << "].ambient";
shader_program->setUniformVec3(materials[i].get_ambient(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].diffuse";
shader_program->setUniformVec3(materials[i].get_diffuse(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].specular";
shader_program->setUniformVec3(materials[i].get_specular(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].transmittance";
shader_program->setUniformVec3(materials[i].get_transmittance(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].emission";
shader_program->setUniformVec3(materials[i].get_emission(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].shininess";
shader_program->setUniformFloat(materials[i].get_shininess(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].ior";
shader_program->setUniformFloat(materials[i].get_ior(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].dissolve";
shader_program->setUniformFloat(materials[i].get_dissolve(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].illum";
shader_program->setUniformInt(materials[i].get_illum(), ss.str());
ss.clear();
ss.str(std::string());
ss << "materials[" << i << "].textureID";
shader_program->setUniformInt(materials[i].get_textureID(), ss.str());
ss.clear();
ss.str(std::string());
}
shader_program->validate_program();
scene->bind_textures_and_buffer();
// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
// aabb->render();
// glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
//
std::vector<std::shared_ptr<GameObject>> game_objects = scene->get_game_objects();
for (std::shared_ptr<GameObject> object : game_objects) {
/* if (object_is_visible(object)) {*/
set_game_object_uniforms(object->get_world_trafo(), object->get_normal_world_trafo());
object->render();
//}
}
skybox.draw_sky_box(projection_matrix, view_matrix, window_width, window_height, delta_time);
/*glCullFace(GL_FRONT);
glFrontFace(GL_CCW);*/
// render the AABB for the clouds
glDisable(GL_CULL_FACE);
std::shared_ptr<Clouds> clouds = scene->get_clouds();
clouds->render(projection_matrix, view_matrix, window_width, window_height);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void GeometryPass::create_shader_program()
{
this->shader_program = std::make_shared<GeometryPassShaderProgram>(GeometryPassShaderProgram{});
this->shader_program->create_from_files(
"rasterizer/g_buffer_geometry_pass.vert", "rasterizer/g_buffer_geometry_pass.frag");
}
void GeometryPass::set_game_object_uniforms(glm::mat4 model, glm::mat4 normal_model)
{
shader_program->setUniformMatrix4fv(model, "model");
shader_program->setUniformMatrix4fv(normal_model, "normal_model");
}
GeometryPass::~GeometryPass() {}