2017-09-26 200 views
0

我試圖弄清楚爲什麼我不能得到任何紋理與LWJGL 3.我已經試過多種方法來加載(PNGDecoder,STB,BufferedImage的),並渲染紋理渲染。但結果總是一個白色的四邊形。LWJGL紋理渲染不

主類:

public static void main(String[] args) 
{ 
    glfwInit(); 
    window = glfwCreateWindow(640, 480, "TEST", 0, 0); 
    glfwShowWindow(window); 
    glfwMakeContextCurrent(window); 
    GL.createCapabilities(); 

    GL11.glEnable(GL11.GL_TEXTURE_2D); 

    Loader loader = new Loader(); 
    TestRenderer renderer = new TestRenderer(); 
    ModelTexture texture = new ModelTexture(loader.loadTextureManual("blue")); 
    while(!glfwWindowShouldClose(window)) 
    { 
     glfwPollEvents(); 
     renderer.prepare(); 
     renderer.renderWithFixedFunctions(texture); 
     glfwSwapBuffers(window); 
     clearErrorBuffer(true); 
    } 
    loader.cleanUp(); 
} 

載入方法

public int loadTextureManual(String fileName) 
{ 
    String imagePath = "./res/" + fileName + ".png"; 
    try { 
     System.out.println("Trying to load texture \""+imagePath+"\""); 

     BufferedImage bi = ImageIO.read(new File(imagePath)); 
     int width = bi.getWidth(); 
     int height = bi.getHeight(); 

     int[] pixels_raw = new int[width*height]; 
     pixels_raw = bi.getRGB(0, 0, width, height, null, 0, width); 

     ByteBuffer pixels = BufferUtils.createByteBuffer(width*height*4); 

     for(int i = 0; i < width; i++) 
     { 
      for(int j = 0; j < height; j++) 
      { 
       int pixel = pixels_raw[i*width+j]; 
       pixels.put((byte) ((pixel >> 16) & 0xFF)); //RED 
       pixels.put((byte) ((pixel >> 8) & 0xFF)); //GREEN 
       pixels.put((byte) ((pixel) & 0xFF));  //BLUE 
       pixels.put((byte) ((pixel >> 24) & 0xFF)); //ALPHA 
      } 
     } 

     pixels.flip(); 

     byte[] info = new byte[pixels.capacity()]; 
     pixels.get(info); 

     int textureID = GL11.glGenTextures(); 

     if(GL.getCapabilities().GL_EXT_texture_filter_anisotropic) 
     { 
      float amount = Math.min(ANISOTROPIC_FILTERING_AMOUNT, GL11.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)); 
      GL11.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, amount); 
     } 
     else 
     { 
      System.out.println("Anisotropic filtering not supported!"); 
     } 

     GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0, 
       GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); 

     GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID); 

     return textureID; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     System.err.println("Couldn'l load texture \""+imagePath+"\""); 
     System.exit(-1); 
    } 
    return 0; 
} 

呈現方法:

public void renderWithFixedFunctions(ModelTexture texture) 
{ 
    glBindTexture(GL_TEXTURE_2D, texture.getID()); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); 
    glVertex2f(-0.5f, 0.5f); 

    glTexCoord2f(0, 1); 
    glVertex2f(0.5f, 0.5f); 

    glTexCoord2f(1, 1); 
    glVertex2f(0.5f, -0.5f); 

    glTexCoord2f(1, 0); 
    glVertex2f(-0.5f, -0.5f); 
    glEnd(); 
} 

的ModelTexture類只是存儲一些信息是不正確的,現在使用和藍色巴紐是16×16的PNG文件。

這是在啓動程序時,我得到的輸出:

screenshot

回答

1

看起來像一個incomplete texture

設置GL_TEXTURE_MIN_FILTERGL_NEARESTGL_LINEAR(默認爲GL_NEAREST_MIPMAP_LINEAR)或上傳完整的mipmap鏈。

+0

感謝那些幫助了,但是還有其他兩個問題。 1.我用glTexImage2D glBindTexture 2.之前,我已經創建了在Windows 8上油漆的PNG圖像和他們不工作。我甚至不能打開它們與PS CS5但其他可以打開它們。 – Wendelin