如何使用LWJGL将图像保存在内存中?

时间:2012-06-23 17:12:26

标签: java image opengl textures lwjgl

我一直在使用java常规图形设备,awt和swing东西,使用Graphics,Graphics2D等一段时间,然后开始观看一系列关于LWJGL的教程。我非常喜欢并决定在该系统中重做我的一个游戏;我想,因为我已经有了逻辑,所以很容易。我刚遇到一个概念问题。

在这个特定的情况下,我有一个代表一个盒子的类Box,但我用图像绘制它,从而制作边框。我有9个图像,一个用于中心(这只是一个普通颜色的1像素宽度图像),4个用于边,4个用于角。我把所有这些图像放在一个BufferedImage数组中,这是静态的,因为它对所有盒子来说都是一样的。然后,每个盒子都有一个全局的BufferedImage,我画了一个盒子,这是一个非常慢的过程,因为我必须在盒子的每个部分画一个图像。然后,在真正的绘制方法(收到图形g)中,我只是将BufferedImage绘制在正确的位置。由于盒子的大小在创建后没有改变,我只需要在构造函数中“创建”一次盒子图像。

我无法想象如何使用LWJGL,因为gl_方法(glBegin(),glVertex2i())将始终在屏幕上绘制,即使我从未指定过。那么我如何绘制图像以及如何将其存储在内存中(也使用BufferedImage),以及如何在我想要的时候在屏幕上绘制它?我发现LWJGL使用纹理,我将BufferedImage的第一个静态数组作为Texture的静态数组,然后正确地保存了9个纹理中的每一个。这是正确的方法吗?那么全局BufferedImage呢,它应该是一个全局纹理吗?在这种情况下,如何“绘制”纹理?

3 个答案:

答案 0 :(得分:1)

您正在寻找的技术通常称为“渲染到纹理”(RTT)。您创建一个opengl帧缓冲区,为其附加纹理,绑定帧缓冲区,然后发出正常的绘制调用。使用framebuffer绑定,绘制调用将直接绘制到纹理中。然后取消绑定帧缓冲区并将纹理用作普通纹理。

通过这些搜索字词,我确信您可以在互联网上找到有关如何执行此操作的教程。

我只是好奇,你的盒子看起来是什么样的,它不能用普通的纹理绘制?也许有一种更容易的方法。

答案 1 :(得分:1)

从他们的wiki中查看此LWJGL texture tutorial。 在这个例子中,他们使用Slick-Util Library,这使得从图像创建纹理变得更加容易。


或者你可以自己生成纹理:

BufferedImage bufferedImage = ...;
ByteBuffer textureBuffer = convertImageData(bufferedImage);

int texture = glGenTextures();
glBindTexture(GL_TEXTURE_2D, texture);

int pixelFormat;
if (bufferedImage.getColorModel().hasAlpha()) {
    pixelFormat = GL_RGBA;
} else {
    pixelFormat = GL_RGB;
}

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
        bufferedImage.getWidth(), bufferedImage.getHeight(), 0,
        pixelFormat, GL_UNSIGNED_BYTE, textureBuffer);

Aaaaa和我之前写的convertImageData()见this answer。 (在他的代码中有几行你可以删除)

绘制纹理:参见LWJGL Space Invaders的第97行。

答案 2 :(得分:1)

在OpenGL中,缩放比较便宜。您不需要预先生成任何内容。您可以将所有图像放在一个纹理中,并使用纹理贴图在将它们绘制到屏幕时正确放置和缩放它们。

如果您已经使用BufferedImage获得解决方案,请保持这种状态。在GPU上生成此图像不会为您节省太多时间。使用awt生成图像,从中创建纹理并使用LWJGL将其绘制到屏幕上。

如果您真的想这样做,可以使用glCopyPixels将内容从屏幕保存到纹理。但我不会从那开始学习OpenGL。避免将图像传输到主存储器(将其保留在纹理而不是BufferedImage中),在CPU和GPU之间发送数据可能非常慢。