使用纯OpenGL加载PNG文件

时间:2014-01-28 07:20:34

标签: java opengl png

我正在尝试用Java制作一个简单的游戏。

我想知道如何只使用OpenGL库读取PNG文件并在游戏中使用它。

任何人都可以提供任何可以实现此目的的代码吗?

3 个答案:

答案 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