Как нарисовать текстуру с полным разрешением в окне того же разрешения?

8

Мое изображение 1280x800, а мой размер экрана 1280x800. Это должно нарисовать отлично. Я создаю четырехугольник размером с экран и настраиваю текстуру так, чтобы она соответствовала квадрату. Но сейчас он рисует квадратную текстуру в левом верхнем углу экрана, которая не в масштабе и недостаточно велика.

Я не знаю, почему это не работает, я пытался написать размер текстуры больше при рисовании, и кажется, что это работает, но я не знаю, почему это не работает при рисовании на 1280x800 квад.

Как мне создать полноэкранный квад?

Вот как я сейчас это делаю:

Это мой OPENGL и код настройки дисплея:

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

Это мой код для рисования текстурированного четырехугольника:

    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();
Луи Хонг
источник
Похоже, Slick2D создает текстуру, которая имеет степень двойки. См. Slick.ninjacave.com/forum/viewtopic.php?p=26076
msell
@msell Тогда как мне закрыть мой экран 1280x800?
Луи Хонг,
2
Хотя это может быть реальной проблемой для вас, похоже, это больше похоже на вопрос типа «отладить мой код», который не подходит для стекового обмена Q / A.
Кату
На самом деле это не так, это настоящая проблема с LWJGL. У меня есть ответ на вопрос. Но мне не нравится, как люди с высоким рангом раздают голоса, не обращая внимания на контент @Katu
Louis Hong
1
Степень двойного размера не должна иметь значения, поскольку используемые текстовые координаты будут либо растягивать, либо сжимать текстуру, чтобы заполнить экран. Более вероятно, что матрица вида модели не идентична - см. Мой ответ ниже.
Максимус Минимус

Ответы:

5

Вероятной причиной является то, что у вас может не быть идентичности в матрице вида модели, когда вы рисуете полноэкранный квад. Это может произойти, если вы рисуете что-то еще до четверки.

Из вашего установочного кода я отмечаю, что вы правильно переключаете матричный режим на GL_MODELVIEW, но после этого вы не делаете вызов glLoadIdentity (это нормально, так как изначально это должна быть идентификация, но это хорошая привычка, в которую можно войти).

Когда вы рисуете свой квад, вы окружаете его вызовом glPushMatrix / glPopMatrix. Этого само по себе недостаточно для того, чтобы сделать идентичность матрицы; из спецификации :

glPushMatrix сдвигает текущий стек матрицы на единицу, дублируя текущую матрицу . То есть после вызова glPushMatrix матрица сверху стека идентична матрице под ней .

(Мой акцент.)

Другими словами, если ваша предыдущая матрица вида модели не была идентичностью, то после вызова glPushMatrix новая матрица вида модели также не будет идентичностью.

Самое простое решение - добавить glLoadIdentity после вызова glPushMatrix.

Максимус Минимус
источник
Вау, это очень сложно. Как работают матрицы?
Луи Хонг,
1
Вы должны найти какой-то учебный материал для этого - это очень не по теме для этого сайта.
Максимус Минимус