【问题标题】:How to re-create/modify orthographic projection matrix (OpenGL)如何重新创建/修改正交投影矩阵(OpenGL)
【发布时间】:2019-04-04 03:21:37
【问题描述】:

我制作了一个简单的 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


    【解决方案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 具有相同的尺寸

    【讨论】:

      【解决方案2】:

      当窗口和帧缓冲区的大小已经改变时,你必须调整视口矩形。
      视口矩形可以由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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多