OpenGL - 如何在调整大小时适应窗口

no8*_*1no 0 c++ opengl resize

我有一个以窗口屏幕为中心的形状。目前,窗口大小调整保持不变(相同的宽度和高度)。在调整大小时使其适合窗口并保持其纵横比的最佳方法是什么?

const int WIDTH = 490;
const int HEIGHT = 600;

/**
* render scene
*/
void renderScene(void)
{
    //clear all data on scene
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //set white bg color
    glClearColor(1, 1, 1, 1);

    glColor3ub(153, 153, 255);
    glBegin(GL_POLYGON);
        glVertex2f(60, 310);
        glVertex2f(245, 50);
        glVertex2f(430, 310);
        glVertex2f(245, 530);
    glEnd();

    glutSwapBuffers();
}

/**
* reshape scene
*/
void reshapeScene(GLint width, GLint height)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glViewport(0, 0, width, height);
    gluOrtho2D(0, width, height, 0);
    glMatrixMode(GL_MODELVIEW);

    glutPostRedisplay();
}

/**
* entry point
*/
int main(int argc, char **argv)
{
    //set window properties
    glutInit(&argc, argv);  

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(WIDTH, HEIGHT);
    glutInitWindowPosition((glutGet(GLUT_SCREEN_WIDTH)-WIDTH)/2, (glutGet(GLUT_SCREEN_HEIGHT)-HEIGHT)/2);
    glutCreateWindow("Test Window");

    //paste opengl version in console
    printf((const char*)glGetString(GL_VERSION));

    //register callbacks
    glutDisplayFunc(renderScene);
    glutReshapeFunc(reshapeScene);

    //start animation
    glutMainLoop();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Mat*_*oss 5

在顶部:

const int WIDTH = 490;
const int HEIGHT = 600;
const float ASPECT = float(WIDTH)/HEIGHT;   // desired aspect ratio
Run Code Online (Sandbox Code Playgroud)

然后reshapeScene

void reshapeScene(GLint width, GLint height)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    int w = height * ASPECT;           // w is width adjusted for aspect ratio
    int left = (width - w) / 2;
    glViewport(left, 0, w, height);       // fix up the viewport to maintain aspect ratio
    gluOrtho2D(0, WIDTH, HEIGHT, 0);   // only the window is changing, not the camera
    glMatrixMode(GL_MODELVIEW);

    glutPostRedisplay();
}
Run Code Online (Sandbox Code Playgroud)

由于您没有将窗口大小调整限制为特定的宽高比,因此您需要选择两个维度之一(此处为高度)来驱动视口重塑,并根据该高度和所需的宽高比计算调整后的宽度。请参阅上面调整后的glViewport通话。

另外,gluOrtho2D本质上就是你的相机。由于您没有太多地移动相机或物体,因此不需要更改它(因此它只使用初始的WIDTHHEIGHT)。