LWJGL Запутанные сопоставления текстур

Я работал над очень простой игрой и решил включить в нее несколько базовых текстур. Я экспериментировал с кодом, и по какой-то причине, я понятия не имею почему, я не могу правильно отображать текстуры. Прямо сейчас я просто пытаюсь сопоставить зеленый прямоугольник (файл .png размером 512 x 64) с нижней частью экрана размером 640 x 480. Предполагается, что этот зеленый прямоугольник представляет собой землю. Вот изображение моей неудачной попытки: Failure

Вот соответствующий код:

В созданном мной классе Boot я вызываю эту функцию:

    public void initGL() {
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, gameWidth, gameHeight, 0, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
    }

В созданном мной наземном классе я вызываю функцию рисования. Текстура загружается в класс Boot и устанавливается как защищенная переменная, которую я привязываю и использую в функции Ground.draw().

    public void draw() {
        this.texture.bind();
        GL11.glLoadIdentity();
        GL11.glTranslatef(0, 0, 0);
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glTexCoord2f(0, 0);
            GL11.glVertex2f(0, 480 - height);
            GL11.glTexCoord2f(1, 0);
            GL11.glVertex2f(640, 480 - height);
            GL11.glTexCoord2f(1, 1);
            GL11.glVertex2f(640, 480);
            GL11.glTexCoord2f(0, 1);
            GL11.glVertex2f(0, 480);
        GL11.glEnd();
   }   

Кроме того, если вы заметили выше, у меня есть вызов GL11.glTranslatef. Я могу получить свою текстуру земли в правильном положении, если просто сделаю 2-й аргумент для этой функции достаточно большим, чтобы сместить его дальше в направлении y, однако я не хочу делать это таким образом. Я действительно не знаю, как текстура вообще оказалась в этом месте, и я хотел бы выяснить, почему.


person gratsby    schedule 13.03.2013    source источник
comment
Итак, в чем проблема? Разве зеленый четырехугольник не имеет размера, который вы указали для вершин четырехугольника?   -  person Michael IV    schedule 13.03.2013
comment
Проблема в том, что вершины, которые у меня есть во втором блоке кода, показанном выше, должны (я думаю) сопоставляться с областью в самом низу окна. Верхняя левая точка равна 0, (480 — высота), где высота — это высота текстуры. Следующее - 640, 480 - высота, так что это, конечно, должно быть вверху справа. Следующие две показанные вершины явно являются нижним левым и нижним правым углами окна.   -  person gratsby    schedule 13.03.2013


Ответы (1)


Я думаю, что проблема с вашими матрицами:

    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, gameWidth, gameHeight, 0, 1, -1);

Я никогда не использовал фиксированный конвейер OpenGL, но то, что я вижу или на самом деле НЕ ВИЖУ, это то, где вы умножаете свои матрицы. Вы должны умножать матрицу модели вашего четырехугольника на матрицу проекции, которая является glOrtho(). ( glPushMatrix/glPopMatrix )

Итак, в вашем сценарии вы должны:

Push Ortho matrix.
   Push camera(view) matrix (if exists).
        Push Model Matrix.

        Pop  Model Matrix.
   Pop camera (view) matrix (if exists).
Pop Ortho matrix.

Если Орто никогда не меняется, я думаю, вам нужно нажать его только один раз. Также убедитесь, что вы принимаете во внимание изменения орто-координат, потому что в зависимости от настройки glOrtho() мировой центр будет отличаться от центра экрана. Обычно верхний левый или нижний левый угол.

Суть в следующем: хотя я вообще не рекомендую вам использовать старый и устаревший OpenGL, вы должны посмотреть, как правильно выполняются преобразования в многочисленных онлайн-ресурсах руководства. Также здесь

person Michael IV    schedule 13.03.2013