Directional Shdaows, no alpha
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,9 +24,10 @@ class HydraDeferredPipeline : public HydraPipeline
|
||||
HydraID m_buffer_0 = INVALID_HYDRA_ID; //Frame buffer 0;
|
||||
HydraID m_depth = INVALID_HYDRA_ID;
|
||||
HydraID m_output_actor_id = INVALID_HYDRA_ID;
|
||||
HydraID m_texture_debug_actor_id = INVALID_HYDRA_ID;
|
||||
HydraID m_output_texture_ubo = INVALID_HYDRA_ID;
|
||||
HydraID m_output_light_ubo = INVALID_HYDRA_ID;
|
||||
|
||||
HydraID m_texture_debug_ubo = INVALID_HYDRA_ID;
|
||||
uint32_t m_frame_buffer_id;
|
||||
|
||||
void _UpdateUBO();
|
||||
@@ -35,6 +36,7 @@ class HydraDeferredPipeline : public HydraPipeline
|
||||
void _CreateColourRenderStage();
|
||||
void _CreateOutputRenderStage();
|
||||
void _CreateOutputActor();
|
||||
void _CreateTextureDebugOutputStage();
|
||||
void _CreateUBOs();
|
||||
};
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ void HydraForwardPipeline::Initialise()
|
||||
std::vector<uint32_t> textures;
|
||||
std::vector<uint32_t> rb_attachments;
|
||||
|
||||
render_stage->Initialise(shader_path + "forward_shader.vert", shader_path + "forward_shader.frag", "", shader_binding, 0, textures, true, HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
render_stage->Initialise(shader_path + "forward_shader.vert", shader_path + "forward_shader.frag", "", shader_binding, 0, textures, true, GL_BACK, true, HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
m_render_stages.push_back(render_stage);
|
||||
|
||||
m_per_frame_ubo = buffer_manager->CreateGPUBuffer("PerFrameUBO",
|
||||
|
||||
@@ -18,15 +18,19 @@ void HydraRenderStage::Initialise(std::string vertex_shader_file,
|
||||
HydraShaderBinding shader_binding,
|
||||
uint32_t framebuffer_id,
|
||||
std::vector<uint32_t> textures,
|
||||
bool enable_culling,
|
||||
bool enable_culling,
|
||||
uint32_t cull_face,
|
||||
bool depth_enable,
|
||||
HYDRA_RENDERABLE_TYPE renderable_type)
|
||||
{
|
||||
m_framebuffer_id = framebuffer_id;
|
||||
m_renderable_type = static_cast<uint32_t>(renderable_type);
|
||||
m_shader_binding = shader_binding;
|
||||
m_textures = textures;
|
||||
m_depth_enable = depth_enable;
|
||||
m_cull = enable_culling;
|
||||
m_program = glCreateProgram();
|
||||
m_cull_face = cull_face;
|
||||
if(vertex_shader_file.length() > 0)
|
||||
{
|
||||
m_vertex_shader = _LoadShader(vertex_shader_file, GL_VERTEX_SHADER);
|
||||
@@ -43,6 +47,25 @@ void HydraRenderStage::Initialise(std::string vertex_shader_file,
|
||||
glAttachShader(m_program, m_geometry_shader);
|
||||
}
|
||||
glLinkProgram(m_program);
|
||||
|
||||
int success;
|
||||
glGetProgramiv(m_program, GL_LINK_STATUS, &success);
|
||||
|
||||
if (!success) {
|
||||
// 2. Get the log length (optional but recommended)
|
||||
int logLength;
|
||||
glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &logLength);
|
||||
|
||||
// 3. Retrieve and print the error log
|
||||
char* infoLog = new char[logLength];
|
||||
glGetProgramInfoLog(m_program, logLength, NULL, infoLog);
|
||||
|
||||
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
|
||||
|
||||
// 4. Clean up allocated memory
|
||||
delete[] infoLog;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void HydraRenderStage::ShutDown()
|
||||
@@ -70,12 +93,22 @@ void HydraRenderStage::Render(std::set<HydraID>& entities, uint32_t framebuffer_
|
||||
if(m_cull)
|
||||
{
|
||||
glEnable(GL_CULL_FACE);
|
||||
glCullFace(m_cull_face);
|
||||
}
|
||||
else
|
||||
{
|
||||
glDisable(GL_CULL_FACE);
|
||||
}
|
||||
|
||||
if(m_depth_enable)
|
||||
{
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
else
|
||||
{
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
for(const auto& entity_id : entities )
|
||||
{
|
||||
HydraRenderableComponent render_comp = ecs->GetComponent<HydraRenderableComponent>(entity_id);
|
||||
|
||||
@@ -17,6 +17,8 @@ class HydraRenderStage : public HydraObject
|
||||
uint32_t framebuffer_id,
|
||||
std::vector<uint32_t> textures,
|
||||
bool enable_culling,
|
||||
uint32_t cull_face,
|
||||
bool depth_enable,
|
||||
HYDRA_RENDERABLE_TYPE renderable_type);
|
||||
void ShutDown();
|
||||
void Render(std::set<HydraID>& entities, uint32_t framebuffer_id);
|
||||
@@ -33,7 +35,9 @@ class HydraRenderStage : public HydraObject
|
||||
uint32_t m_program = GL_INVALID_VALUE;
|
||||
uint32_t m_renderable_type;
|
||||
uint32_t m_framebuffer_id = 0;
|
||||
uint32_t m_cull_face = GL_NONE;
|
||||
bool m_cull = false;
|
||||
bool m_depth_enable = true;
|
||||
std::vector<uint32_t> m_textures;
|
||||
|
||||
};
|
||||
|
||||
@@ -39,27 +39,35 @@ void HydraShadowPipeline::Render()
|
||||
glEnable(GL_DEPTH_TEST); // Depth testing must be active
|
||||
glDepthMask(GL_TRUE); // Depth buffer must be writable
|
||||
glDepthFunc(GL_LESS);
|
||||
|
||||
|
||||
//glEnable(GL_POLYGON_OFFSET_FILL);
|
||||
//glPolygonOffset(2.5f, 1.0f);
|
||||
|
||||
for (HydraID entity_id : shadow_system->Entities)
|
||||
{
|
||||
_UpdateUBO(shadow_idx);
|
||||
// _BindFrameBufferAttachments(entity_id);
|
||||
HydraShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent<HydraShadowSourceComponent>(entity_id);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id);
|
||||
glBindTextureUnit(0, 0);
|
||||
// HydraTextureBuffer tex_buffer = GetEngine()->TextureBufferManager()->GetTexture(shad_comp.shadow_texture_id);
|
||||
// glBindTextureUnit(tex_buffer.gl_tex_id, 0);
|
||||
|
||||
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);
|
||||
|
||||
for (uint32_t rs_idx = 0; rs_idx < m_render_stages.size(); rs_idx++)
|
||||
{
|
||||
m_render_stages[rs_idx]->Render(render_system->Entities, INVALID_HYDRA_ID);
|
||||
}
|
||||
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
shadow_idx++;
|
||||
}
|
||||
|
||||
|
||||
// glDisable(GL_POLYGON_OFFSET_FILL);
|
||||
}
|
||||
|
||||
void HydraShadowPipeline::_CreateRenderStage()
|
||||
@@ -69,17 +77,29 @@ void HydraShadowPipeline::_CreateRenderStage()
|
||||
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("ShadowBuffer");
|
||||
HydraID per_frame_buffer_id = buffer_manager->FindBuffer("ShadowPerFrameUBO");
|
||||
|
||||
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("ShadowMapSets");
|
||||
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("shadow_map_sets");
|
||||
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);
|
||||
@@ -98,6 +118,8 @@ void HydraShadowPipeline::_CreateRenderStage()
|
||||
0,
|
||||
textures,
|
||||
true,
|
||||
GL_FRONT,
|
||||
true,
|
||||
HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR);
|
||||
m_render_stages.push_back(render_stage);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef TEXTUREDEBUGUBO
|
||||
#define TEXTUREDEBUGUBO
|
||||
|
||||
|
||||
#include <GLMIncludes.h>
|
||||
|
||||
struct TextureDebugUBO
|
||||
{
|
||||
glm::mat4 view;
|
||||
glm::mat4 proj;
|
||||
uint32_t shadow_idx;
|
||||
glm::vec3 padding0;
|
||||
};
|
||||
|
||||
#endif /* TEXTUREDEBUGUBO */
|
||||
Reference in New Issue
Block a user