【问题标题】:Load a PNG file with pure OpenGL使用纯 OpenGL 加载 PNG 文件
【发布时间】:2014-02-19 09:02:22
【问题描述】:

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

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

谁能提供任何可以完成此任务的代码?

【问题讨论】:

  • OpenGL 不是 ImageLoader。但是,您可以使用内置的 Java 类 ImageIO...

标签: java opengl png


【解决方案1】:

您不能仅使用 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 对象,用于存储纹理。

【讨论】:

  • 嗨,请在这个问题上评价 + 这个网站阻止我发送 2 个减分点的问题 tyhttp://stackoverflow.com/questions/21420706/how-i-can-work-programaticly-with -游戏中的法术效果
【解决方案2】:

您无法使用单个 API 调用直接加载纹理。但是,您可以通过 ImageIO 加载 BufferedImage,然后将其转换为 OpenGL 纹理。示例源代码可以在这里找到TextureLoader

【讨论】:

    【解决方案3】:

    如果您只想将 openGL 与一些 Java 代码一起使用而没有额外的库,这实际上是可能的。

    您可以在此处找到整个 png 格式的文档:PNG Specifiaction

    如果省略 CRC 并使用 Java 的 Inflater,则只需解码文件的块并以相反的顺序应用图像的过滤器。

    但是自己编写加载程序通常是一件棘手的事情。我实际上写了一个 png-loader 但它只支持 rgb 和 rgba 图像。你可以在这里找到我的加载器的代码:file

    【讨论】:

      猜你喜欢
      • 2014-02-28
      • 2014-01-03
      • 2011-02-09
      • 2017-02-25
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多