OpenGL parallel projection graphics do not scale with the window

  QtOpenGL平行投影窗口缩放导致图形变形...

OpenGL parallel projection graphics do not scale with the window

实现步骤

  • 重写窗口的resize事件
    • 计算投影的范围
  • 更新投影矩阵
  • drawcull

resizeGL

  • 我们最初计算一个比例:
    • 关于窗口的size和投影的范围的
      • 使用left, right计算一个spanx(right - left), top, bottom计算spany(top - bottom), 分别与窗口的宽高比较
        1
        2
        3
        4
        auto ratioW = w / spanx;
        auto ratioH = h / spany;
        // 取最小的一个
        auto ratio = std::min(ratioW,ratioH);
    • 每次窗口缩放,我们就使用上述的范围计算新的left,right,bottom,top
      • 只要投影的范围没有发生改变我们便不计算新的ratio
  • 计算新的left,right,bottom,top
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void OpenGLWidget::resizeGL(int w, int h)
    {
    glViewport(0,0,w,h);

    left = - w / ratio;
    right = abs(left);
    bottom = -h / ratio;
    top = abs(bottom);
    }

更新投影矩阵

  • update
    • 关于zNear & zFar投影当二维平面时候,并未使用这两个参数
      1
      projMat.ortho(left,right,bottom,top,0.1f,100.0f);

更新绘制的场景

1
2
3
4
5
6

shaderProgram.bind();
shaderProgram->setUniformValue("projectionMatrix", projMat);
glDrawArray()
......