我希望能够将我的所有游戏素材像素渲染到openGL中的BufferedImage
,然后将其添加到BufferedImage
个被调用图像的列表中。然后在我的游戏循环中,我只是遍历每个BufferedImage
并将其绘制到屏幕上。但是,我试过环顾四周,无法找到解释如何做到这一点的任何地方。我不是Java的新手,但对OpenGL来说相对较新,并且过去几周一直在关注教程。 ThinMatrix Java LWJGL game development
是我一直关注的教程集。我亲自通过电子邮件发送了这个人,但我几周前没有回复。
目前我必须尝试呈现BufferedImage
:
private static void renderImage(BufferedImage image){
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 3); //4 for RGBA, 3 for RGB
for(int y = 0; y < image.getHeight(); y++){
for(int x = 0; x < image.getWidth(); x++){
int pixel = pixels[y * image.getWidth() + x];
buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component
buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component
buffer.put((byte) (pixel & 0xFF)); // Blue component
buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA
}
}
buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS
// You now have a ByteBuffer filled with the color data of each pixel.
// Now just create a texture ID and bind it. Then you can load it using
// whatever OpenGL method you want, for example:
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);
}
然后在主循环中:
for (BufferedImage image : imagesToRender){
renderImage(image);
}
我想要实现的是当我致电world.render(camera)
时,它会创建一个BufferedImage
并将其添加到主类中的图像列表中。 GUI也会这样做,但是在单独的图像上。然后在调用GUI和世界渲染方法之后,它循环遍历上面的图像列表并将它们呈现到屏幕上。原因显然是效率。如果我可以在将其绘制到屏幕之前将其渲染为BufferedImage
,我可以将其渲染为小BufferedImage
然后将其缩放以适应屏幕,从而降低渲染成本。
我的问题是,我不知道如何将所有纹理和对象以及地形填充到可以绘制到屏幕的2D BufferedImage
。
感谢您的帮助!
编辑1:
源代码链接:https://drive.google.com/file/d/0BxW4fcuviUOccnpwVG5qZG9qR2s/view?usp=sharing