2012-03-05 76 views
1

我遇到了一個簡單的基於tile的基於引擎的問題,我正在處理這個問題。在我的家用電腦上(Windows 7 64bit,jogl 1.1.1),紋理可以正確地綁定到瓷磚上,但是在我的筆記本電腦上(Windows Vidta 32bit,jogl 1.1.1),它們看起來很壞。紋理圖集在另一臺計算機上呈現出不同的結果

精靈圖像是600x100(每個精靈都是100x100)。

這是我正在使用的textureManager類。

public class TextureManager { 

    private static Texture textureAtlas; 
    private static Map<String, TextureCoords> locations; 
    private static String imageName; 

    public TextureManager() { 

     locations = new HashMap<String, TextureCoords>(); 
    } 

    public static void loadAtlas(String name) { 

     if(textureAtlas != null) { 

      if(imageName == name) return; 

      textureAtlas.dispose(); 
     } 

     imageName = name; 

     try { 

      textureAtlas = TextureIO.newTexture(new File("textures/" + name + ".png"), true); 
     } 
     catch (GLException e) { 

      e.printStackTrace(); 
     } 
     catch (IOException e) { 

      e.printStackTrace(); 
     } 

     setAtlasLocations(); 
    } 

    private static void setAtlasLocations() { 

     locations.put("blank", textureAtlas.getSubImageTexCoords(0, 0, 100, 100)); 
     locations.put("tree1", textureAtlas.getSubImageTexCoords(100, 0, 200, 100)); 
     locations.put("tree2", textureAtlas.getSubImageTexCoords(200, 0, 300, 100)); 
     locations.put("tree3", textureAtlas.getSubImageTexCoords(300, 0, 400, 100)); 
     locations.put("rock", textureAtlas.getSubImageTexCoords(400, 0, 500, 100)); 
    } 

    public static void bindTexture() { 

     textureAtlas.bind(); 
    } 

    public static TextureCoords getCoords(String name) { 

     return locations.get(name); 
    } 
} 

這是渲染代碼:

public void draw(GL gl) { 

     gl.glEnable(GL.GL_TEXTURE_2D); 

     TextureManager.bindTexture(); 

     int width = map.width(); 
     int height = map.height(); 

     float x = InterfaceManager.mapX; 
     float y = InterfaceManager.mapY; 

     gl.glTranslatef(x, y - height, 0); 

     gl.glBegin(GL.GL_QUADS); 

     gl.glNormal3f(0.0f, 0.0f, 1.0f); 
     gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

     for(int w = 0; w < width; w++) { 

      for(int h = 0; h < height; h++) { 

       TextureCoords coords = getCoord(map.getTileType(w, h)); 

       gl.glTexCoord2f(coords.left(), coords.bottom()); 
       gl.glVertex3i(w, h, 0); 
       gl.glTexCoord2f(coords.right(), coords.bottom()); 
       gl.glVertex3i(w+1, h, 0); 
       gl.glTexCoord2f(coords.right(), coords.top()); 
       gl.glVertex3i(w+1, h+1, 0); 
       gl.glTexCoord2f(coords.left(), coords.top()); 
       gl.glVertex3i(w, h+1, 0); 
      } 
     } 

     gl.glEnd(); 

     gl.glTranslatef(-x, -y + height, 0); 

     gl.glDisable(GL.GL_TEXTURE_2D); 
    } 

    private TextureCoords getCoord(int tileType) { 

     if(tileType == 0) return TextureManager.getCoords("blank"); 
     else if(tileType == 1) return TextureManager.getCoords("rock"); 
     else if(tileType == 2) return TextureManager.getCoords("tree1"); 
     else if(tileType == 3) return TextureManager.getCoords("tree2"); 
     else if(tileType == 4) return TextureManager.getCoords("tree3"); 
     else return TextureManager.getCoords("blank"); 
    } 

我知道OpenGL的應該是平臺獨立的,因爲我使用的兩個OpenGL的相同版本,我假設有可能我的代碼中存在一個錯誤。

希望有人更有經驗的人可以幫助我解決這個問題。謝謝!

編輯:這是一張扭曲結果的圖片。

screwedTexture

沿着頂部和右側的樹木其實應該是在下面的精靈石。

這是精靈文件:

enter image description here

+0

他們如何看起來壞了?你可以放一個圖像嗎?這將有助於診斷。 – Tim 2012-03-05 05:32:46

+0

我編輯了一些圖片! – Mick 2012-03-05 05:39:28

+0

對不起,沒有想到。如果你目前沒有檢查它,可能會拋出glGetError?我不知道這是否會捕捉任何東西,但有時它可以幫助您找出奇怪的方式混淆渲染的時髦問題。 – Tim 2012-03-05 05:45:04

回答

2

自動生成的貼圖通過OpenGL的是造成問題的原因。將下面的行更改爲不允許自動映射修復問題。

textureAtlas = TextureIO.newTexture(new File("textures/" + name + ".png"), false); 

如果有人想,我應該如何創建我的精靈文件發表評論,允許自動紋理映射,或者如果這甚至應該是,請你:)

隨着mipmapping貼圖了,因爲我的移動周圍的人物,某些瓷磚在他們下面會出現黑色線條。我必須弄清楚如何使精靈圖像mipmap-able。

編輯:使文件廣場和2的冪。

相關問題