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 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章