Split improvemnts before tess shader

This commit is contained in:
Confideo-IOM
2026-09-26 18:40:34 +01:00
parent 5ded63d3f4
commit 6e1a531f94
29 changed files with 282 additions and 201 deletions
@@ -12,16 +12,16 @@
#include <iostream>
#include <GLMIncludes.h>
void HydraRenderStage::Initialise(std::string vertex_shader_file,
std::string fragment_shader_file,
std::string geometry_shader_file,
HydraShaderBinding shader_binding,
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 HydraRenderStage::Initialise(std::string vertex_shader_file,
std::string fragment_shader_file,
std::string geometry_shader_file,
HydraShaderBinding shader_binding,
uint32_t framebuffer_id,
std::vector<uint32_t> textures,
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);
@@ -31,17 +31,17 @@ void HydraRenderStage::Initialise(std::string vertex_shader_file,
m_cull = enable_culling;
m_program = glCreateProgram();
m_cull_face = cull_face;
if(vertex_shader_file.length() > 0)
if (vertex_shader_file.length() > 0)
{
m_vertex_shader = _LoadShader(vertex_shader_file, GL_VERTEX_SHADER);
m_vertex_shader = _LoadShader(vertex_shader_file, GL_VERTEX_SHADER);
glAttachShader(m_program, m_vertex_shader);
}
if(fragment_shader_file.length() > 0)
if (fragment_shader_file.length() > 0)
{
m_fragment_shader = _LoadShader(fragment_shader_file, GL_FRAGMENT_SHADER);
glAttachShader(m_program, m_fragment_shader);
}
if(geometry_shader_file.length() > 0)
if (geometry_shader_file.length() > 0)
{
m_geometry_shader = _LoadShader(geometry_shader_file, GL_GEOMETRY_SHADER);
glAttachShader(m_program, m_geometry_shader);
@@ -49,23 +49,24 @@ void HydraRenderStage::Initialise(std::string vertex_shader_file,
glLinkProgram(m_program);
int success;
glGetProgramiv(m_program, GL_LINK_STATUS, &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;
}
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()
@@ -75,22 +76,22 @@ void HydraRenderStage::ShutDown()
glDeleteProgram(m_program);
}
void HydraRenderStage::Render(std::set<HydraID>& entities, uint32_t framebuffer_id)
void HydraRenderStage::Render(std::set<HydraID> &entities, uint32_t framebuffer_id)
{
HydraECS* ecs = GetEngine()->ECS();
if(framebuffer_id != INVALID_HYDRA_ID)
HydraECS *ecs = GetEngine()->ECS();
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();
// glDrawBuffers(m_rb_attachments.size(), &m_rb_attachments[0]);
HydraVertexBufferManager *vert_buffer_mananger = GetEngine()->VertexBufferManager();
glUseProgram(m_program);
_BindBuffers();
_BindTextures();
HydraSignature signature = {};
signature.set(m_renderable_type, true);
if(m_cull)
if (m_cull)
{
glEnable(GL_CULL_FACE);
glCullFace(m_cull_face);
@@ -100,31 +101,34 @@ void HydraRenderStage::Render(std::set<HydraID>& entities, uint32_t framebuffer_
glDisable(GL_CULL_FACE);
}
if(m_depth_enable)
if (m_depth_enable)
{
glEnable(GL_DEPTH_TEST);
}
else
{
{
glDisable(GL_DEPTH_TEST);
}
for(const auto& entity_id : entities )
for (const auto &entity_id : entities)
{
HydraRenderableComponent render_comp = ecs->GetComponent<HydraRenderableComponent>(entity_id);
if(((render_comp.renderable_types & signature) == signature) && (render_comp.active))
if (((render_comp.renderable_types & signature) == signature) && (render_comp.active))
{
HydraMeshComponent mesh_comp = ecs->GetComponent<HydraMeshComponent>(entity_id);
if(mesh_comp.mesh_state == HYDRA_STATE::Ready)
if (ecs->HasComponent<HydraMeshComponent>(entity_id))
{
HydraVertexBuffer& vertex_buffer = vert_buffer_mananger->GetVertexBuffer(mesh_comp.vertex_buffer_id);
HydraMeshComponent mesh_comp = ecs->GetComponent<HydraMeshComponent>(entity_id);
if (mesh_comp.mesh_state == HYDRA_STATE::Ready)
{
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 );
glBindVertexArray(0);
glBindVertexArray(vertex_buffer.vao);
glDrawElements(GL_TRIANGLES, vertex_buffer.triangle_count, GL_UNSIGNED_INT, (void *)0);
}
}
}
}
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
@@ -134,10 +138,10 @@ void HydraRenderStage::Render(std::set<HydraID> &entities)
}
uint32_t HydraRenderStage::_LoadShader(std::string filename, uint32_t shader_type)
{
{
std::string shader_source = _LoadShaderSource(filename);
const char* src = shader_source.c_str();
const char *src = shader_source.c_str();
GLuint shader = glCreateShader(shader_type);
int length = shader_source.length();
int success;
@@ -146,59 +150,57 @@ uint32_t HydraRenderStage::_LoadShader(std::string filename, uint32_t shader_typ
glShaderSource(shader, 1, &src, &length);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if(!success)
if (!success)
{
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"
<< infoLog << std::endl;
};
return shader;
}
std::string HydraRenderStage::_LoadShaderSource(std::string filename)
{
{
std::ifstream file(filename);
if (!file.is_open()) {
if (!file.is_open())
{
std::cerr << "Failed to open shader file: " << filename << std::endl;
return "";
}
std::stringstream buffer;
buffer << file.rdbuf();
return buffer.str();
}
void HydraRenderStage::_BindBuffers()
{
HydraBufferManager* buffer_manager = GetEngine()->BufferManager();
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
for(uint32_t bind_idx = 0; bind_idx <m_shader_binding.block_name.size(); bind_idx++)
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;
}
}
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;
}
}
}
}
void HydraRenderStage::_BindTextures()
{
uint32_t active_texture = 0;
for(auto texture:m_textures)
for (auto texture : m_textures)
{
glBindTexture(GL_TEXTURE_2D, texture);
glActiveTexture(GL_TEXTURE0 + active_texture);