Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL:将所有像素渲染为缓冲图像并绘制到屏幕?_Java_Opengl_Render_Lwjgl_Bufferedimage - Fatal编程技术网

Java OpenGL:将所有像素渲染为缓冲图像并绘制到屏幕?

Java OpenGL:将所有像素渲染为缓冲图像并绘制到屏幕?,java,opengl,render,lwjgl,bufferedimage,Java,Opengl,Render,Lwjgl,Bufferedimage,我希望能够在openGL中将所有游戏项目像素渲染到buffereImage,并将其添加到名为图像的buffereImage列表中。然后在我的游戏循环中,我简单地循环每个buffereImage并将其绘制到屏幕上。然而,我试着四处看看,却找不到任何地方可以解释如何做到这一点。我对Java并不陌生,但对OpenGL相对较新,在过去的几周里一直在学习教程ThinMatrix Java LWJGL游戏开发是我一直遵循的一套教程。我已经亲自给他发了电子邮件,但我没有收到回复,那是几周前的事了 这是我当前必

我希望能够在openGL中将所有游戏项目像素渲染到
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
,然后将其放大以适合屏幕,从而降低渲染成本

我的问题是,我不知道如何将我所有的纹理、对象和地形绘制到可以绘制到屏幕上的2D
BuffereImage

谢谢你的帮助

编辑1:


链接到源代码:

也许我误解了这一点,但人们通常使用OpenGL的原因是CPU上的渲染速度很慢。但是您想在CPU上渲染,然后将BuffereImage发送到OpenGL?您现在正在做的是以循环方式将BuffereImage上载到OpenGL,而不是渲染它们(这将是下一步)。你是否从头到尾都在学习教程?@Henkdeber是的,我从头到尾都在学习,但是在他的Sucawun引擎开发日志中,他在其中一个视频中解释了他如何将所有内容“屏幕外”渲染为2D图像,然后将其绘制到帧上。我在学习Cherno的2D游戏编程教程之前已经做过这项工作,但他将所有东西都转换为像素阵列,然后从中形成缓冲图像,最终结果被放大到帧大小。从而优化性能。我想知道是否有可能/值得使用openGLNo。不,与在CPU上绘图以及需要将所有像素传输到图形卡时所损失的性能相比,下采样带来的性能增益算不了什么。如果你想要一个坚实的性能提升,考虑切换到OpenGL的所有绘图。如果您不想这样做,只将最终纹理切换到屏幕操作将不会给您带来太多好处。
        for (BufferedImage image : imagesToRender){
            renderImage(image);
        }