230506 자체 엔진 개발 : Resize
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 값을 변경하는 로직도 구성할 수 있게 되는 것이다.