게임엔진/크로스플랫폼 : HazelEngine

230506 자체 엔진 개발 : Resize

mrawesome 2023. 5. 9. 23:45

https://github.com/ohbumjun/GameEngineTutorial/commit/a7c58287c4edf59969c538739bd67dcc80039f5c

 

Window 창을 Resize 한다는 것은 무슨 의미일까 ?

 

우리가 렌더하는 픽셀이 Resize 에 맞게, 위치가 조정되어야 한다.

즉, Resize 하면 각 픽셀이 렌더링 되는 위치도 조정되어야 한다는 것이다.

자. 다시 말하면, 우리가 렌더링할 픽셀들이 모여있는 메모리 버퍼가 있다.

그리고 그 메모리 버퍼의 사이즈는, 우리가 렌더링하는 창의 크기에 맞게 조정되어야 한다.

(관련 함수) 즉, GraphicAPI 에게 Rendering Area 가 변경되었다는 것을 알려줘야 한다는 것이다.

OpenGL 의 경우 glViewPort 함수를 통해 가능하다. 이는 말 그대로 OpenGL 에게 우리가 렌더링할 ViewPort 정보를 알려주는 것이다.

 

bool Application::OnWindowResize(WindowResizeEvent& e)
{
    // minimize 
    if (e.GetWidth() == 0 || e.GetHeight() == 0)
    {
        m_Minimized = true;

        return false;
    }

    m_Minimized = false;

    // Tell Renderer the change
    Renderer::OnWindowResize(e.GetWidth(), e.GetHeight());

    // 모든 Layer 가 Resize Event 를 알게 하기 위해 return false
    return false;
};

 

Window 가 Resize 될 경우에는 위의 Application 상에서 Event 처리를 시작한다.

왜 Application 상에서 진행하는 것일까 ? 해당 Class 가 바로 Platform 혹은 API 에

독립적인 클래스이기 때문이다.

 

1) 
void Renderer::OnWindowResize(uint32_t width, uint32_t height)
{
    // Multi ViewPort 사용시 수정할 사항
    RenderCommand::SetViewPort(0, 0, width, height);
}

2) 
inline static void SetViewPort(uint32_t x, uint32_t y, uint32_t width, uint32_t height)
{
    s_RendererAPI->SetViewPort(x, y, width, height);
}
// static RendererAPI* s_RendererAPI;

3) 
void OpenGLRendererAPI::SetViewPort(uint32_t x, uint32_t y, uint32_t width, uint32_t height)
{
    // Window Resize 에 따라 ViewPort 재설정
    glViewport(x, y, width, height);
}

이후 위와 같이

-> Renderer.h -> RenderCommand -> RenderAPI

순서로 함수를 실행하여, 내가 현재 사용하는 Graphic API 에 맞는 함수를 호출할 수 있도록 하는 것이다.

 

bool OrthographicCameraController::OnWindowResizeEvent(WindowResizeEvent& e)
{
    m_AspectRatio = (float)e.GetWidth() / (float)e.GetHeight();

    m_Camera.SetProjection(
      -1.f * m_AspectRatio * m_ZoomLevel, 
             m_AspectRatio * m_ZoomLevel, 
      -1.f * m_ZoomLevel, 
             m_ZoomLevel);

    return false;
}

bool Application::OnWindowResize(WindowResizeEvent& e) 함수에서 보면 무조건 return false 를 해뒀다.

이 말은 즉슨, 다른 Layer 에서도 Resize Event 를 알게 하여, 그에 맞는 Event 를 처리하게 하기 위함이다.

 

결과적으로 이러헥 CameraController 측에서도 인지하게 되고, 이로 인해 Projection Matrix 값을 변경하는 로직도 구성할 수 있게 되는 것이다.