Shadow buffer
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -31,111 +28,99 @@ void HydraShadowPipeline::Shutdown()
|
||||
|
||||
void HydraShadowPipeline::Render()
|
||||
{
|
||||
HydraECS* ecs = GetEngine()->ECS();
|
||||
HydraECS *ecs = GetEngine()->ECS();
|
||||
std::shared_ptr<HydraRenderSystem> render_system = ecs->GetSystem<HydraRenderSystem>();
|
||||
std::shared_ptr<HydraShadowSourceSystem> shadow_system = ecs->GetSystem<HydraShadowSourceSystem>();
|
||||
uint32_t shadow_idx =0;
|
||||
for(HydraID entity_id:shadow_system->Entities)
|
||||
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();
|
||||
for(uint32_t rs_idx = 0; rs_idx <m_render_stages.size(); rs_idx++)
|
||||
// _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);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
shadow_idx++;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void HydraShadowPipeline::_CreateRenderStage()
|
||||
{
|
||||
HydraRenderStage* render_stage = new HydraRenderStage();
|
||||
HydraRenderStage *render_stage = new HydraRenderStage();
|
||||
std::string shader_path = std::string(shader_base);
|
||||
HydraBufferManager* buffer_manager = GetEngine()->BufferManager();
|
||||
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
|
||||
|
||||
HydraID pos_buffer_id = buffer_manager->FindBuffer("PositionsBuffer");
|
||||
HydraID shadow_buffer_id = buffer_manager->FindBuffer("ShadowBuffer");
|
||||
HydraID pos_buffer_id = buffer_manager->FindBuffer("PositionsBuffer");
|
||||
HydraID shadow_buffer_id = buffer_manager->FindBuffer("ShadowBuffer");
|
||||
HydraID per_frame_buffer_id = buffer_manager->FindBuffer("ShadowPerFrameUBO");
|
||||
|
||||
HydraShaderBinding shader_binding = {};
|
||||
|
||||
|
||||
shader_binding.block_name.push_back("PositionsBuffer");
|
||||
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("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);
|
||||
|
||||
std::vector<uint32_t> textures;
|
||||
|
||||
render_stage->Initialise(shader_path + "shadow_shader.vert",
|
||||
shader_path + "shadow_shader.frag",
|
||||
shader_path + "shadow_shader.geom",
|
||||
shader_binding,
|
||||
m_frame_buffer_id,
|
||||
textures,
|
||||
true,
|
||||
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
render_stage->Initialise(shader_path + "shadow_shader.vert",
|
||||
shader_path + "shadow_shader.frag",
|
||||
shader_path + "shadow_shader.geom",
|
||||
shader_binding,
|
||||
0,
|
||||
textures,
|
||||
true,
|
||||
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
m_render_stages.push_back(render_stage);
|
||||
}
|
||||
|
||||
void HydraShadowPipeline::_UpdateUBO(uint32_t shadow_idx)
|
||||
{
|
||||
HydraBufferManager* buffer_manager = GetEngine()->BufferManager();
|
||||
buffer_manager->UpdatePartialBuffer(m_per_frame_ubo,3*sizeof(float), sizeof(uint32_t), &shadow_idx);
|
||||
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
|
||||
buffer_manager->UpdatePartialBuffer(m_per_frame_ubo, 3 * sizeof(float), sizeof(uint32_t), &shadow_idx);
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, m_per_frame_ubo);
|
||||
}
|
||||
|
||||
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();
|
||||
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
|
||||
|
||||
m_per_frame_ubo = buffer_manager->CreateGPUBuffer("ShadowPerFrameUBO",
|
||||
sizeof(float)*4, 0, HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
|
||||
m_per_frame_ubo = buffer_manager->CreateGPUBuffer("ShadowPerFrameUBO",
|
||||
sizeof(float) * 4, 0, HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user