2010-07-16 159 views
9

我正在繪製幾個形狀(如圓形),這些形狀的寬度取決於窗口高度&。由於窗口總是以給定的大小開始,所以它們被正確繪製,但是當窗口被調整大小時,它會將高寬比向上混淆。在OpenGL中,如何調整正在調整大小的窗口?

無論窗口大小如何,我如何正確繪製形狀?

回答

13

你肯定不想讓你的對象的大小明確依賴於窗口大小。

正如genpfault已經提示的那樣,只要窗口大小發生變化就調整投影矩陣。

的事做對窗口大小調整:

  1. 調整視:

    glViewPort(0,0, width, height)

  2. 調整投影矩陣:

    glFrustum(left * ratio, right * ratio, bottom, top, nearClip,farClip)

    glOrtho(left * ratio, right * ratio, bottom, top, nearClip,farClip)

    gluOrtho2D(left * ratio, right * ratio, bottom, top)

    (假設left, right, bottomtop都是平等的,ratio=width/height

+0

剪取也影響重繪區域,如果你一旦設置剪輯矩形'glScissor()'。見[this](https://www.opengl.org/discussion_boards/showthread.php/176760-glClearColor-WM-SIZE-only-part-is-cleared)。 – zwcloud 2017-03-30 05:50:03

4

如果你正在使用類似gluPerspective()只使用窗寬/高比例

gluPerspective(60, (double)width/(double)height, 1, 256); 
1

你應該建立某種形式的窗口處理函數被調用每當你的OpenGL窗口調整大小時。當aspectRatio> 1,並且aspectRatio < = 1時,您需要處理這種情況。不這樣做可能會導致在屏幕調整大小後,幾何體會脫離屏幕。

void windowResizeHandler(int windowWidth, int windowHeight){ 
    const float aspectRatio = ((float)windowWidth)/windowHeight; 
    float xSpan = 1; // Feel free to change this to any xSpan you need. 
    float ySpan = 1; // Feel free to change this to any ySpan you need. 

    if (aspectRatio > 1){ 
     // Width > Height, so scale xSpan accordinly. 
     xSpan *= aspectRatio; 
    } 
    else{ 
     // Height >= Width, so scale ySpan accordingly. 
     ySpan = xSpan/aspectRatio; 
    } 

    glOrhto2D(-1*xSpan, xSpan, -1*ySpan, ySpan, -1, 1); 

    // Use the entire window for rendering. 
    glViewport(0, 0, windowWidth, windowHeight); 
} 
0

我也在學習opengl。我昨天遇到了這個問題,我還沒有找到正確的答案。今天,我已經解決了這個問題。在我的小程序中,當調整窗口寬度或高度時,對象改變大小。這是我的代碼(請原諒我的錯誤):

#include <GL/freeglut.h> 

void fnReshape(int ww, int hh) 
{ 
    GLdouble r; 
    if(hh == 0) 
    hh = 1.0; 
    if(hh > ww) 
    r = (double) hh/(double) ww; 
    else 
    r = (double) ww/(double) hh; 
    glViewport(0, 0, ww, hh); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    if(hh > ww) 
    glFrustum(-1.0, 1.0, -1.0 * r, 1.0 * r, 2.0, 200.0); 
    else 
    glFrustum(-1.0 * r, 1.0 * r, -1.0, 1.0, 2.0, 200.0); 
} 
////////////////////////////////////////////////////////////////// 
void fnDisplay(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0., 0., -5.); 
    glBegin(GL_QUAD_STRIP); 
    glColor3f(0., 0., 1.0); 
    glVertex3f(-1., -1., 0.); 
    glVertex3f(-1., 1., 0.); 
    glVertex3f(1., -1., 0.); 
    glVertex3f(1., 1., 0.); 
    glEnd(); 
    glutSwapBuffers(); 
} 
//////////////////////////////////////////////////////////// 
int main(int argc, char **argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA |GLUT_DOUBLE); 
    glutInitWindowSize(500, 500); 
    glutCreateWindow("Sample window"); 
    glClearColor(1.0, 0, 0, 1.0); 
    glutDisplayFunc(fnDisplay); 
    glutReshapeFunc(fnReshape); 
    glutMainLoop(); 
    return 0; 
} 
0

有很多方法可以做到這一點。 以下示例顯示了我在項目中的工作方式。 該示例僅顯示一個矩形框,它在窗口大小調整時不會更改它的大小。您可以直接調用複製並粘貼在你的項目中(考慮到我是一個初學者的OpenGL)

#include<windows.h> 
#include<glut.h> 

GLfloat x1=100.0f; 
GLfloat y1=150.0f; 
GLsizei rsize = 50; 

GLfloat xstep=1.0f; 
GLfloat ystep=1.0f; 

GLfloat windowWidth; 
GLfloat windowHeight; 


void scene(void){ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0f,0.0f,0.0f); 

    glRectf(x1,y1,x1+rsize,y1-rsize); 

    glutSwapBuffers(); 
} 

void setupRc(void){ 

    glClearColor(0.0f,0.0f,1.0f,0.0f); 

} 

void changeSize(GLsizei w,GLsizei h){ 
    if(h==0) 
    h=1; 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    if(w>=h){ 
    windowWidth=250.0f*w/h; 
    windowHeight=250.f; 
    } 
    else{ 
    windowWidth=250.0f; 
    windowHeight=250.f*h/w; 
    } 

    glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f); 


    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 


} 




void main(void){ 

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); 

    glutCreateWindow("Rectangle"); 

    glutReshapeFunc(changeSize); 
    glutDisplayFunc(scene); 
    setupRc(); 

    glutMainLoop(); 

} 
相關問題