2015-05-14 79 views
0

我想爲一些紋理渲染設置我的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事件處理程序中。

+0

好吧,我想通了。看起來像新的QOpenGLWidget是越野車,並在調整大小和繪製調用之間的某處覆蓋投影矩陣和視口。我切換到舊的QGLWidget,它似乎按預期工作... – Luca

回答

1

在開始繪製之前,您需要將矩陣模式切換爲GL_MODELVIEW。您不需要在每個幀的渲染函數內設置投影矩陣。

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

這裏是一個詳細的分析,我寫了一篇關於glMatrixMode()函數模式: OpenGL glMatrixMode(GL_PROJECTION) vs glMatrixMode(GL_MODELVIEW)

+0

我也試過這個,它也有同樣的效果。 :/問題似乎是QOpenGLWidget在其代碼中的某處取消了設置。 – Luca