Java OpenGL:将所有像素渲染为缓冲图像并绘制到屏幕?
我希望能够在openGL中将所有游戏项目像素渲染到Java OpenGL:将所有像素渲染为缓冲图像并绘制到屏幕?,java,opengl,render,lwjgl,bufferedimage,Java,Opengl,Render,Lwjgl,Bufferedimage,我希望能够在openGL中将所有游戏项目像素渲染到buffereImage,并将其添加到名为图像的buffereImage列表中。然后在我的游戏循环中,我简单地循环每个buffereImage并将其绘制到屏幕上。然而,我试着四处看看,却找不到任何地方可以解释如何做到这一点。我对Java并不陌生,但对OpenGL相对较新,在过去的几周里一直在学习教程ThinMatrix Java LWJGL游戏开发是我一直遵循的一套教程。我已经亲自给他发了电子邮件,但我没有收到回复,那是几周前的事了 这是我当前必
buffereImage
,并将其添加到名为图像的buffereImage
列表中。然后在我的游戏循环中,我简单地循环每个buffereImage
并将其绘制到屏幕上。然而,我试着四处看看,却找不到任何地方可以解释如何做到这一点。我对Java并不陌生,但对OpenGL相对较新,在过去的几周里一直在学习教程<代码>ThinMatrix Java LWJGL游戏开发是我一直遵循的一套教程。我已经亲自给他发了电子邮件,但我没有收到回复,那是几周前的事了
这是我当前必须尝试渲染的缓冲区图像
:
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);
}
我想要实现的是,当我调用world.render(camera)
时,它会创建一个buffereImage
,并将其添加到主类中的图像列表中。GUI也会这样做,但是在一个单独的图像上。然后,在调用GUI和world render方法之后,它会循环浏览上面的图像列表,并将它们渲染到屏幕上。原因显然是效率。如果我可以在将其绘制到屏幕之前将其渲染为BufferedImage
,我可以将其渲染为一个小的BufferedImage
,然后将其放大以适合屏幕,从而降低渲染成本
我的问题是,我不知道如何将我所有的纹理、对象和地形绘制到可以绘制到屏幕上的2DBuffereImage
谢谢你的帮助
编辑1:
链接到源代码:也许我误解了这一点,但人们通常使用OpenGL的原因是CPU上的渲染速度很慢。但是您想在CPU上渲染,然后将BuffereImage发送到OpenGL?您现在正在做的是以循环方式将BuffereImage上载到OpenGL,而不是渲染它们(这将是下一步)。你是否从头到尾都在学习教程?@Henkdeber是的,我从头到尾都在学习,但是在他的Sucawun引擎开发日志中,他在其中一个视频中解释了他如何将所有内容“屏幕外”渲染为2D图像,然后将其绘制到帧上。我在学习Cherno的2D游戏编程教程之前已经做过这项工作,但他将所有东西都转换为像素阵列,然后从中形成缓冲图像,最终结果被放大到帧大小。从而优化性能。我想知道是否有可能/值得使用openGLNo。不,与在CPU上绘图以及需要将所有像素传输到图形卡时所损失的性能相比,下采样带来的性能增益算不了什么。如果你想要一个坚实的性能提升,考虑切换到OpenGL的所有绘图。如果您不想这样做,只将最终纹理切换到屏幕操作将不会给您带来太多好处。
for (BufferedImage image : imagesToRender){
renderImage(image);
}