#include "Canvas.h" #include "EngineCore/Game.h" #include "EngineFrame/Render/RenderManager.h" Canvas::Canvas() { } Canvas::Canvas(VecSize size) { Init(size); } Canvas::Canvas(int width, int height) { Init({width, height}); } void Canvas::Init(VecSize size) { m_size = size; SetSize(size); // 创建指定大小的纹理 m_texture = new Texture(); m_texture->Init(m_size); // 构造FBO glGenFramebuffers(1, &m_fbo); glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); // 将目标纹理附加到FBO的颜色附着点 glFramebufferTexture2D( GL_FRAMEBUFFER, // 帧缓冲类型 GL_COLOR_ATTACHMENT0, // 颜色附着点(可多个,这里用第一个) GL_TEXTURE_2D, // 纹理类型 m_texture->getID(), // 目标纹理ID 0 // 多级渐远纹理级别 ); glBindFramebuffer(GL_FRAMEBUFFER, 0); // 解绑FBO } void Canvas::BeginDraw() { RenderManager *renderer = Game::GetInstance().GetRenderer(); // 绑定FBO glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); // 清屏 glClear(GL_COLOR_BUFFER_BIT); // 保存原始的正交矩阵 设置纹理对应的正交矩阵 和 视口 Oom = renderer->GetOrthoMatrix(); renderer->SetOrthoMatrix(glm::ortho(0.0f, (float)m_size.width, 0.0f, (float)m_size.height, -1.0f, 1.0f)); Oviewport = renderer->GetViewport(); renderer->SetViewport({0, 0, m_size.width, m_size.height}); } void Canvas::EndDraw() { RenderManager *renderer = Game::GetInstance().GetRenderer(); // 解绑FBO glBindFramebuffer(GL_FRAMEBUFFER, 0); // 恢复原始的正交矩阵 和 视口 renderer->SetOrthoMatrix(Oom); renderer->SetViewport(Oviewport); } void Canvas::DrawActor(RefPtr actor) { // 计算矩阵 actor->PreRender(); // 设定矩阵并渲染(Render中会调用OnRender) actor->Render(); } void Canvas::Clear() { m_texture = new Texture(); m_texture->Init(m_size); } void Canvas::OnRender() { if (!m_texture || !IsVisible()) return; RenderManager *renderer = Game::GetInstance().GetRenderer(); if (this->_BlendMode != NONE) { renderer->SetBlendMode(this->_BlendMode); } renderer->DrawTexture(m_texture); if (this->_BlendMode != NONE) { renderer->SetBlendMode(NONE); } } // void Canvas::Render() // { // RenderManager *renderer = Game::GetInstance().GetRenderer(); // SDL_FPoint AnchorPos = {0, 0}; // if (m_dirty) // { // glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); // 绑定FBO // glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // glClear(GL_COLOR_BUFFER_BIT); // for (auto &info : m_drawQueue) // { // renderer->DrawTexture(m_imgMap[info.texture], nullptr, &info.rect, 0.f, &AnchorPos, SDL_FLIP_NONE); // } // glBindFramebuffer(GL_FRAMEBUFFER, 0); // 解绑FBO // m_dirty = false; // } // renderer->SetCurrentShaderProgram("flip_y"); // // 混合 // if (this->_BlendMode != NONE) // Blend(); // renderer->DrawTexture(m_texture, &m_renderRect, &m_rect, 0.f, &AnchorPos, SDL_FLIP_NONE); // // 还原混合 // if (this->_BlendMode != NONE) // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // renderer->SetCurrentShaderProgram("normal"); // }