Comment dessiner une texture pleine résolution sur une fenêtre de la même résolution?

8

Mon image est 1280x800 et ma taille d'écran est 1280x800. Il devrait dessiner parfaitement. Je crée un quadruple de la taille de l'écran et je règle la texture pour l'adapter au quadruple. Mais en ce moment, il dessine une texture carrée dans mon coin supérieur gauche de mon écran qui est hors échelle et pas assez grande.

Je ne sais pas pourquoi cela ne fonctionne pas, j'ai essayé d'écrire la taille de la texture plus grande lors du dessin et cela semble fonctionner en quelque sorte, mais je ne sais pas pourquoi cela n'a pas fonctionné lors du dessin sur un 1280x800 quad.

Comment créer un quad en plein écran?

Voici comment je le fais actuellement:

Voici mon OPENGL et mon code de configuration d'affichage:

    DisplayMode displayMode = null;
    DisplayMode[] modes = Display.getAvailableDisplayModes();

    for (int i = 0; i < modes.length; i++) {
        if (modes[i].getWidth() == World.SCREEN_WIDTH && modes[i].getHeight() == World.SCREEN_HEIGHT && modes[i].isFullscreenCapable()) {
            displayMode = modes[i];
        }
    }

    Display.setDisplayMode(displayMode);
    Display.setFullscreen(false);
    Display.create();

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, World.SCREEN_WIDTH, World.SCREEN_HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);

Voici mon code pour dessiner le quad texturé:

    background = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/menu/background.png")));

    glBindTexture(GL_TEXTURE_2D, background.getTextureID());
    glPushMatrix();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0); // Upper left

    glTexCoord2f(1, 0);
    glVertex2f(World.SCREEN_WIDTH, 0); // Upper right

    glTexCoord2f(1, 1);
    glVertex2f(World.SCREEN_WIDTH, World.SCREEN_HEIGHT); // Lower right

    glTexCoord2f(0, 1);
    glVertex2f(0, World.SCREEN_HEIGHT); // Lower left
    glEnd();
    glPopMatrix();
Louis Hong
la source
Des sons comme Slick2D créent une texture de taille deux. Voir slick.ninjacave.com/forum/viewtopic.php?p=26076
msell
@msell Alors comment couvrir mon écran 1280x800?
Louis Hong
2
Bien que cela puisse être un vrai problème pour vous, cela ressemble plus à un type de question "déboguer mon code", qui ne convient pas pour empiler le style Q / A d'échange.
Katu
En fait ce n'est pas le cas, c'est un vrai problème LWJGL. J'ai la réponse à la question. Mais je n'aime pas la façon dont les gens de haut rang distribuent des votes sans vraiment regarder le contenu @Katu
Louis Hong
1
Le dimensionnement à la puissance de deux ne devrait pas avoir d'importance car les texcoords utilisés étireront ou presseront la texture pour remplir l'écran. Il est plus probable que la matrice modelview n'est pas une identité - voir ma réponse ci-dessous.
Maximus Minimus

Réponses:

5

Une cause probable est que vous ne pouvez pas avoir d'identité dans votre matrice de visualisation de modèle lorsque vous venez de dessiner le quadruple plein écran. Cela peut arriver si vous dessinez autre chose avant le quad.

Je note à partir de votre code de configuration que vous basculez correctement le mode matriciel sur GL_MODELVIEW, mais ensuite vous ne faites pas d'appel glLoadIdentity après l'avoir fait (c'est OK car cela devrait être initialement l'identité, mais c'est une bonne habitude à prendre).

Lorsque vous dessinez votre quad, vous l'avez entouré d'un appel glPushMatrix / glPopMatrix. Cela ne suffit pas à lui seul pour créer une identité matricielle; de la spécification :

glPushMatrix pousse la pile de matrice actuelle d'une unité vers le bas, dupliquant la matrice actuelle . C'est-à-dire qu'après un appel glPushMatrix, la matrice en haut de la pile est identique à celle en dessous .

(C'est moi qui souligne.)

En d'autres termes, si votre matrice modelview précédente n'était pas une identité, alors après l'appel de glPushMatrix, la nouvelle matrice modelview ne sera pas non plus une identité.

La solution la plus simple consiste à ajouter un glLoadIdentity après votre appel glPushMatrix.

Maximus Minimus
la source
Wow, c'est très compliqué. Comment fonctionnent les matrices?
Louis Hong
1
Vous devriez chercher du matériel didactique pour cela - c'est très hors sujet pour ce site.
Maximus Minimus