【发布时间】:2014-02-19 09:02:22
【问题描述】:
我正在尝试用 Java 制作一个简单的游戏。
我想知道如何仅使用 OpenGL 库读取 PNG 文件并在游戏中使用它。
谁能提供任何可以完成此任务的代码?
【问题讨论】:
-
OpenGL 不是 ImageLoader。但是,您可以使用内置的 Java 类
ImageIO...
我正在尝试用 Java 制作一个简单的游戏。
我想知道如何仅使用 OpenGL 库读取 PNG 文件并在游戏中使用它。
谁能提供任何可以完成此任务的代码?
【问题讨论】:
ImageIO...
您不能仅使用 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 类和带有静态 HashMap<String, Texture> 的 TextureBank 类,其中键是纹理的名称,值是适当的 Texture 对象,用于存储纹理。
【讨论】:
您无法使用单个 API 调用直接加载纹理。但是,您可以通过 ImageIO 加载 BufferedImage,然后将其转换为 OpenGL 纹理。示例源代码可以在这里找到TextureLoader
【讨论】:
如果您只想将 openGL 与一些 Java 代码一起使用而没有额外的库,这实际上是可能的。
您可以在此处找到整个 png 格式的文档:PNG Specifiaction
如果省略 CRC 并使用 Java 的 Inflater,则只需解码文件的块并以相反的顺序应用图像的过滤器。
但是自己编写加载程序通常是一件棘手的事情。我实际上写了一个 png-loader 但它只支持 rgb 和 rgba 图像。你可以在这里找到我的加载器的代码:file
【讨论】: