tessalation started

This commit is contained in:
Confideo-IOM
2026-09-28 15:31:22 +01:00
parent 6e1a531f94
commit 7a1eaa3654
24 changed files with 384 additions and 24 deletions
@@ -30,7 +30,9 @@ void HydraDeferredPipeline::Initialise()
_CreateOutputActor();
_CreateFrameBuffer();
_CreateColourRenderStage();
_CreateLandscapeRenderStage();
_CreateOutputRenderStage();
//_CreateTextureDebugOutputStage();
}
@@ -120,8 +122,8 @@ void HydraDeferredPipeline::_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);
glGenFramebuffers(1, &m_frame_buffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, m_frame_buffer_id);
HydraOutputActor* actor = static_cast<HydraOutputActor*>(GetEngine()->ActorManager()->GetActor(m_output_actor_id));
@@ -207,7 +209,7 @@ void HydraDeferredPipeline::_CreateColourRenderStage()
std::vector<uint32_t> textures;
render_stage->Initialise(shader_path + "deferred_shader.vert",
shader_path + "deferred_shader.frag", "",
shader_path + "deferred_shader.frag", "", "", "",
shader_binding,
m_frame_buffer_id,
textures,
@@ -218,6 +220,54 @@ void HydraDeferredPipeline::_CreateColourRenderStage()
m_render_stages.push_back(render_stage);
}
void HydraDeferredPipeline::_CreateLandscapeRenderStage()
{
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 per_frame_buffer_id = buffer_manager->FindBuffer("DeferredPerFrameUBO");
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("uniform_per_frame");
shader_binding.binding_point.push_back(0);
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 + "landscape_shader.vert",
shader_path + "landscape_shader.frag",
"",
shader_path + "landscape_shader.tesc",
shader_path + "landscape_shader.tese",
shader_binding,
m_frame_buffer_id,
textures,
true,
GL_BACK,
true,
HYDRA_RENDERABLE_TYPE::HYDRA_LANDSCAPE);
m_render_stages.push_back(render_stage);
}
void HydraDeferredPipeline::_CreateOutputRenderStage()
{
@@ -283,7 +333,7 @@ void HydraDeferredPipeline::_CreateOutputRenderStage()
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", "",
shader_path + "deferred_output_shader.frag", "", "", "",
shader_binding,
0,
textures,
@@ -328,7 +378,7 @@ void HydraDeferredPipeline::_CreateTextureDebugOutputStage()
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_path + "texture_debug_shader.frag", "", "", "",
shader_binding,
0,
textures,
@@ -32,7 +32,7 @@ class HydraDeferredPipeline : public HydraPipeline
void _UpdateUBO();
void _CreateFrameBuffer();
void _CreateLandscapeRenderStage();
void _CreateColourRenderStage();
void _CreateOutputRenderStage();
void _CreateOutputActor();
@@ -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, GL_BACK, 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",
@@ -15,6 +15,8 @@
void HydraRenderStage::Initialise(std::string vertex_shader_file,
std::string fragment_shader_file,
std::string geometry_shader_file,
std::string tess_control_shader_file,
std::string tess_evaluation_shader_file,
HydraShaderBinding shader_binding,
uint32_t framebuffer_id,
std::vector<uint32_t> textures,
@@ -46,6 +48,16 @@ void HydraRenderStage::Initialise(std::string vertex_shader_file,
m_geometry_shader = _LoadShader(geometry_shader_file, GL_GEOMETRY_SHADER);
glAttachShader(m_program, m_geometry_shader);
}
if (tess_control_shader_file.length() > 0)
{
m_tess_control_shader = _LoadShader(tess_control_shader_file, GL_TESS_CONTROL_SHADER);
glAttachShader(m_program, m_tess_control_shader);
}
if (tess_evaluation_shader_file.length() > 0)
{
m_tess_evaluation_shader = _LoadShader(tess_evaluation_shader_file, GL_TESS_EVALUATION_SHADER);
glAttachShader(m_program, m_tess_evaluation_shader);
}
glLinkProgram(m_program);
int success;
@@ -123,12 +135,12 @@ void HydraRenderStage::Render(std::set<HydraID> &entities, uint32_t framebuffer_
HydraVertexBuffer &vertex_buffer = vert_buffer_mananger->GetVertexBuffer(mesh_comp.vertex_buffer_id);
glBindVertexArray(vertex_buffer.vao);
glDrawElements(GL_TRIANGLES, vertex_buffer.triangle_count, GL_UNSIGNED_INT, (void *)0);
glDrawElements(GL_TRIANGLES, vertex_buffer.triangle_count, GL_UNSIGNED_INT, (void *)0);
}
}
}
}
glBindVertexArray(0);
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
@@ -180,19 +192,18 @@ void HydraRenderStage::_BindBuffers()
for (uint32_t bind_idx = 0; bind_idx < m_shader_binding.block_name.size(); bind_idx++)
{
HydraBuffer buffer = buffer_manager->GetBuffer(m_shader_binding.buffer_id[bind_idx]);
switch (m_shader_binding.buffer_type[bind_idx])
{
case HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER:
{
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
case HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER:
{
glBindBufferBase(GL_UNIFORM_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
case HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER:
{
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
case HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER:
{
glBindBufferBase(GL_UNIFORM_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
}
}
}
@@ -13,6 +13,8 @@ class HydraRenderStage : public HydraObject
void Initialise(std::string vertex_shader_file,
std::string fragment_shader_file,
std::string geometry_shader_file,
std::string tess_control_shader_file,
std::string tess_evaluation_shader_file,
HydraShaderBinding shader_binding,
uint32_t framebuffer_id,
std::vector<uint32_t> textures,
@@ -32,6 +34,8 @@ class HydraRenderStage : public HydraObject
uint32_t m_vertex_shader = GL_INVALID_VALUE;
uint32_t m_fragment_shader = GL_INVALID_VALUE;
uint32_t m_geometry_shader = GL_INVALID_VALUE;
uint32_t m_tess_control_shader = GL_INVALID_VALUE;
uint32_t m_tess_evaluation_shader = GL_INVALID_VALUE;
uint32_t m_program = GL_INVALID_VALUE;
uint32_t m_renderable_type;
uint32_t m_framebuffer_id = 0;
@@ -158,6 +158,7 @@ void HydraShadowPipeline::_CreatePointRenderStage()
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,
@@ -212,6 +213,7 @@ void HydraShadowPipeline::_CreateDirectionalRenderStage()
render_stage->Initialise(shader_path + "shadow_cascade_shader.vert",
shader_path + "shadow_cascade_shader.frag",
shader_path + "shadow_cascade_shader.geom",
"","",
shader_binding,
0,
textures,
@@ -265,7 +267,7 @@ void HydraShadowPipeline::_CreateSpotRenderStage()
render_stage->Initialise(shader_path + "shadow_spot_shader.vert",
shader_path + "shadow_spot_shader.frag",
"",
"", "", "",
shader_binding,
0,
textures,