Split improvemnts before tess shader
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user