如何重新创建/修改正交投影矩阵(OpenGL)

问题描述 投票:1回答:2

我制作了一个简单的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,我的纹理使用正交投影矩阵绘制,这意味着有一个与窗口端口“平行”的平面或类似于我绘制的平面。当我尝试重新调整以适应新的窗口大小时,它无法正确调整。这段代码出了什么问题?

c++ opengl glfw opengl-compat
2个回答
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
投票

在您的代码中,您正在更改ortho矩阵,但您还需要更改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具有相同的尺寸

© www.soinside.com 2019 - 2024. All rights reserved.