我想爲一些紋理渲染設置我的OpenGL視圖。繼在論壇上的一些意見,我建立了我的視口和鄰矩陣如下:opengl:麻煩設置視口和glortho
首先,我試着計算屏幕寬度和高度,同時保持我的圖像的長寬比,我可以使用:
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,它似乎按預期工作... – Luca