某些 window 尺寸的 OpenGL 图像无法正确显示

OpenGL images not displaying properly with some window sizes

我是 OpenGL 新手,正在尝试显示图像。我已经完成 "Load image from file" 部分,现在正尝试将其绑定到我的形状 (GL_TRIANGLES)。有时图像会正确显示,但有时不会。我已经意识到它取决于 window 的大小,所以如果我调整 window 的大小,我可以获得清晰的图像。以下是屏幕外观的一些屏幕截图:

工作:

损坏:

这是我的绘制循环:

void display() {
    // tick the frame counter
    frame++;
    start_time = clock();

    // update screen
    int width = glutGet(GLUT_WINDOW_WIDTH);
    int height = glutGet(GLUT_WINDOW_HEIGHT);
    update_screen(width, height);

    // clear screen
    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    glPushMatrix();

    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, png::get_textures()[1]);

    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

    glBegin(GL_TRIANGLES);
        glVertex2f(1000, 1000);
        glVertex2f(0, 1000);
        glVertex2f(0, 0);

        glVertex2f(1000, 1000);
        glVertex2f(1000, 0);
        glVertex2f(0, 0);
    glEnd();

    glDisable(GL_TEXTURE_2D);

    glPopMatrix();
    glFlush();

    glutSwapBuffers();

    elapsed_time = ((clock() - start_time) / (double(CLOCKS_PER_SEC) / 10000));

    // tick all entities
    player.tick(elapsed_time);

    glutPostRedisplay();
}

此外,如果我删除 glEnable(GL_TEXTURE_GEN_S) 或 glEnable(GL_TEXTURE_GEN_T);或两者兼而有之,图像完全变成蓝色或灰色。

编辑:哦,我正在使用 PNG 文件,以防万一。

嗯,我觉得不好意思!

我忘了添加 glTexCoord2f...

听听我的新文件,以防其他人忘记了他们的大脑。 :)

void display() {
    // tick the frame counter
    frame++;
    start_time = clock();

    // update screen
    int width = glutGet(GLUT_WINDOW_WIDTH);
    int height = glutGet(GLUT_WINDOW_HEIGHT);
    update_screen(width, height);

    //glMatrixMode(GL_MODELVIEW);
    //glLoadIdentity();

    // clear screen
    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    glPushMatrix();

    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, png::get_textures()[3]);

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex2f(0, 0);
        glTexCoord2f(1, 0); glVertex2f(1000, 0);
        glTexCoord2f(1, 1); glVertex2f(1000, 1000);
        glTexCoord2f(0, 1); glVertex2f(0, 1000);
    glEnd();

    glDisable(GL_TEXTURE_2D);

    glPopMatrix();
    glFlush();

    glutSwapBuffers();

    elapsed_time = ((clock() - start_time) / (double(CLOCKS_PER_SEC) / 10000));

    // tick all entities
    player.tick(elapsed_time);

    glutPostRedisplay();
}