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:
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