0

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

在这个特定的例子中,我有一个类 Box 代表一个盒子,但我用图像绘制它,从而制作边框。我有 9 张图像,一张用于中心(那只是一张 1 像素宽的纯色图像),4 张用于侧面,4 张用于角落。我将所有这些图像放在一个 BufferedImage 数组中,它是静态的,因为所有盒子都是一样的。然后,每个盒子都有一个全局的BufferedImage,我在里面画了盒子,这个过程真的很慢,因为我必须在盒子的每个部分都画一个图像。然后,在真正的绘制方法(接收图形 g)中,我只是将 BufferedImage 绘制在正确的位置。由于盒子的大小在创建后并没有改变,我只需要在构造函数中“创建”一次盒子图像。

我不知道如何用 LWJGL 做到这一点,因为 gl_ 方法(​​glBegin()、glVertex2i())总是会在屏幕上绘制,即使我从未指定过。那么如何绘制图像以及如何将其存储在内存中(也使用 BufferedImage),以及如何在需要时将其绘制在屏幕上?我发现 LWJGL 使用纹理,我将 BufferedImage 的第一个静态数组设为纹理的静态数组,然后正确保存其中的 9 个纹理中的每一个。这是正确的方法吗?全局BufferedImage呢,应该是全局Texture吗?在那种情况下,如何在纹理上“绘制”?

4

3 回答 3

1

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

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

不过我很好奇,你的盒子看起来像什么,它不能用正常的纹理绘制?也许有一个更简单的方法来解决它。

于 2012-06-23T17:36:51.910 回答
1

看看这个LWJGL 纹理教程,来自他们的 wiki。在这个例子中,他们使用了Slick-Util 库,这使得从图像创建纹理变得更加容易。


或者,您可以自己生成纹理:

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);

Aaaaaand 看到这个我之前写过的 convertImageData() 的答案。(在他的代码中有几行可以删除)

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

于 2012-06-23T17:41:31.973 回答
1

在 OpenGL 中,缩放非常便宜。你不需要预先生成任何东西。您可以将所有图像放在一个纹理中,并在将它们绘制到屏幕时使用纹理映射来正确放置和缩放它们。

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

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

于 2012-06-23T17:48:13.090 回答