Shadow buffer

This commit is contained in:
Confideo-IOM
2026-07-28 19:02:45 +01:00
parent d48097c645
commit 299ad1d9c7
46 changed files with 693 additions and 603 deletions
@@ -8,8 +8,6 @@ const uint DIRECTIONAL_LIGHT = 1;
const uint POINT_LIGHT = 2;
const uint SPOT_LIGHT = 3;
void main()
{
@@ -8,15 +8,13 @@ struct ShadowMapSet
uint entity_id;
uint cascade_count;
uint shadow_texture_id;
uint padding0;
uint frame_buffer_id;
float near_plane[8];
float far_plane[8];
mat4 light_space_proj[6];
mat4 light_space_view[6];
};
//Push constants updated for each light
layout(binding = 0) uniform shadow_per_frame
{
@@ -24,8 +22,7 @@ layout(binding = 0) uniform shadow_per_frame
uint shadow_idxs;
};
layout(std430, binding = 0) readonly buffer ShadowMapSets
layout(std430, binding = 5) readonly buffer ShadowMapSets
{
ShadowMapSet shadows[10];
};
@@ -34,7 +31,6 @@ void main()
{
for (int i = 0; i < 3; ++i)
{
gl_Position = shadows[shadow_idxs].light_space_proj[gl_InvocationID] *
shadows[shadow_idxs].light_space_view[gl_InvocationID] *
gl_in[i].gl_Position;
@@ -22,30 +22,6 @@ void HydraBufferManager::Shutdown()
}
}
// HydraID HydraBufferManager::CreateGPUBuffer(std::string buffer_name,
// uint32_t buffer_size_bytes,
// uint32_t binding,
// HYDRA_BUFFER_TYPE buffer_type)
// {
// HydraID buffer_id = _GetBufferID();
// HydraBuffer buffer = {};
// buffer.buffer_id = buffer_id;
// buffer.size_bytes = buffer_size_bytes;
// buffer.buffer_name = buffer_name;
// buffer.buffer_type = buffer_type;
// uint32_t gl_buffer_type = _DecodeBufferType(buffer_type);
// //Create the buffer
// glGenBuffers(1, &buffer.gpu_buffer_id);
// glBindBuffer(gl_buffer_type, buffer.gpu_buffer_id);
// //Allocate storage
// glBufferData(gl_buffer_type, buffer.size_bytes, NULL, GL_DYNAMIC_DRAW);
// glBindBufferBase(gl_buffer_type, binding, buffer.gpu_buffer_id);
// glBindBuffer(gl_buffer_type, 0);
// m_buffers[buffer_id] = buffer;
// return buffer_id;
// }
HydraID HydraBufferManager::CreateGPUBuffer(std::string buffer_name,
uint32_t buffer_size_bytes,
uint32_t binding,
@@ -107,6 +107,44 @@ HydraID HydraTextureBufferManager::_GetTextureID()
return id;
}
HydraID HydraTextureBufferManager::CreateTextureArray(std::string texture_name,
uint32_t width,
uint32_t height,
uint32_t internal_format,
uint32_t min_filter,
uint32_t mag_filter,
uint32_t levels
)
{
uint32_t gl_tex_id = 0;
glCreateTextures(GL_TEXTURE_2D_ARRAY, 1, &gl_tex_id);
glBindTexture(GL_TEXTURE_2D_ARRAY, gl_tex_id);
glTextureStorage3D(gl_tex_id, 1, internal_format, width, height, levels);
glTextureParameteri(gl_tex_id, GL_TEXTURE_MIN_FILTER, min_filter);
glTextureParameteri(gl_tex_id, GL_TEXTURE_MAG_FILTER, mag_filter);
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
HydraTextureBuffer texture_buffer = {};
HydraID texture_id = _GetTextureID();
texture_buffer.texture_id = texture_id;
texture_buffer.format = 0;
texture_buffer.internal_format = internal_format;
texture_buffer.width = width;
texture_buffer.height = height;
texture_buffer.gl_tex_id = gl_tex_id;
texture_buffer.mag_filter = mag_filter;
texture_buffer.min_filter = min_filter;
m_textures[texture_id] = texture_buffer;
m_texture_lookup.insert(std::pair<std::string, HydraID>(texture_name, texture_id));
return texture_id;
}
HydraID HydraTextureBufferManager::CreateTexture(std::string texture_name,
uint32_t width,
uint32_t height,
@@ -162,7 +200,7 @@ HydraID HydraTextureBufferManager::CreateTexture(std::string texture_name,
return texture_id;
}
void HydraTextureBufferManager::BindTexture(HydraID texture_id)
void HydraTextureBufferManager::BindTexture(HydraID texture_id, uint32_t target)
{
if (texture_id >= MAX_TEXTURES)
@@ -170,7 +208,7 @@ void HydraTextureBufferManager::BindTexture(HydraID texture_id)
return;
}
HydraTextureBuffer texture = m_textures[texture_id];
glBindTexture(GL_TEXTURE_2D, texture.gl_tex_id);
glBindTexture(target, texture.gl_tex_id);
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MIN_FILTER, texture.min_filter);
@@ -18,10 +18,19 @@ class HydraTextureBufferManager : public HydraObject
public:
void Intialise();
void Shutdown();
HydraID CreateTexture(std::string texture_name, uint32_t width, uint32_t height, uint32_t internal_format,
HydraID CreateTexture(std::string texture_name,
uint32_t width, uint32_t height, uint32_t internal_format,
uint32_t min_filter, uint32_t mag_filter, uint32_t levels,
uint32_t format = GL_RGBA, uint32_t data_type = GL_UNSIGNED_BYTE, uint32_t mip_levels = 0, void* data = nullptr);
void BindTexture(HydraID texture_id);
HydraID CreateTextureArray(std::string texture_name,
uint32_t width,
uint32_t height,
uint32_t internal_format,
uint32_t min_filter,
uint32_t mag_filter,
uint32_t levels);
void BindTexture(HydraID texture_id, uint32_t target);
void UnbindTexture(HydraID texture_id);
void DeleteTexture(HydraID texture_id);
HydraID LoadTexture(std::string texture_filename);
@@ -8,7 +8,7 @@ struct HydraShadowSourceComponent
uint32_t entity_id;
uint32_t cascade_count;
uint32_t shadow_texture_id;
uint32_t padding0;
uint32_t frame_buffer_id;
float near_plane[8];
float far_plane[8];
glm::mat4 light_space_proj[6];
@@ -14,17 +14,16 @@
#include "../../task/buffer/HydraUpdateWholeGPUBufferTask.hpp"
#include "../../task/buffer/HydraUpdatePartialGPUBufferTask.hpp"
#include "../../task/buffer/HydraCreateUnBoundTextureTask.hpp"
#include "../../task/renderer/HydraCreateShadowFrameBuffer.hpp"
#include "../../actor/HydraActorManager.h"
void HydraShadowSourceSystem::Initialise()
{
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
HydraCreateGPUBufferTask *task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
task->Intialise("ShadowBuffer", 1, MAX_SHADOWS * sizeof(HydraShadowBuffer), &m_shadow_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
task->Intialise("ShadowBuffer", 1, MAX_SHADOWS * sizeof(HydraShadowSourceComponent), &m_shadow_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
}
@@ -39,7 +38,6 @@ void HydraShadowSourceSystem::InitialiseComponent(HydraID entity_id)
_InitialiseDirectionalLight(entity_id);
break;
}
}
void HydraShadowSourceSystem::UpdateSystem(float delta_t_seconds)
@@ -71,7 +69,6 @@ void HydraShadowSourceSystem::_UpdateDirectionalLight(HydraID entity_id)
HydraPositionComponent pos_comp = ecs->GetComponent<HydraPositionComponent>(entity_id);
HydraShadowSourceComponent &shad_comp = ecs->GetComponent<HydraShadowSourceComponent>(entity_id);
float view_size = 5.0f;
float view_near = -5.0f;
float view_far = 5.0f;
@@ -87,6 +84,7 @@ void HydraShadowSourceSystem::_UpdateDirectionalLight(HydraID entity_id)
light_dir = light_rot * light_dir;
light_dir = glm::normalize(light_dir);
glm::vec3 camera_pos = GetEngine()->Camera()->GetPosition();
for (uint32_t i = 0; i < 6; i++)
{
glm::vec3 light_pos = camera_pos; // - (light_dir * light_distance);
@@ -95,7 +93,6 @@ void HydraShadowSourceSystem::_UpdateDirectionalLight(HydraID entity_id)
glm::mat4 light_orient = glm::eulerAngleXYZ(light_euler.x, light_euler.y, light_euler.z);
glm::mat4 view = light_orient * light_trans;
glm::mat4 proj = glm::orthoRH<float>(view_size, -view_size, -view_size, view_size, -15000, 15000);
// glm::mat4 proj = glm::orthoRH<float>(view_size, -view_size, -view_size, view_size, view_near, view_far);
shad_comp.far_plane[i] = view_far;
shad_comp.near_plane[i] = view_near;
@@ -119,10 +116,10 @@ void HydraShadowSourceSystem::_InitialiseDirectionalLight(HydraID entity_id)
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
HydraID create_texture_task_id = task_scheduler->CreateTask<HydraCreateUnBoundTextureTask>(HydraThreadAffinity::Render);
HydraCreateUnBoundTextureTask *task = static_cast<HydraCreateUnBoundTextureTask *>(task_scheduler->GetTask(create_texture_task_id));
task->Initialise("shadow", SHADOW_MAP_SIZE, SHADOW_MAP_SIZE, GL_R32F, GL_R32F, GL_LINEAR, GL_LINEAR, 6, GL_BYTE, 0, nullptr, &shad_comp.shadow_texture_id);
task_scheduler->WaitForTask(create_texture_task_id);
HydraID create_framebuffer_task_id = task_scheduler->CreateTask<HydraCreateShadowFrameBuffer>(HydraThreadAffinity::Render);
HydraCreateShadowFrameBuffer *fb_task = static_cast<HydraCreateShadowFrameBuffer *>(task_scheduler->GetTask(create_framebuffer_task_id));
fb_task->Initialise(&shad_comp.shadow_texture_id, &shad_comp.frame_buffer_id);
task_scheduler->WaitForTask(create_framebuffer_task_id);
}
void HydraShadowSourceSystem::_WriteToGPU(std::vector<HydraShadowSourceComponent> shadows)
@@ -135,6 +132,6 @@ void HydraShadowSourceSystem::_WriteToGPU(std::vector<HydraShadowSourceComponent
HydraID update_buffer_task_id = task_scheduler->CreateTask<HydraUpdatePartialGPUBufferTask>(HydraThreadAffinity::Render);
HydraUpdatePartialGPUBufferTask *task = static_cast<HydraUpdatePartialGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
task->Intialise(m_shadow_buffer_id, 0, sizeof(HydraLightComponent) * shadows.size(), buffer);
task->Intialise(m_shadow_buffer_id, 0, sizeof(HydraShadowSourceComponent) * shadows.size(), buffer);
task_scheduler->WaitForTask(update_buffer_task_id);
}
+1 -7
View File
@@ -52,7 +52,7 @@
#include "../task/buffer/HydraShutdownBufferManagerTask.hpp"
#include "../task/buffer/HydraInitialiseTextureManagerTask.hpp"
#include "../task/actor/HydraUpdatePlayerTask.h"
#include "../task/renderer/HydraBeginRenderTask.hpp"
#include "../task/renderer/HydraEndRenderTask.hpp"
#include "../mesh/HydraMeshManager.h"
@@ -360,13 +360,7 @@ void HydraEngine::_GameLoop()
_UpdateSystems();
// HydraID render_task_id = m_task_scheduler->CreateTask<HydraRenderPipelineTask>(HydraThreadAffinity::Render);
// HydraRenderPipelineTask* render_task = static_cast<HydraRenderPipelineTask*>(m_task_scheduler->GetTask(render_task_id));
// render_task->Initialise(m_pipeline);
// m_task_scheduler->WaitForTask(render_task_id);
HydraID begin_task_id = m_task_scheduler->CreateTask<HydraBeginRenderTask>(HydraThreadAffinity::Render);
m_task_scheduler->WaitForTask(begin_task_id);
HydraID render_shadow_task_id = m_task_scheduler->CreateTask<HydraRenderPipelineTask>(HydraThreadAffinity::Render);
HydraRenderPipelineTask* render_shadow_task = static_cast<HydraRenderPipelineTask*>(m_task_scheduler->GetTask(render_shadow_task_id));
@@ -291,7 +291,7 @@ void HydraGLTFLoader::_ProcessGLTFTextures(aiScene const *scene, std::vector<uin
GL_UNSIGNED_BYTE,
5,
data);
texture_manager->BindTexture(texture_id);
texture_manager->BindTexture(texture_id, GL_TEXTURE_2D);
// store the texture id against the scene index for the texture. Materials will have *n where n is the index
texture_lookup[i_tex] = texture_id;
}
@@ -39,21 +39,36 @@ void HydraDeferredPipeline::Render()
{
_UpdateUBO();
glBindFramebuffer(GL_FRAMEBUFFER, m_frame_buffer_id);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // we're not using the stencil buffer now
glEnable(GL_DEPTH_TEST);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
HydraECS* ecs = GetEngine()->ECS();
std::shared_ptr<HydraRenderSystem> render_system = ecs->GetSystem<HydraRenderSystem>();
GetEngine()->Renderer()->BeginFrame();
HydraRenderSettings render_settings = GetEngine()->RenderSettings();
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glViewport(0, 0, render_settings.ViewportWidth, render_settings.ViewportHeight);
float clear_colour[4] = {0, 0, 0, 0};
float depth_value = 1;
glClearNamedFramebufferfv(m_frame_buffer_id, GL_COLOR, 0, clear_colour);
glClearNamedFramebufferfv(m_frame_buffer_id, GL_COLOR, 1, clear_colour);
glClearNamedFramebufferfv(m_frame_buffer_id, GL_COLOR, 2, clear_colour);
glClearNamedFramebufferfv(m_frame_buffer_id, GL_COLOR, 3, clear_colour);
glClearNamedFramebufferfv(m_frame_buffer_id, GL_DEPTH, 0, &depth_value);
float screen_colour[4] = {0.0f, 0.5f, 0.7f, 1.0f};
glClearNamedFramebufferfv(0, GL_COLOR, 0, screen_colour);
glClearNamedFramebufferfv(0, GL_DEPTH, 0, &depth_value);
for(uint32_t rs_idx = 0; rs_idx <m_render_stages.size(); rs_idx++)
{
m_render_stages[rs_idx]->Render(render_system->Entities);
}
GetEngine()->Renderer()->EndFrame();
}
void HydraDeferredPipeline::_UpdateUBO()
@@ -126,11 +141,11 @@ void HydraDeferredPipeline::_CreateFrameBuffer()
glDrawBuffers(4, draw_buffers);
glBindTexture(GL_TEXTURE_2D, 0);
tex_buffer_manager->BindTexture(depth_texture.texture_id);
tex_buffer_manager->BindTexture(buffer_0_texture.texture_id);
tex_buffer_manager->BindTexture(metal_rough_texture.texture_id);
tex_buffer_manager->BindTexture(normal_texture.texture_id);
tex_buffer_manager->BindTexture(position_texture.texture_id);
tex_buffer_manager->BindTexture(depth_texture.texture_id, GL_TEXTURE_2D);
tex_buffer_manager->BindTexture(buffer_0_texture.texture_id, GL_TEXTURE_2D);
tex_buffer_manager->BindTexture(metal_rough_texture.texture_id, GL_TEXTURE_2D);
tex_buffer_manager->BindTexture(normal_texture.texture_id, GL_TEXTURE_2D);
tex_buffer_manager->BindTexture(position_texture.texture_id, GL_TEXTURE_2D);
HydraBufferManager* buffer_manager = GetEngine()->BufferManager();
@@ -60,13 +60,16 @@ void HydraForwardPipeline::Render()
HydraECS* ecs = GetEngine()->ECS();
std::shared_ptr<HydraRenderSystem> render_system = ecs->GetSystem<HydraRenderSystem>();
GetEngine()->Renderer()->BeginFrame();
float depth_value = 1;
float screen_colour[4] = {0, 0.2, 0.7, 1};
glClearNamedFramebufferfv(0, GL_COLOR, 0, screen_colour);
glClearNamedFramebufferfv(0, GL_DEPTH, 0, &depth_value);
for(uint32_t rs_idx = 0; rs_idx <m_render_stages.size(); rs_idx++)
{
m_render_stages[rs_idx]->Render(render_system->Entities);
}
GetEngine()->Renderer()->EndFrame();
}
void HydraForwardPipeline::_UpdateUBO()
@@ -52,11 +52,13 @@ void HydraRenderStage::ShutDown()
glDeleteProgram(m_program);
}
void HydraRenderStage::Render(std::set<HydraID>& entities)
void HydraRenderStage::Render(std::set<HydraID>& entities, uint32_t framebuffer_id)
{
HydraECS* ecs = GetEngine()->ECS();
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer_id);
if(framebuffer_id != INVALID_HYDRA_ID)
{
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
}
//glDrawBuffers(m_rb_attachments.size(), &m_rb_attachments[0]);
HydraVertexBufferManager* vert_buffer_mananger = GetEngine()->VertexBufferManager();
glUseProgram(m_program);
@@ -91,6 +93,11 @@ void HydraRenderStage::Render(std::set<HydraID>& entities)
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void HydraRenderStage::Render(std::set<HydraID> &entities)
{
Render(entities, m_framebuffer_id);
}
uint32_t HydraRenderStage::_LoadShader(std::string filename, uint32_t shader_type)
{
@@ -19,6 +19,7 @@ class HydraRenderStage : public HydraObject
bool enable_culling,
HYDRA_RENDERABLE_TYPE renderable_type);
void ShutDown();
void Render(std::set<HydraID>& entities, uint32_t framebuffer_id);
void Render(std::set<HydraID>& entities);
private:
uint32_t _LoadShader(std::string filename, uint32_t shader_type);
@@ -16,12 +16,9 @@
#include "../actor/HydraActorManager.h"
#include "../actor/HydraOutputActor.h"
void HydraShadowPipeline::Initialise()
{
_CreateUBOs();
_CreateFrameBuffer();
_CreateRenderStage();
}
@@ -35,16 +32,30 @@ void HydraShadowPipeline::Render()
std::shared_ptr<HydraRenderSystem> render_system = ecs->GetSystem<HydraRenderSystem>();
std::shared_ptr<HydraShadowSourceSystem> shadow_system = ecs->GetSystem<HydraShadowSourceSystem>();
uint32_t shadow_idx = 0;
glViewport(0, 0, SHADOW_MAP_SIZE, SHADOW_MAP_SIZE);
glEnable(GL_DEPTH_TEST); // Depth testing must be active
glDepthMask(GL_TRUE); // Depth buffer must be writable
glDepthFunc(GL_LESS);
for (HydraID entity_id : shadow_system->Entities)
{
_UpdateUBO(shadow_idx);
_BindFrameBufferAttachments(entity_id);
GetEngine()->Renderer()->BeginFrame();
// _BindFrameBufferAttachments(entity_id);
HydraShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent<HydraShadowSourceComponent>(entity_id);
glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id);
glBindTextureUnit(0, 0);
float depth_value = 1.0f;
glClearNamedFramebufferfv(shad_comp.frame_buffer_id, GL_DEPTH, 0, &depth_value);
for (uint32_t rs_idx = 0; rs_idx < m_render_stages.size(); rs_idx++)
{
m_render_stages[rs_idx]->Render(render_system->Entities);
m_render_stages[rs_idx]->Render(render_system->Entities, INVALID_HYDRA_ID);
}
GetEngine()->Renderer()->EndFrame();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
shadow_idx++;
}
@@ -69,12 +80,12 @@ void HydraShadowPipeline::_CreateRenderStage()
shader_binding.buffer_type.push_back(HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
shader_binding.block_name.push_back("ShadowMapSets");
shader_binding.binding_point.push_back(0);
shader_binding.binding_point.push_back(5);
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(0);
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);
@@ -84,7 +95,7 @@ void HydraShadowPipeline::_CreateRenderStage()
shader_path + "shadow_shader.frag",
shader_path + "shadow_shader.geom",
shader_binding,
m_frame_buffer_id,
0,
textures,
true,
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
@@ -101,37 +112,11 @@ void HydraShadowPipeline::_UpdateUBO(uint32_t shadow_idx)
void HydraShadowPipeline::_BindFrameBufferAttachments(HydraID entity_id)
{
HydraShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent<HydraShadowSourceComponent>(entity_id);
HydraTextureBuffer texture = GetEngine()->TextureBufferManager()->GetTexture(shad_comp.shadow_texture_id);
glBindFramebuffer(GL_FRAMEBUFFER, m_frame_buffer_id);
glBindTexture(GL_TEXTURE_2D, texture.gl_tex_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture.gl_tex_id, 0);
GLenum draw_buffers[4] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindTexture(GL_TEXTURE_2D, 0);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // we're not using the stencil buffer now
glEnable(GL_DEPTH_TEST);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id);
glBindTextureUnit(0, 0);
}
void HydraShadowPipeline::_CreateFrameBuffer()
{
HydraEngine* engine = GetEngine();
HydraTextureBufferManager* tex_buffer_manager = engine->TextureBufferManager();
HydraRenderSettings render_settings = engine->RenderSettings();
glGenFramebuffers(1, &m_frame_buffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, m_frame_buffer_id);
}
void HydraShadowPipeline::_CreateUBOs()
{
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
@@ -18,12 +18,12 @@ class HydraShadowPipeline : public HydraPipeline
void Render() override;
private:
void _CreateUBOs();
void _CreateFrameBuffer();
void _CreateRenderStage();
void _UpdateUBO(uint32_t shadow_idx);
void _BindFrameBufferAttachments(HydraID entity_id);
HydraID m_per_frame_ubo = INVALID_HYDRA_ID;
uint32_t m_frame_buffer_id;
};
@@ -31,18 +31,18 @@ void HydraRenderer::Initialise(HydraRenderSettings render_settings)
}
}
void HydraRenderer::BeginFrame()
{
// void HydraRenderer::BeginFrame()
// {
glViewport(0, 0, m_render_settings.ViewportWidth, m_render_settings.ViewportHeight);
// glViewport(0, 0, m_render_settings.ViewportWidth, m_render_settings.ViewportHeight);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0.0f, 0.5f, 0.7f, 1.0f);
// glEnable(GL_BLEND);
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// glClearColor(0.0f, 0.5f, 0.7f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
// }
void HydraRenderer::EndFrame()
{
+1 -1
View File
@@ -7,7 +7,7 @@ class HydraRenderer : public HydraObject
{
public:
void Initialise(HydraRenderSettings render_settings);
void BeginFrame();
//void BeginFrame();
void EndFrame();
@@ -18,6 +18,7 @@ private:
uint32_t m_min_filter;
uint32_t m_mag_filter;
uint32_t m_levels;
uint32_t m_target;
void *m_data;
HydraID *m_texture_id;
@@ -35,7 +36,7 @@ public:
m_data_type,
m_mip_levels,
m_data);
GetEngine()->TextureBufferManager()->BindTexture(*m_texture_id);
GetEngine()->TextureBufferManager()->BindTexture(*m_texture_id, GL_TEXTURE_2D);
}
void Initialise(std::string texture_name,
@@ -51,6 +51,7 @@ public:
HydraID *texture_id)
{
m_texture_name = texture_name;
m_width = width;
m_height = height;
m_internal_format = internal_format;
@@ -1,19 +0,0 @@
#ifndef HYDRABEGINRENDERTASK
#define HYDRABEGINRENDERTASK
#include "../HydraTask.h"
#include "../../engine/HydraEngine.h"
#include "../../renderer/HydraRenderer.h"
class HydraBeginRenderTask : public HydraTask
{
private:
protected:
public:
virtual void Process() override
{
GetEngine()->Renderer()->BeginFrame();
}
};
#endif /* HYDRABEGINRENDERTASK */
@@ -0,0 +1,61 @@
#ifndef HYDRACREATESHADOWFRAMEBUFFER
#define HYDRACREATESHADOWFRAMEBUFFER
#include "../HydraTask.h"
#include "../../engine/HydraEngine.h"
#include "../../renderer/HydraRenderer.h"
#include <GLMIncludes.h>
#include "../../GlewIncludes.h"
class HydraCreateShadowFrameBuffer : public HydraTask
{
private:
uint32_t *m_texture_id = 0;
uint32_t *m_frame_buffer_id = nullptr;
protected:
public:
void Process() override
{
HydraEngine *engine = GetEngine();
HydraTextureBufferManager *tex_buffer_manager = engine->TextureBufferManager();
HydraRenderSettings render_settings = engine->RenderSettings();
*m_texture_id = tex_buffer_manager->CreateTextureArray("shadow_FB",
SHADOW_MAP_SIZE, SHADOW_MAP_SIZE,
GL_DEPTH_COMPONENT24,
GL_NEAREST,
GL_NEAREST,
6);
HydraTextureBuffer texture = tex_buffer_manager->GetTexture(*m_texture_id);
glGenFramebuffers(1, m_frame_buffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, *m_frame_buffer_id);
glNamedFramebufferDrawBuffer(*m_frame_buffer_id, GL_NONE);
glNamedFramebufferReadBuffer(*m_frame_buffer_id, GL_NONE);
glBindTexture(GL_TEXTURE_2D_ARRAY, texture.gl_tex_id);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texture.gl_tex_id, 0);
GLenum status = glCheckNamedFramebufferStatus(*m_frame_buffer_id, GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
std::cout << "Framebuffer error: " << status << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
tex_buffer_manager->BindTexture(*m_texture_id, GL_TEXTURE_2D_ARRAY);
}
void Initialise(uint32_t *texture_id, uint32_t *frame_buffer_id)
{
m_texture_id = texture_id;
m_frame_buffer_id = frame_buffer_id;
}
};
#endif /* HYDRACREATESHADOWFRAMEBUFFER */
@@ -11,7 +11,6 @@ class HydraRenderTask : public HydraTask
public:
virtual void Process() override
{
GetEngine()->Renderer()->BeginFrame();
GetEngine()->Renderer()->EndFrame();
}
};
@@ -161,7 +161,7 @@
{
"directoryIndex" : 0,
"id" : "ALL_BUILD::@6890427a1f51a3e7e1df",
"jsonFile" : "target-ALL_BUILD-Debug-cadb66c5dccd0bd206e6.json",
"jsonFile" : "target-ALL_BUILD-Debug-9ddbbbeb4caedf0a48f0.json",
"name" : "ALL_BUILD",
"projectIndex" : 0
},
@@ -182,7 +182,7 @@
{
"directoryIndex" : 1,
"id" : "HydraEngine::@fafd37b19aacd4c483ed",
"jsonFile" : "target-HydraEngine-Debug-a388455bc5d4b1d63093.json",
"jsonFile" : "target-HydraEngine-Debug-2faea7c156292a0c0ce8.json",
"name" : "HydraEngine",
"projectIndex" : 1
},
@@ -355,7 +355,7 @@
{
"directoryIndex" : 0,
"id" : "ALL_BUILD::@6890427a1f51a3e7e1df",
"jsonFile" : "target-ALL_BUILD-Release-cadb66c5dccd0bd206e6.json",
"jsonFile" : "target-ALL_BUILD-Release-9ddbbbeb4caedf0a48f0.json",
"name" : "ALL_BUILD",
"projectIndex" : 0
},
@@ -376,7 +376,7 @@
{
"directoryIndex" : 1,
"id" : "HydraEngine::@fafd37b19aacd4c483ed",
"jsonFile" : "target-HydraEngine-Release-4d51ecf0ab4ffdcb7da6.json",
"jsonFile" : "target-HydraEngine-Release-b1d450122d30c349552d.json",
"name" : "HydraEngine",
"projectIndex" : 1
},
@@ -549,7 +549,7 @@
{
"directoryIndex" : 0,
"id" : "ALL_BUILD::@6890427a1f51a3e7e1df",
"jsonFile" : "target-ALL_BUILD-MinSizeRel-cadb66c5dccd0bd206e6.json",
"jsonFile" : "target-ALL_BUILD-MinSizeRel-9ddbbbeb4caedf0a48f0.json",
"name" : "ALL_BUILD",
"projectIndex" : 0
},
@@ -570,7 +570,7 @@
{
"directoryIndex" : 1,
"id" : "HydraEngine::@fafd37b19aacd4c483ed",
"jsonFile" : "target-HydraEngine-MinSizeRel-8280923c3e8a8a1bd015.json",
"jsonFile" : "target-HydraEngine-MinSizeRel-8b4acdd146655dce4c11.json",
"name" : "HydraEngine",
"projectIndex" : 1
},
@@ -743,7 +743,7 @@
{
"directoryIndex" : 0,
"id" : "ALL_BUILD::@6890427a1f51a3e7e1df",
"jsonFile" : "target-ALL_BUILD-RelWithDebInfo-cadb66c5dccd0bd206e6.json",
"jsonFile" : "target-ALL_BUILD-RelWithDebInfo-9ddbbbeb4caedf0a48f0.json",
"name" : "ALL_BUILD",
"projectIndex" : 0
},
@@ -764,7 +764,7 @@
{
"directoryIndex" : 1,
"id" : "HydraEngine::@fafd37b19aacd4c483ed",
"jsonFile" : "target-HydraEngine-RelWithDebInfo-1179a3c8def17db9efd4.json",
"jsonFile" : "target-HydraEngine-RelWithDebInfo-800c6fa211e5ae182b46.json",
"name" : "HydraEngine",
"projectIndex" : 1
},
@@ -27,7 +27,7 @@
"objects" :
[
{
"jsonFile" : "codemodel-v2-2319b378636e3c742c14.json",
"jsonFile" : "codemodel-v2-ccd34cf25146cac2c39e.json",
"kind" : "codemodel",
"version" :
{
@@ -100,7 +100,7 @@
}
},
{
"jsonFile" : "codemodel-v2-2319b378636e3c742c14.json",
"jsonFile" : "codemodel-v2-ccd34cf25146cac2c39e.json",
"kind" : "codemodel",
"version" :
{
@@ -22,10 +22,10 @@
"dependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
},
{
"id" : "ZERO_CHECK::@6890427a1f51a3e7e1df"
@@ -41,10 +41,10 @@
"orderDependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
}
],
"paths" :
@@ -22,10 +22,10 @@
"dependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
},
{
"id" : "ZERO_CHECK::@6890427a1f51a3e7e1df"
@@ -41,10 +41,10 @@
"orderDependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
}
],
"paths" :
@@ -22,10 +22,10 @@
"dependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
},
{
"id" : "ZERO_CHECK::@6890427a1f51a3e7e1df"
@@ -41,10 +41,10 @@
"orderDependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
}
],
"paths" :
@@ -22,10 +22,10 @@
"dependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
},
{
"id" : "ZERO_CHECK::@6890427a1f51a3e7e1df"
@@ -41,10 +41,10 @@
"orderDependencies" :
[
{
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
"id" : "HydraClient::@6890427a1f51a3e7e1df"
},
{
"id" : "HydraClient::@6890427a1f51a3e7e1df"
"id" : "HydraEngine::@fafd37b19aacd4c483ed"
}
],
"paths" :
@@ -203,35 +203,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
}
],
@@ -322,35 +322,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
},
{
@@ -376,18 +376,18 @@
28,
29,
31,
33,
32,
34,
35,
37,
39,
36,
38,
40,
41,
43,
42,
44,
45,
47,
49,
46,
48,
50,
51,
52,
@@ -396,33 +396,34 @@
55,
56,
57,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
80,
82,
81,
83,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
104,
105,
107
106,
108
]
}
],
@@ -601,6 +602,11 @@
"path" : "HydraEngine/source/buffer/HydraMaterialBufferManager.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"path" : "HydraEngine/source/buffer/HydraShadowBuffer.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"compileGroupIndex" : 0,
@@ -203,35 +203,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
}
],
@@ -322,35 +322,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
},
{
@@ -376,18 +376,18 @@
28,
29,
31,
33,
32,
34,
35,
37,
39,
36,
38,
40,
41,
43,
42,
44,
45,
47,
49,
46,
48,
50,
51,
52,
@@ -396,33 +396,34 @@
55,
56,
57,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
80,
82,
81,
83,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
104,
105,
107
106,
108
]
}
],
@@ -601,6 +602,11 @@
"path" : "HydraEngine/source/buffer/HydraMaterialBufferManager.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"path" : "HydraEngine/source/buffer/HydraShadowBuffer.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"compileGroupIndex" : 0,
@@ -203,35 +203,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
}
],
@@ -322,35 +322,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
},
{
@@ -376,18 +376,18 @@
28,
29,
31,
33,
32,
34,
35,
37,
39,
36,
38,
40,
41,
43,
42,
44,
45,
47,
49,
46,
48,
50,
51,
52,
@@ -396,33 +396,34 @@
55,
56,
57,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
80,
82,
81,
83,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
104,
105,
107
106,
108
]
}
],
@@ -601,6 +602,11 @@
"path" : "HydraEngine/source/buffer/HydraMaterialBufferManager.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"path" : "HydraEngine/source/buffer/HydraShadowBuffer.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"compileGroupIndex" : 0,
@@ -203,35 +203,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
}
],
@@ -322,35 +322,35 @@
24,
27,
30,
32,
36,
38,
42,
46,
48,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
81,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
106
33,
37,
39,
43,
47,
49,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
82,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
107
]
},
{
@@ -376,18 +376,18 @@
28,
29,
31,
33,
32,
34,
35,
37,
39,
36,
38,
40,
41,
43,
42,
44,
45,
47,
49,
46,
48,
50,
51,
52,
@@ -396,33 +396,34 @@
55,
56,
57,
59,
61,
63,
65,
67,
69,
71,
73,
75,
77,
79,
58,
60,
62,
64,
66,
68,
70,
72,
74,
76,
78,
80,
82,
81,
83,
85,
87,
89,
91,
93,
95,
97,
99,
101,
103,
84,
86,
88,
90,
92,
94,
96,
98,
100,
102,
104,
105,
107
106,
108
]
}
],
@@ -601,6 +602,11 @@
"path" : "HydraEngine/source/buffer/HydraMaterialBufferManager.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"path" : "HydraEngine/source/buffer/HydraShadowBuffer.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"compileGroupIndex" : 0,
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -457,6 +457,7 @@ if %errorlevel% neq 0 goto :VCEnd</Command>
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraMaterialBuffer.h" />
<ClCompile Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraMaterialBufferManager.cpp" />
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraMaterialBufferManager.h" />
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraShadowBuffer.h" />
<ClCompile Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraTextureBufferManager.cpp" />
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraTextureBufferManager.h" />
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraTexureBuffer.h" />
@@ -186,6 +186,9 @@
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraMaterialBufferManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraShadowBuffer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="C:\Code\HydraV3\HydraEngine\source\buffer\HydraTextureBufferManager.h">
<Filter>Header Files</Filter>
</ClInclude>
+1 -1
View File
@@ -1,6 +1,6 @@
================================================================================
Linker Errors
Generated: 2026-07-27T23:22:14.073Z
Generated: 2026-07-28T12:58:05.588Z
Total Errors: 1
================================================================================