我正在尝试用 Java 制作一个简单的游戏。
我想知道如何只使用 OpenGL 库读取 PNG 文件并在游戏中使用它。
任何人都可以提供可以实现此目的的任何代码吗?
最佳答案
您不能仅使用 OpenGL 加载图像。
您应该始终牢记,OpenGL 是一个图形 API,仅此而已:不是游戏框架,也不是可以为您执行 IO 操作的东西,等等。
您提供数据,OpenGL 负责繁重的工作。
回答您的问题:我个人在我的项目中使用 TWL 的 PNGDecoder。它快速、简单且易于使用。官方LWJGL wiki has an article about it ,检查一下。
这是一个关于如何使用它的简单示例:
try(BufferedInputStream is = new BufferedInputStream(new FileInputStream(filePath))){
//Create the PNGDecoder object and decode the texture to a buffer
PNGDecoder decoder = new PNGDecoder(is);
int width = decoder.getWidth(), height = decoder.getHeight();
ByteBuffer pixelData = BufferUtils.createByteBuffer(4*width*height);
decoder.decode(pixelData, 4*width, Format.RGBA);
pixelData.flip();
//Generate and bind the texture
int id = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
//Upload the buffer's content to the VRAM
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixelData);
//Apply filters
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}catch(IOException e){
e.printStackTrace();
}
稍后当您想要使用纹理时,只需执行 GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
在你渲染之前。我强烈建议使用某种数据结构来存储您的纹理以供重复使用(您应该只将纹理上传到 VRAM 一次,并在需要时使用它的 ID 多次使用它)。我个人使用自己的 Texture
类和一个TextureBank
静态类 HashMap<String, Texture>
其中键是纹理的名称,值是适当的 Texture
对象,用于存储纹理。
关于java - 使用纯 OpenGL 加载 PNG 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21399242/