2014-01-19 119 views
0

我正在製作一個平臺遊戲,我開始用默認的Java函數開發,但現在我切換到OpenGL的一切。我做了所有的事情,就像我總是用OpenGL做的一樣,而且我在其他OpenGL項目中做的很好。現在我的問題是,LWJGL/OpenGL以非常奇怪的方式縮放我的紋理。奇怪的LWJGL/OpenGL縮放紋理

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:糊狀物死亡,SO永遠。將代碼編輯到問題中。 – genpfault

+0

請在上面的帖子中發佈最小的相關片段。外部鏈接破壞,對於試圖幫助你的人來說更多的工作。 – user1118321

+0

@genpfault在帖子中編輯了最重要的代碼片段。你有什麼想法? – juliand665

回答

0

我從您發佈的內容中可以看到的唯一可能的問題是您在呈現前進行的縮放和平移。你不應該用你的投影矩陣來設置它。其他可能性是,如果您認爲維度不是真的1280x720,或者您未在未發佈的代碼中進一步修改其中一個矩陣。我會嘗試將模型視圖和投影矩陣設置爲單位矩陣,然後在繪製四邊形之前使用glOrtho,如上所述,並使用Display.getWidthDisplay.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像素。如果您在撥打glOrtho()時使用1280x720,我相信它可以解決問題。也就是說,您需要窗口的大小,而不是該調用中顯示的大小。

+0

'Display.getWidth()'和'Display.getHeight()'返回lwjgl顯示的寬度和高度,而不是整個屏幕。 – Alex