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();
Respostas:
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 :
(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.
fonte