Hazel游戏引擎(048)窗口resize

文中若有代码、术语等错误,欢迎指正

前言

  • 引出

    由于47节,虽然设置了CameraController的窗口resize事件,但是OpenGL并没有改变渲染的位置,依旧是原先的大小和位置,所以需要调整OpenGL的渲染视口。

    后期我们需要为引擎实现不依靠停留在窗口也可以渲染的区域,需要用到OpenGL的frame buffer

  • 此节目的

    为了实现调整窗口大小后

    • OpenGL绘图的区域也会相应调整

      窗口调为0*0,OpenGL不应该渲染图形了

    • 摄像机也会根据窗口大小的变换,依旧保持正确的宽高比

当窗口大小改变时

原先窗口大小与显示效果

错误例子

  • 窗口放大,Opengl渲染区域不变

    如图,依旧是原先那一小块区域:重点观看黄色块,发现依旧渲染那么几块。

    请添加图片描述

  • 当窗口放大,OpenGL绘图的区域相应调整后

    未调整摄像机的宽高比,显示的比例不对

    请添加图片描述

正确的例子

关键代码

  • Application.cpp

    使用事件调度器捕捉响应Window调整大小事件

    dispatcher.Dispatch<WindowResizeEvent>(BIND_EVENT_FN(OnWindowResize));// 捕捉响应Window调整大小事件
    
    bool Application::OnWindowResize(WindowResizeEvent& e)
    {
          
          
        if (e.GetWidth() == 0 || e.GetHeight() == 0) {
          
          
            m_Minimized = true;
            return false;
        }
        m_Minimized = false;
        Renderer::OnWindowResize(e.GetWidth(), e.GetHeight());// 在这个函数中,调用OpenGLRendererAPI::SetViewport
        return false;
    }
    
    if (!m_Minimized) {
          
          
        // 每一层在update
        for (Layer* layer : m_LayerStack) {
          
          
            layer->OnUpdate(timestep);
        }
    }
    
  • OpenGL改变视口:绘图的区域改变

    void OpenGLRendererAPI::SetViewport(uint32_t x, uint32_t y, uint32_t width, uint32_t height)
    {
          
          
    	glViewport(x, y, width, height);
    }
    
    
  • 窗口大小调整,摄像机需要依旧保持正确的宽高比

    bool Hazel::OrthographicCameraController::OnWindowResized(WindowResizeEvent& e)
    {
          
          
        // 重新计算宽高比
        m_AspectRatio = (float)e.GetWidth() / (float)e.GetHeight();
        m_Camera.SetProjection(-m_AspectRatio * m_ZoomLevel, m_AspectRatio * m_ZoomLevel, -m_ZoomLevel, m_ZoomLevel);
        return false;
    }
    

猜你喜欢

转载自blog.csdn.net/qq_34060370/article/details/131882725