java - 使用纯 OpenGL 加载 PNG 文件

标签 java opengl png

我正在尝试用 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/

相关文章:

java - Android 日期格式 : How to convert date in alphabets

java - 我如何正确地做多个闪屏android

c++ - OpenGL:glDrawArrays 有效但 glDrawElements 无效

php - 来自 base64 代码的 imagecreatefrompng()?

c - 从C中的png文件中读取颜色值

Java Card 从数组中读取数据

java - 重命名文件而不使用 renameTo() - Java

c++ - OpenGL 中即时模式的性能问题

opengl - 在窗口调整大小时保持 2D 对象的纵横比

java - 使用 ImageWriter 保存为 JPEG 时将 Alpha channel 转换为白色