LWJGL Textures not rendering
I am trying to figure out why I can't get any textures to render with LWJGL 3. I've tried multiple ways to load (PNGDecoder, STB, BufferedImage) and to render textures. But the result is always a white quad.
Main Class:
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();
}
Loading Method:
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;
}
Rendering Method:
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();
}
The ModelTexture class just stores some info that is not used right now and the blue.png is 16x16 png file.
This is the output that I get when starting the program:
Looks like an incomplete texture.
Set GL_TEXTURE_MIN_FILTER
to GL_NEAREST
or GL_LINEAR
(default is GL_NEAREST_MIPMAP_LINEAR
) or upload a complete mipmap chain.
下一篇: LWJGL纹理不渲染