2014-01-19 3 views
0

Я создаю платформер, который я начал разрабатывать с помощью java-функций по умолчанию, но теперь я перехожу на OpenGL для всего. Я сделал все, как всегда, с OpenGL, и то, что я делал, отлично работает в других моих проектах OpenGL. Теперь моя проблема в том, что LWJGL/OpenGL очень сильно масштабирует мои текстуры.LWJGL/OpenGL масштабирование текстур weirdly

enter image description here

Это, кажется, связано с соотношением сторон моего экрана. (8: 5)

Мне уже пришлось перевернуть экран, чтобы сделать его правильным, но, как вы видите, текст работает нормально, это просто текстурированный прямоугольник, и он даже не на прямой дно.

Вот наиболее важные фрагменты из двух классов, которые фактически используют OpenGL: Metamorph.java (основной класс)

public static void initGL() 
    { 
      glMatrixMode(GL_PROJECTION); 
      glLoadIdentity(); 
      glOrtho(0, Display.getWidth(), 0, Display.getHeight(), 1, -1); 
      glEnable(GL_BLEND); 
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
      glMatrixMode(GL_MODELVIEW); 
      glClearColor(0, 0, 0, 1); 
      glDisable(GL_DEPTH_TEST); 
    } 

    public void render() 
    { 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

      glLoadIdentity(); 
      glScalef(1.0f, -1.0f, 1.0f); 
      glTranslatef(0f, -720f, 0f); 
      //glScalef(1280f/800, 720f/500, 1f); 

      renderer.render(); 

      Display.update(); 
      Display.sync(60); 
    } 

Renderer.java (рендеринг материал)

private void renderMainMenuWithGL() 
    { 
      //System.out.println("Main Menu!"); 

      glColor4f(1, 1, 1, 1); 

      try 
      { 
        Texture bg = loadTexture("mockery"); 
        bg.bind(); 
      } catch (Exception e) 
      { 
        e.printStackTrace(); 
      } 

      //drawQuad(0, 0, 1280, 720, 0, 0, 1280, 720); 
      glPushMatrix(); 
      { 
        glBegin(GL_QUADS); 
        glTexCoord2f(0, 0);glVertex2f(0, 0); 
        glTexCoord2f(0, 1);glVertex2f(0, 720); 
        glTexCoord2f(1, 1);glVertex2f(1280, 720); 
        glTexCoord2f(1, 0);glVertex2f(1280, 0); 
        glEnd(); 
      } 
      glPopMatrix(); 

      TrueTypeFont f = loadFont(MAINFONT, Font.PLAIN, 50); 
      TrueTypeFont fb = loadFont(MAINFONT, Font.PLAIN, 48); 

      int sel = -1; 
      if(Mouse.getX() > 1000 && Mouse.getX() < 1240 && Mouse.getY() > 282.5F && Mouse.getY()< 737.5F) 
        sel = Math.round((Mouse.getY() - 337.5F)/75F); 

      if(sel == 0) 
        drawStringRight(fb, 1240, 350, "Story", new Color(0xff516b6b)); 
      else 
        drawStringRight(f, 1240, 350, "Story", new Color(0xff516b6b)); 
    } 

    private void drawStringRight(TrueTypeFont f, int x, int y, String s, Color c) 
    { 
      glPushMatrix(); 
      f.drawString(x-f.getWidth(s), y, s, c); 
      glPopMatrix(); 
    } 

Я нахожусь также открыта для совета по файловой структуре/что я сделал неправильно в другом месте, но имейте в виду, что это сильно WIP

+0

-1: Pastebins die, SO is forever. Измените код в вопросе. – genpfault

+0

Пожалуйста, разместите самый маленький соответствующий фрагмент в своем сообщении выше. Наружные ссылки ломаются и больше работают для людей, которые пытаются вам помочь. – user1118321

+0

@genpfault Отредактировано наиболее важные фрагменты в сообщении. У тебя есть идеи? – juliand665

ответ

0

Единственная возможная проблема, которую я вижу из того, что вы опубликовали, - это масштабирование и перевод, выполняемый до рендеринга. Вам не нужно делать это с настройкой матрицы проекций так, как есть. Другие возможности заключаются в том, что либо размеры на самом деле не являются 1280x720, как вы думаете, либо вы изменили одну из матриц в коде, который вы еще не опубликовали. Я постарался бы установить как матрицу модели, так и проекционные матрицы в единую матрицу, а затем использовать glOrtho, как вы уже выше, прежде чем рисовать свой квад, и использовать и Display.getHeight вместо 1280/720 для вершинных коордов.

Это прекрасно работает для меня:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, Display.getWidth(), 0, Display.getHeight(), 1, -1); 
glBegin(GL_QUADS); 
glTexCoord2f(0,0); 
glVertex2i(0, 0); 
glTexCoord2f(1,0); 
glVertex2i(Display.getWidth(), 0); 
glTexCoord2f(1,1); 
glVertex2i(Display.getWidth(), Display.getHeight()); 
glTexCoord2f(0,1); 
glVertex2i(0, Display.getHeight()); 
glEnd(); 

Если это все еще не работает, убедитесь, что окно просмотра также устанавливается на весь экран: glViewport(0,0,Display.getWidth(),Display.getHeight()).

Как я заметил, вы используете glPushMatrix() и glPopMatrix до и после чертежа, который ничего не делает и не нужен. Push и pop используются для сохранения текущей матрицы проекций или модели, а затем перезагружают ее позже, чтобы вы могли применять преобразования между ними и отменить их, когда это необходимо.

0

Вы устанавливаете матрицу проекций так, чтобы координаты углов окна равны (0,0) - (1680, 1050), и они отображаются в область, которая покрывает 1280x800 пикселей. Затем вы рисуете изображение 1280x720, поэтому координаты экрана изображения достигают всего 800x500 пикселей. Если вы используете 1280x720 в своем вызове glOrtho(), я считаю, что он исправит проблему. То есть вы хотите размер окна, а не размер дисплея в этом вызове.

+0

'Display.getWidth()' и 'Display.getHeight()' возвращает ширину и высоту дисплея lwjgl, а не весь экран. – Alex

Смежные вопросы