Point light working
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include "../ecs/systems/HydraRenderSystem.h"
|
||||
#include "../ecs/systems/HydraDirectionalShadowSourceSystem.h"
|
||||
#include "../ecs/systems/HydraSpotShadowSourceSystem.h"
|
||||
#include "../ecs/systems/HydraPointShadowSourceSystem.h"
|
||||
#include "../ecs/components/HydraLightComponent.h"
|
||||
#include "../mesh/StandardVertex.h"
|
||||
#include "../actor/HydraActorManager.h"
|
||||
@@ -20,10 +21,11 @@
|
||||
|
||||
void HydraShadowPipeline::Initialise()
|
||||
{
|
||||
m_render_stages.resize(2);
|
||||
m_render_stages.resize(3);
|
||||
_CreateUBOs();
|
||||
_CreateDirectionalRenderStage();
|
||||
_CreateSpotRenderStage();
|
||||
_CreatePointRenderStage();
|
||||
}
|
||||
|
||||
void HydraShadowPipeline::Shutdown()
|
||||
@@ -40,9 +42,33 @@ void HydraShadowPipeline::Render()
|
||||
|
||||
_RenderDirectionalShadowMaps();
|
||||
_RenderSpotShadowMaps();
|
||||
_RenderPointShadowMaps();
|
||||
|
||||
}
|
||||
|
||||
void HydraShadowPipeline::_RenderPointShadowMaps()
|
||||
{
|
||||
HydraECS *ecs = GetEngine()->ECS();
|
||||
std::shared_ptr<HydraRenderSystem> render_system = ecs->GetSystem<HydraRenderSystem>();
|
||||
std::shared_ptr<HydraPointShadowSourceSystem> shadow_system = ecs->GetSystem<HydraPointShadowSourceSystem>();
|
||||
|
||||
for (HydraID entity_id : shadow_system->Entities)
|
||||
{
|
||||
HydraPointShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent<HydraPointShadowSourceComponent>(entity_id);
|
||||
HydraLightComponent light_comp = GetEngine()->ECS()->GetComponent<HydraLightComponent>(entity_id);
|
||||
|
||||
_UpdateUBO(light_comp.shadow_map_id);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id);
|
||||
|
||||
float depth_value = 1.0f;
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
m_render_stages[POINT_RENDER_STAGE]->Render(render_system->Entities, INVALID_HYDRA_ID);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void HydraShadowPipeline::_RenderDirectionalShadowMaps()
|
||||
{
|
||||
HydraECS *ecs = GetEngine()->ECS();
|
||||
@@ -58,9 +84,7 @@ void HydraShadowPipeline::_RenderDirectionalShadowMaps()
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id);
|
||||
|
||||
float depth_value = 1.0f;
|
||||
float clear_colour[] = {0,0,0};
|
||||
glClearNamedFramebufferfv(shad_comp.frame_buffer_id, GL_DEPTH, 0, &depth_value);
|
||||
glClearNamedFramebufferfv(shad_comp.frame_buffer_id, GL_COLOR, 0, clear_colour);
|
||||
m_render_stages[DIRECTIONAL_RENDER_STAGE]->Render(render_system->Entities, INVALID_HYDRA_ID);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
@@ -81,14 +105,66 @@ void HydraShadowPipeline::_RenderSpotShadowMaps()
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id);
|
||||
|
||||
float depth_value = 1.0f;
|
||||
float clear_colour[] = {0,0,0};
|
||||
glClearNamedFramebufferfv(shad_comp.frame_buffer_id, GL_DEPTH, 0, &depth_value);
|
||||
glClearNamedFramebufferfv(shad_comp.frame_buffer_id, GL_COLOR, 0, clear_colour);
|
||||
m_render_stages[SPOT_RENDER_STAGE]->Render(render_system->Entities, INVALID_HYDRA_ID);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void HydraShadowPipeline::_CreatePointRenderStage()
|
||||
{
|
||||
HydraRenderStage *render_stage = new HydraRenderStage();
|
||||
std::string shader_path = std::string(shader_base);
|
||||
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
|
||||
|
||||
HydraID pos_buffer_id = buffer_manager->FindBuffer("PositionsBuffer");
|
||||
HydraID mat_buffer_id = buffer_manager->FindBuffer("MaterialBuffer");
|
||||
HydraID tex_buffer_id = buffer_manager->FindBuffer("TextureBuffer");
|
||||
HydraID shadow_buffer_id = buffer_manager->FindBuffer("PointShadowBuffer");
|
||||
HydraID per_frame_buffer_id = buffer_manager->FindBuffer("ShadowPerFrameUBO");
|
||||
|
||||
HydraShaderBinding shader_binding = {};
|
||||
|
||||
shader_binding.block_name.push_back("positions_buffer");
|
||||
shader_binding.binding_point.push_back(1);
|
||||
shader_binding.buffer_id.push_back(pos_buffer_id);
|
||||
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
|
||||
shader_binding.block_name.push_back("material_buffer");
|
||||
shader_binding.binding_point.push_back(2);
|
||||
shader_binding.buffer_id.push_back(mat_buffer_id);
|
||||
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
|
||||
shader_binding.block_name.push_back("texture_buffer");
|
||||
shader_binding.binding_point.push_back(3);
|
||||
shader_binding.buffer_id.push_back(tex_buffer_id);
|
||||
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
|
||||
shader_binding.block_name.push_back("point_shadow_map_sets");
|
||||
shader_binding.binding_point.push_back(7);
|
||||
shader_binding.buffer_id.push_back(shadow_buffer_id);
|
||||
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
|
||||
shader_binding.block_name.push_back("shadow_per_frame");
|
||||
shader_binding.binding_point.push_back(1);
|
||||
shader_binding.buffer_id.push_back(per_frame_buffer_id);
|
||||
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
|
||||
|
||||
std::vector<uint32_t> textures;
|
||||
|
||||
render_stage->Initialise(shader_path + "shadow_point_shader.vert",
|
||||
shader_path + "shadow_point_shader.frag",
|
||||
shader_path + "shadow_point_shader.geom",
|
||||
shader_binding,
|
||||
0,
|
||||
textures,
|
||||
true,
|
||||
GL_BACK,
|
||||
true,
|
||||
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
m_render_stages[POINT_RENDER_STAGE] = render_stage;
|
||||
}
|
||||
|
||||
void HydraShadowPipeline::_CreateDirectionalRenderStage()
|
||||
{
|
||||
HydraRenderStage *render_stage = new HydraRenderStage();
|
||||
@@ -137,7 +213,7 @@ void HydraShadowPipeline::_CreateDirectionalRenderStage()
|
||||
0,
|
||||
textures,
|
||||
true,
|
||||
GL_FRONT,
|
||||
GL_BACK,
|
||||
true,
|
||||
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
m_render_stages[DIRECTIONAL_RENDER_STAGE] = render_stage;
|
||||
@@ -191,7 +267,7 @@ void HydraShadowPipeline::_CreateSpotRenderStage()
|
||||
0,
|
||||
textures,
|
||||
true,
|
||||
GL_FRONT,
|
||||
GL_BACK,
|
||||
true,
|
||||
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
m_render_stages[SPOT_RENDER_STAGE] = render_stage;
|
||||
|
||||
Reference in New Issue
Block a user