I have fix the problem and following is how I did it,
The binding code in RenderEngine:
public int bindTexture(String location)
{
BufferedImage texture;
File il = new File(location);
if(textureMap.containsKey(location))
{
glBindTexture(GL_TEXTURE_2D, textureMap.get(location));
return textureMap.get(location);
}
try
{
texture = ImageIO.read(il);
}
catch(Exception e)
{
texture = missingTexture;
}
try
{
int i = glGenTextures();
ByteBuffer buffer = BufferUtils.createByteBuffer(texture.getWidth() * texture.getHeight() * 4);
Decoder.decodePNGFileToBuffer(buffer, texture);
glBindTexture(GL_TEXTURE_2D, i);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.getWidth(), texture.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
textureMap.put(location, i);
return i;
}
catch(Exception e)
{
e.printStackTrace();
}
return 0;
}
And the PNG decoder method:
public static void decodePNGFileToBuffer(ByteBuffer buffer, BufferedImage image)
{
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
for(int y = 0; y < image.getHeight(); y++)
{
for(int x = 0; x < image.getWidth(); x++)
{
int pixel = pixels[y * image.getWidth() + x];
buffer.put((byte) ((pixel >> 16) & 0xFF));
buffer.put((byte) ((pixel >> 8) & 0xFF));
buffer.put((byte) (pixel & 0xFF));
buffer.put((byte) ((pixel >> 24) & 0xFF));
}
}
buffer.flip();
}
I hope this helps anybody with the same problem
P.S. textureMap is just a HashMap with String as the key and a Integer as the value
You’ve got the order completely wrong. You need to:
In your drawing code you’re calling the whole texture load, which is inefficient, also you’re recreating a new texture name each time. Use a map to map texture filenames to an ID, and only if no ID has been assigned yet Gen/Bind/TexImage the texture. Otherwise, just Bind it.