#ifndef HYDRACREATESHADOWFRAMEBUFFER #define HYDRACREATESHADOWFRAMEBUFFER #include "../HydraTask.h" #include "../../engine/HydraEngine.h" #include "../../renderer/HydraRenderer.h" #include #include "../../GlewIncludes.h" #include "../../buffer/HydraTextureBufferManager.h" 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: public: void Process() override { HydraEngine *engine = GetEngine(); HydraTextureBufferManager *tex_buffer_manager = engine->TextureBufferManager(); HydraRenderSettings render_settings = engine->RenderSettings(); *m_texture_id = tex_buffer_manager->CreateTexture("shadow_FB", SHADOW_MAP_SIZE, SHADOW_MAP_SIZE, GL_RGBA8, GL_NEAREST, GL_NEAREST, 1); HydraTextureBuffer texture = tex_buffer_manager->GetTexture(*m_texture_id); *m_depth_texture_id = tex_buffer_manager->CreateTexture("shadow_depth_buffer", SHADOW_MAP_SIZE, SHADOW_MAP_SIZE, GL_DEPTH_COMPONENT32F, GL_NEAREST, GL_NEAREST, 1); HydraTextureBuffer depth_texture = tex_buffer_manager->GetTexture(*m_depth_texture_id); glGenFramebuffers(1, m_frame_buffer_id); glBindFramebuffer(GL_FRAMEBUFFER, *m_frame_buffer_id); glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTextureParameteri(texture.gl_tex_id, 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); 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) { std::cout << "Framebuffer error: " << status << std::endl; } glBindFramebuffer(GL_FRAMEBUFFER, 0); tex_buffer_manager->BindTexture(*m_depth_texture_id, GL_TEXTURE_2D); } 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 */