我制作了一个简单的OpenGL程序,可以在屏幕上绘制2D纹理。调整窗口大小时,它无法正确调整,因此要解决此问题,我将再次运行投影矩阵代码:
if (windowSizeChange)
{
std::cout << "Window resized." << std::endl;
std::cout << windowWidth << " " << windowHeight << std::endl;
windowSizeChange = false;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
但是,运行此代码会使图像变形。据我了解,要使其能够在屏幕上绘制2D形,我的纹理是使用正交投影矩阵绘制的,这意味着存在一个与窗口端口“平行”的平面或类似我所绘制的平面。当我尝试重新调整以适应新的窗口大小时,它无法正确调整。这段代码怎么了?
答案 0 :(得分:1)
当窗口和帧缓冲区的大小已更改时,则必须调整视口矩形。
视口矩形可以由glViewport
设置,并指定标准化设备坐标如何映射到窗口坐标。它定义了帧缓冲区的区域,从(-1,-1)到(1,1)的规范化设备坐标被映射到该区域。
glViewport(0, 0, windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
答案 1 :(得分:1)
在您的代码中,您正在更改正交矩阵,但您还需要更改glViewport:
if (windowSizeChange)
{
glViewport(0, 0, windowWidth, windowHeight); // <-- Add this
std::cout << "Window resized." << std::endl;
std::cout << windowWidth << " " << windowHeight << std::endl;
windowSizeChange = false;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
如您所说,正交矩阵只是一个与屏幕平行的矩阵。当我们调用glOrtho时,它会更改正在使用的矩阵的大小,而glViewport会告诉openGL我们正在使用的视口的大小(在本例中是我们的窗口)。通常,您会希望glOrtho和glViewport具有相同的尺寸