Como faço para desenhar uma textura de resolução total em uma janela da mesma resolução?

8

Minha imagem é 1280x800 e o tamanho da tela é 1280x800. Deve desenhar perfeitamente. Estou criando um quad do tamanho da tela e definindo a textura para caber no quad. Mas agora ele desenha uma textura quadrada no canto superior esquerdo da tela que está fora de escala e não é grande o suficiente.

Não sei por que não funciona, tentei escrever o tamanho da textura maior ao desenhar e parece funcionar mais ou menos, mas não sei por que não funcionou ao desenhar em um Quad de 1280x800.

Como crio um quad em tela cheia?

Aqui está como eu estou fazendo isso atualmente:

Este é o meu OPENGL e o código de configuração da tela:

    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 é o meu código para desenhar o quad texturizado:

    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
fonte
Parece que o Slick2D cria uma textura com o tamanho de uma potência de dois. Veja slick.ninjacave.com/forum/viewtopic.php?p=26076
msell
@msell Então, como cobrir minha tela de 1280x800?
Louis Hong
2
Embora isso possa ser um verdadeiro problema para você, isso parece mais com o tipo de pergunta "depurar meu código", que não se encaixa no estilo de Q / A da troca de pilhas.
Katu
Na verdade, não é, esse é um verdadeiro problema do LWJGL. Eu tenho a resposta para a pergunta. Mas eu não gosto de como as pessoas com alta classificação sai por aí dando para baixo de votos, com a realmente olhar para o @Katu conteúdo
Louis Hong
11
O tamanho de dois em dois não deve importar, pois os cabos de texto usados ​​esticam ou comprimem a textura para preencher a tela. Mais provável é que a matriz modelview não seja identidade - veja minha resposta abaixo.
Maximus Minimus

Respostas:

5

Uma causa provável é que você pode não ter identidade na matriz do modelview ao desenhar o quad em tela cheia. Isso pode acontecer se você estiver desenhando outra coisa antes do quad.

Percebo no seu código de configuração que você alterna corretamente o modo de matriz para GL_MODELVIEW, mas não faz uma chamada glLoadIdentity depois de fazer isso (tudo bem, pois deve ser inicialmente identidade, mas é um bom hábito).

Ao desenhar seu quad, você o encontra cercado por uma chamada glPushMatrix / glPopMatrix. Isso por si só não é suficiente para criar uma identidade matricial; da especificação :

O glPushMatrix empurra a pilha da matriz atual para baixo em um, duplicando a matriz atual . Ou seja, após uma chamada glPushMatrix, a matriz no topo da pilha é idêntica à abaixo dela .

(Minha ênfase.)

Em outras palavras, se sua matriz modelview anterior não era identidade, depois da chamada glPushMatrix, a nova matriz modelview também não será identidade.

A correção mais simples é adicionar um glLoadIdentity após sua chamada glPushMatrix.

Maximus Minimus
fonte
Uau, isso é muito complicado. Como as matrizes funcionam?
Louis Hong
11
Você deve procurar algum material tutorial para isso - é muito estranho para este site.
Maximus Minimus