Directional Shdaows, no alpha

This commit is contained in:
Confideo-IOM
2026-08-03 22:34:52 +01:00
parent 299ad1d9c7
commit d074dc71a5
69 changed files with 1353 additions and 406 deletions
@@ -11,6 +11,7 @@ class HydraCreateShadowFrameBuffer : public HydraTask
{
private:
uint32_t *m_texture_id = 0;
uint32_t *m_depth_texture_id = 0;
uint32_t *m_frame_buffer_id = nullptr;
protected:
@@ -22,26 +23,47 @@ public:
HydraTextureBufferManager *tex_buffer_manager = engine->TextureBufferManager();
HydraRenderSettings render_settings = engine->RenderSettings();
*m_texture_id = tex_buffer_manager->CreateTextureArray("shadow_FB",
SHADOW_MAP_SIZE, SHADOW_MAP_SIZE,
GL_DEPTH_COMPONENT24,
GL_NEAREST,
GL_NEAREST,
6);
*m_texture_id = tex_buffer_manager->CreateTextureArray("shadow_FB",
SHADOW_MAP_SIZE, SHADOW_MAP_SIZE,
GL_RGBA8,
GL_NEAREST,
GL_NEAREST,
6);
HydraTextureBuffer texture = tex_buffer_manager->GetTexture(*m_texture_id);
*m_depth_texture_id = tex_buffer_manager->CreateTextureArray("shadow_depth_buffer",
SHADOW_MAP_SIZE, SHADOW_MAP_SIZE,
GL_DEPTH_COMPONENT32F,
GL_NEAREST,
GL_NEAREST,
6);
HydraTextureBuffer depth_texture = tex_buffer_manager->GetTexture(*m_depth_texture_id);
glGenFramebuffers(1, m_frame_buffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, *m_frame_buffer_id);
glNamedFramebufferDrawBuffer(*m_frame_buffer_id, GL_NONE);
glNamedFramebufferReadBuffer(*m_frame_buffer_id, GL_NONE);
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D_ARRAY, texture.gl_tex_id);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// FIX 1: Set explicit filters for the depth texture to prevent incomplete attachment
glTextureParameteri(depth_texture.gl_tex_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameteri(depth_texture.gl_tex_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texture.gl_tex_id, 0);
glm::vec4 border = glm::vec4(1,1,1,1);
glTextureParameteri(depth_texture.gl_tex_id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTextureParameteri(depth_texture.gl_tex_id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTextureParameterfv(depth_texture.gl_tex_id, GL_TEXTURE_BORDER_COLOR, &border[0]);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture.gl_tex_id, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depth_texture.gl_tex_id, 0);
glNamedFramebufferDrawBuffer(*m_frame_buffer_id, GL_COLOR_ATTACHMENT0);
glNamedFramebufferReadBuffer(*m_frame_buffer_id, GL_COLOR_ATTACHMENT0);
GLenum draw_buffers[] = {GL_COLOR_ATTACHMENT0};
glNamedFramebufferDrawBuffers(*m_frame_buffer_id, 1, draw_buffers);
GLenum status = glCheckNamedFramebufferStatus(*m_frame_buffer_id, GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
@@ -49,13 +71,14 @@ public:
std::cout << "Framebuffer error: " << status << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
tex_buffer_manager->BindTexture(*m_texture_id, GL_TEXTURE_2D_ARRAY);
tex_buffer_manager->BindTexture(*m_depth_texture_id, GL_TEXTURE_2D_ARRAY);
}
void Initialise(uint32_t *texture_id, uint32_t *frame_buffer_id)
void Initialise(uint32_t *texture_id, uint32_t *depth_texture_id, uint32_t *frame_buffer_id)
{
m_texture_id = texture_id;
m_frame_buffer_id = frame_buffer_id;
m_depth_texture_id = depth_texture_id;
}
};
#endif /* HYDRACREATESHADOWFRAMEBUFFER */