Directional Shdaows, no alpha

This commit is contained in:
Confideo-IOM
2026-08-03 22:34:52 +01:00
parent 299ad1d9c7
commit d074dc71a5
69 changed files with 1353 additions and 406 deletions
@@ -5,14 +5,18 @@
#include "../buffer/HydraTextureBufferManager.h"
#include "../buffer/HydraLightBufferManager.h"
#include "PerFrameUBO.hpp"
#include "TextureDebugUBO.hpp"
#include "../camera/HydraCamera.h"
#include "../renderer/HydraRenderer.h"
#include "../ecs/HydraECS.h"
#include "../ecs/systems/HydraRenderSystem.h"
#include "../ecs/systems/HydraShadowSourceSystem.h"
#include "../ecs/components/HydraShadowSourceComponent.h"
#include "../mesh/StandardVertex.h"
#include "../actor/HydraActorManager.h"
#include "../actor/HydraOutputActor.h"
#include "../actor/HydraTextureDebugActor.h"
void HydraDeferredPipeline::Initialise()
{
@@ -22,7 +26,8 @@ void HydraDeferredPipeline::Initialise()
_CreateOutputActor();
_CreateFrameBuffer();
_CreateColourRenderStage();
_CreateOutputRenderStage();
_CreateOutputRenderStage();
_CreateTextureDebugOutputStage();
}
void HydraDeferredPipeline::Shutdown()
@@ -38,9 +43,6 @@ void HydraDeferredPipeline::Shutdown()
void HydraDeferredPipeline::Render()
{
_UpdateUBO();
HydraECS* ecs = GetEngine()->ECS();
std::shared_ptr<HydraRenderSystem> render_system = ecs->GetSystem<HydraRenderSystem>();
@@ -67,8 +69,7 @@ void HydraDeferredPipeline::Render()
for(uint32_t rs_idx = 0; rs_idx <m_render_stages.size(); rs_idx++)
{
m_render_stages[rs_idx]->Render(render_system->Entities);
}
}
}
void HydraDeferredPipeline::_UpdateUBO()
@@ -93,6 +94,21 @@ void HydraDeferredPipeline::_UpdateUBO()
output_ubo.light_count = light_count;
buffer_manager->UpdateWholeBuffer(m_per_frame_output_ubo, &output_ubo);
glBindBuffer(GL_UNIFORM_BUFFER, m_per_frame_output_ubo);
std::shared_ptr<HydraShadowSourceSystem> sys = GetEngine()->ECS()->GetSystem<HydraShadowSourceSystem>();
HydraID texture_id = 0;
if(sys->Entities.size() > 0)
{
auto it = sys->Entities.begin();
HydraShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent<HydraShadowSourceComponent>(*it);
texture_id = shad_comp.shadow_texture_id;
}
TextureDebugUBO texture_ubo = {};
texture_ubo.view = glm::translate(glm::vec3(1,1,0));
texture_ubo.proj = glm::ortho(-2.0f, 2.0f, -2.0f, 2.0f);
texture_ubo.shadow_idx = texture_id;
buffer_manager->UpdateWholeBuffer(m_texture_debug_ubo, &texture_ubo);
glBindBuffer(GL_UNIFORM_BUFFER, m_texture_debug_ubo);
}
void HydraDeferredPipeline::_CreateFrameBuffer()
@@ -166,17 +182,17 @@ void HydraDeferredPipeline::_CreateColourRenderStage()
HydraShaderBinding shader_binding = {};
shader_binding.block_name.push_back("PositionsBuffer");
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("MaterialBuffer");
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("TextureBuffer");
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);
@@ -187,14 +203,14 @@ void HydraDeferredPipeline::_CreateColourRenderStage()
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
std::vector<uint32_t> textures;
render_stage->Initialise(shader_path + "deferred_shader.vert",
shader_path + "deferred_shader.frag", "",
shader_binding,
m_frame_buffer_id,
textures,
true,
GL_BACK,
true,
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
m_render_stages.push_back(render_stage);
}
@@ -220,13 +236,13 @@ void HydraDeferredPipeline::_CreateOutputRenderStage()
HydraID light_buffer_id = buffer_manager->FindBuffer("LightBuffer");
HydraShaderBinding shader_binding = {};
shader_binding.block_name.push_back("PositionsBuffer");
shader_binding.block_name.push_back("position_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("TextureBuffer");
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);
@@ -241,11 +257,10 @@ void HydraDeferredPipeline::_CreateOutputRenderStage()
shader_binding.buffer_id.push_back(output_texture_buffer_id);
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
shader_binding.block_name.push_back("LightBuffer");
shader_binding.block_name.push_back("light_buffer");
shader_binding.binding_point.push_back(4);
shader_binding.buffer_id.push_back(light_buffer_id);
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
render_stage->Initialise(shader_path + "deferred_output_shader.vert",
shader_path + "deferred_output_shader.frag", "",
@@ -253,17 +268,66 @@ void HydraDeferredPipeline::_CreateOutputRenderStage()
0,
textures,
false,
GL_BACK,
true,
HYDRA_RENDERABLE_TYPE::HYDRA_OUTPUT);
m_render_stages.push_back(render_stage);
}
void HydraDeferredPipeline::_CreateTextureDebugOutputStage()
{
HydraRenderStage* render_stage = new HydraRenderStage();
std::string shader_path = std::string(shader_base);
HydraBufferManager* buffer_manager = GetEngine()->BufferManager();
std::vector<uint32_t> textures;
GetEngine()->ActorManager()->InitialiseActor(m_output_actor_id);
HydraOutputActor* actor = static_cast<HydraOutputActor*>(GetEngine()->ActorManager()->GetActor(m_output_actor_id));
HydraTextureBufferManager* tex_buf_manager = GetEngine()->TextureBufferManager();
HydraID pos_buffer_id = buffer_manager->FindBuffer("PositionsBuffer");
HydraID tex_buffer_id = buffer_manager->FindBuffer("TextureBuffer");
HydraID texture_debug_ubo = buffer_manager->FindBuffer("TextureDebugUBO");
HydraShaderBinding shader_binding = {};
shader_binding.block_name.push_back("position_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("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("uniform_per_frame");
shader_binding.binding_point.push_back(0);
shader_binding.buffer_id.push_back(texture_debug_ubo);
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
render_stage->Initialise(shader_path + "texture_debug_shader.vert",
shader_path + "texture_debug_shader.frag", "",
shader_binding,
0,
textures,
false,
GL_BACK,
false,
HYDRA_RENDERABLE_TYPE::HYDRA_TEXTURE_DEBUG);
m_render_stages.push_back(render_stage);
}
void HydraDeferredPipeline::_CreateOutputActor()
{
m_output_actor_id = GetEngine()->ActorManager()->CreateActor<HydraOutputActor>();
GetEngine()->ActorManager()->InitialiseActor(m_output_actor_id);
HydraOutputActor* actor = static_cast<HydraOutputActor*>(GetEngine()->ActorManager()->GetActor(m_output_actor_id));
m_texture_debug_actor_id = GetEngine()->ActorManager()->CreateActor<HydraTextureDebugActor>();
GetEngine()->ActorManager()->InitialiseActor(m_texture_debug_actor_id);
HydraTextureDebugActor* tex_actor = static_cast<HydraTextureDebugActor*>(GetEngine()->ActorManager()->GetActor(m_texture_debug_actor_id));
}
void HydraDeferredPipeline::_CreateUBOs()
@@ -279,6 +343,7 @@ void HydraDeferredPipeline::_CreateUBOs()
m_output_texture_ubo = buffer_manager->CreateGPUBuffer("DeferredOutputTextureUBO",
sizeof(uint32_t)*16, 0, HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
m_texture_debug_ubo = buffer_manager->CreateGPUBuffer("TextureDebugUBO",
sizeof(TextureDebugUBO), 0, HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
}