我正在尝试用Java制作一个简单的游戏。
我想知道如何只使用OpenGL库读取PNG文件并在游戏中使用它。
任何人都可以提供任何可以实现此目的的代码吗?
答案 0 :(得分:3)
您无法仅使用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
对象,存储纹理。
答案 1 :(得分:2)
您无法使用单个API调用直接加载纹理。但是,您可以通过ImageIO加载BufferedImage,然后将其转换为OpenGL纹理。可在此处找到示例源代码TextureLoader
答案 2 :(得分:1)
如果您只想将openGL与某些Java代码一起使用而没有额外的库,那么这实际上是可行的。
您可以在此处找到整个png格式的文档:PNG Specifiaction
如果省略CRC并使用Inflater of Java,则只需解码文件的块并以相反的顺序应用图像的过滤器。
但是,自己编写加载程序通常是件棘手的事情。我实际上写了一个png-loader,但它只支持rgb和rgba图像。你可以在这里找到我的装载机的代码:file