如何在不缩放其内容的情况下调整 opengl 视口大小
Posted
技术标签:
【中文标题】如何在不缩放其内容的情况下调整 opengl 视口大小【英文标题】:How do you adjust an opengl viewport size without scaling its contents 【发布时间】:2012-09-07 13:00:15 【问题描述】:调整窗口大小时,我不希望内容缩放,而只是增加视口大小。我在***(http://***.com/questions/5894866/resize-viewport-crop-scene)上搜索时发现了这一点,这与我的问题几乎相同。但是我对将缩放设置到什么位置以及在哪里设置感到困惑,我用 1.0f 进行了尝试,但是什么也没显示:s
这是当前进行缩放的resize函数代码:
void GLRenderer::resize()
RECT rect;
int width, height;
GLfloat aspect;
GetClientRect(hWnd, &rect);
width = rect.right;
height = rect.bottom;
if (height == 0)
height = 1;
aspect = (GLfloat) width / height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, aspect, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
还有我的函数来渲染一个简单的三角形:
void GLRenderer::render()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslated(0, 0, -20);
glBegin(GL_TRIANGLES);
glColor3d(1, 0, 0);
glVertex3d(0, 1, 0);
glVertex3d(1, -1, 0);
glVertex3d(-1, -1, 0);
glEnd();
SwapBuffers(hDC);
【问题讨论】:
【参考方案1】:您可以使用“视野”参数将 y(高度)的缩放更改为 gluPerspective。在您的代码中是 45 度的那个。由于当前始终为 45 度,因此您将始终获得相同的视角(以 y 为单位)。如何将这个值作为窗口高度的函数来改变并不明显。对于较大的值(180 度及以上),线性关系将失败。我会尝试使用 arctan(height/k),其中“k”类似于 500。
还请注意,当您在 x 中扩展窗口时,您将已经得到您想要的(您的源代码当前的方式)。也就是说,您可以获得更广阔的视野。那是因为您将 aspect(第二个参数)更改为取决于 x 和 y 之间的比率的值。
高度和宽度以像素为单位,因此值为 1 不好。
请注意,您使用的是已弃用的旧版 OpenGL。请参阅Legacy OpenGL 了解更多信息。
【讨论】:
啊哈,我让它工作了:double fovy = height/45.0; gluPerspective(fovy, aspect, 0.1, 100.0);谢谢您的帮助! :)以上是关于如何在不缩放其内容的情况下调整 opengl 视口大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在不扭曲其内容的情况下沿一个轴调整 UICollectionViewCell 的大小?
获取浏览器视口的宽度和高度,无论内容大小如何且不调整为 100%?
如何在不使用 UIImageView 的情况下捏缩放 UIImage?
是否可以制作一个 UILabel、UITextView 或类似的东西,它总是在不截断的情况下调整其高度以适应其在 Interface Builder 中的内容?