如何 re-create/modify 正交投影矩阵 (OpenGL)
How to re-create/modify orthographic projection matrix (OpenGL)
我制作了一个简单的 OpenGL 程序,可以在屏幕上绘制 2D 纹理。当你调整 window 的大小时,它没有正确调整,所以要解决这个问题,我会再次 运行 投影矩阵代码:
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 的图像,我的纹理是使用正交投影矩阵绘制的,这意味着有一个 "parallel" 的平面,带有 window 端口或其他东西就像我画的一样。当我尝试重新制作它以适应新的 window 尺寸时,它没有正确调整。这段代码出了什么问题?
当 window 和帧缓冲区的大小发生变化时,您必须调整视口矩形。
视口矩形可以通过 glViewport
设置并指定规范化设备坐标如何映射到 window 坐标。它定义了帧缓冲区的区域,其中从 (-1, -1) 到 (1, 1) 的标准化设备坐标被映射到。
glViewport(0, 0, windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
在您的代码中,您正在更改邻位矩阵,但您还需要更改 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 我们正在使用的视口的大小(在本例中,我们的 window)。您通常希望 glOrtho 和 glViewport 的尺寸相同
我制作了一个简单的 OpenGL 程序,可以在屏幕上绘制 2D 纹理。当你调整 window 的大小时,它没有正确调整,所以要解决这个问题,我会再次 运行 投影矩阵代码:
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 的图像,我的纹理是使用正交投影矩阵绘制的,这意味着有一个 "parallel" 的平面,带有 window 端口或其他东西就像我画的一样。当我尝试重新制作它以适应新的 window 尺寸时,它没有正确调整。这段代码出了什么问题?
当 window 和帧缓冲区的大小发生变化时,您必须调整视口矩形。
视口矩形可以通过 glViewport
设置并指定规范化设备坐标如何映射到 window 坐标。它定义了帧缓冲区的区域,其中从 (-1, -1) 到 (1, 1) 的标准化设备坐标被映射到。
glViewport(0, 0, windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
在您的代码中,您正在更改邻位矩阵,但您还需要更改 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 我们正在使用的视口的大小(在本例中,我们的 window)。您通常希望 glOrtho 和 glViewport 的尺寸相同