2017-09-26 12 views
0

J'essaie de comprendre pourquoi je ne peux pas obtenir de textures à rendre avec LWJGL 3. J'ai essayé plusieurs façons de charger (PNGDecoder, STB, BufferedImage) et de rendre des textures. Mais le résultat est toujours un quad blanc.LWJGL Textures ne rend pas

Classe principale:

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(); 
} 

Méthode de chargement:

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; 
} 

Méthode de rendu:

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(); 
} 

La classe ModelTexture juste stocke certaines informations qui ne sont pas utilisés en ce moment et le bleu .png est un fichier png 16x16.

C'est la sortie que je reçois lors du démarrage du programme:

screenshot

Répondre

1

On dirait un incomplete texture.

Set GL_TEXTURE_MIN_FILTER à GL_NEAREST ou GL_LINEAR (valeur par défaut est GL_NEAREST_MIPMAP_LINEAR) ou télécharger une chaîne complète mipmap.

+0

Merci, cela a aidé, mais il y avait deux autres problèmes. 1. J'ai utilisé glTexImage2D avant glBindTexture 2. J'ai créé les fichiers PNG avec de la peinture sous Windows 8 et ils ne fonctionnent pas. Je ne peux même pas les ouvrir avec PS CS5 mais d'autres peuvent les ouvrir. – Wendelin