GLFW窗口最小化导致程序退出

  本文旨在记录GLFW窗口最小化导致透视矩阵计算报错并导致程序退出的问题,以及解决方案。

问题描述

  在学习OpenGL的过程中,要用到GLFW管理OpenGL的窗口。在渲染时,为了使显示结果随着窗口尺寸的调整保持一致,需要根据当前的窗口尺寸重新计算透视投影变换矩阵,代码如下所示:

... // some code

int width, height;
glfwGetFramebufferSize(window, &width, &height);
glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)width / (float)height, 0.1f, 100.0f);

... // some code

  当使窗口上的最小化按钮将窗口缩小后,程序运行报错:

Assertion failed: abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0), file XXXX\matrix_clip_space.inl, line 251  

问题原因

  GLFW库管理的窗口在最小化以后,窗口的宽度和高度都变成了0,这导致glm库在计算投影矩阵时,宽高比的计算出现除零操作,进而导致断言失败程序退出。

解决方案

  一个可行的解决方法是,对窗口的宽度和高度进行检测,如果遇到除零的情况,指定一个固定的宽高比进行透视投影矩阵的计算。


当珍惜每一片时光~