¿Cómo dibujo una textura de resolución completa en una ventana de la misma resolución?

8

Mi imagen es 1280x800 y el tamaño de mi pantalla es 1280x800. Debería dibujar perfectamente. Estoy creando un quad del tamaño de la pantalla y estableciendo la textura para que se ajuste al quad. Pero ahora dibuja una textura cuadrada en la esquina superior izquierda de mi pantalla que está fuera de escala y no es lo suficientemente grande.

No sé por qué no funciona, he intentado escribir el tamaño de la textura más grande al dibujar y parece funcionar más o menos, pero no sé por qué no funcionó al dibujar en un 1280x800 quad.

¿Cómo creo un quad de pantalla completa?

Así es como lo estoy haciendo actualmente:

Este es mi OPENGL y el código de configuración de pantalla:

    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);

Este es mi código para dibujar el quad con textura:

    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
fuente
Parece que Slick2D crea una textura que tiene un tamaño de potencia de dos. Ver slick.ninjacave.com/forum/viewtopic.php?p=26076
msell
@msell Entonces, ¿cómo cubro mi pantalla de 1280x800?
Louis Hong
2
Si bien esto podría ser un verdadero problema para usted, esto parece ser más como una pregunta de tipo "depurar mi código", que no se ajusta al estilo Q / A de cambio de pila.
Katu
En realidad no lo es, este es un verdadero problema de LWJGL. Tengo la respuesta a la pregunta. Pero no me gusta cómo las personas con alto rango dan votos sin mirar realmente el contenido @Katu
Louis Hong
1
El tamaño de potencia de dos no debería importar, ya que los códigos de texto utilizados estirarán o exprimirán la textura para llenar la pantalla. Lo más probable es que la matriz modelview no sea identidad; vea mi respuesta a continuación.
Maximus Minimus

Respuestas:

5

Una causa probable es que es posible que no tenga identidad en su matriz de vista de modelo cuando venga a dibujar el quad de pantalla completa. Esto podría suceder si estás dibujando algo más antes del quad.

Observo en su código de configuración que cambia correctamente el modo de matriz a GL_MODELVIEW, pero luego no hace una llamada glLoadIdentity después de hacerlo (esto está bien, ya que inicialmente debería ser identidad, pero es un buen hábito entrar).

Al dibujar su quad, lo tiene rodeado por una llamada glPushMatrix / glPopMatrix. Esto por sí solo no es suficiente para crear una identidad matricial; de la especificación :

glPushMatrix empuja la pila de matriz actual hacia abajo en uno, duplicando la matriz actual . Es decir, después de una llamada a glPushMatrix, la matriz en la parte superior de la pila es idéntica a la que está debajo .

(Mi énfasis)

En otras palabras, si su matriz anterior de modelview no era identidad, luego de la llamada glPushMatrix, la nueva matriz de modelview tampoco será identidad.

La solución más simple es agregar una glLoadIdentity después de su llamada a glPushMatrix.

Maximus Minimus
fuente
Wow, esto es muy complicado. ¿Cómo funcionan las matrices?
Louis Hong
1
Debería buscar algún material de tutorial para eso: está muy fuera de tema para este sitio.
Maximus Minimus