opengl:设置视口和 glortho 时遇到问题

Posted

技术标签:

【中文标题】opengl:设置视口和 glortho 时遇到问题【英文标题】:opengl: Trouble setting up viewport and glortho 【发布时间】:2015-05-14 07:58:35 【问题描述】:

我正在尝试为一些纹理渲染设置我的 OpenGL 视图。根据论坛上的一些建议,我将视口和正交矩阵设置如下:

首先,我尝试计算在保持图像纵横比的同时可以使用的屏幕宽度和高度:

void resize(int w, int h)

    float target_aspect_ratio = image_width / image_height;
    width = w;
    height = (int)(width / target_aspect_ratio + 0.5f);
    if (height > h) 
        height = h;
        width = (int)(height * target_aspect_ratio + 0.5f);
           

    off_x = (w - width)/2.f;
    off_y = (h - height)/2;
    // I want to center my image. So I have these offsets 
    glViewport(off_x, off_y, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, 0, height, 0.0f, 1.0f);

现在当我想渲染我的纹理时:

void paint()

    // texture binding etc.
    glTexCoord2f(0, 0); glVertex2f(0, 0); 
    glTexCoord2f(1, 0); glVertex2f(width, 0);
    glTexCoord2f(1, 1); glVertex2f(width, height);
    glTexCoord2f(0, 1); glVertex2f(0, height);

但是,这并没有按预期显示图像。当我调整屏幕大小时,它不会保持纵横比。这几乎就像 glViewport 没有效果一样,我可以验证每次调整窗口大小时都会调用此函数。

更新:

这很奇怪。几乎就好像这些调用没有效果一样。我什至做了一些事情:

_off_x = _off_y = 0;
_width = 500;
_height = 500;

所以我希望视口在屏幕的左下角,但图像的绘制和以前一样基本上使用整个屏幕作为视口。

更新 2:

好的,如果我打电话给

glViewport(_off_x, _off_y, _width, _height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, _width, 0, _height, 0, 1);

在我的绘画活动中,它按预期工作!但是,我认为将它放在 resize 事件处理程序中就足够了。

【问题讨论】:

好的,我想通了。似乎新的 QOpenGLWidget 有问题,并且在调整大小和绘制调用之间的某个位置覆盖了投影矩阵和视口。我切换到旧的 QGLWidget,它似乎按预期工作...... 【参考方案1】:

在开始绘图之前,您需要将矩阵模式切换到 GL_MODELVIEW。您无需在每一帧的渲染函数中设置投影矩阵。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

这是我写的关于 glMatrixMode() 函数模式的详细分析: OpenGL glMatrixMode(GL_PROJECTION) vs glMatrixMode(GL_MODELVIEW)

【讨论】:

我也试过了,效果一样。 :/ 问题似乎是 QOpenGLWidget 正在撤消其代码中某处的设置。

以上是关于opengl:设置视口和 glortho 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL的gluLookAt和glOrtho的关系

openGL中glOrtho和glViewPort之间的区别[重复]

openGl 重塑函数

OpenGL 中的可视化问题(glOrtho 和投影)

OpenGL:使用 FBO 和视口偏移问题渲染到纹理

OpenGL-坐标系