代码之家  ›  专栏  ›  技术社区  ›  DJClayworth

使用JOGL在屏幕外绘图

  •  4
  • DJClayworth  · 技术社区  · 17 年前

    作为一个更大项目的一部分,我试图使用JOGL实现一个将3D渲染导出为位图格式的工具。我们通过创建一个GLJPanel并绘制我们想要的场景,然后提取位图来实现这一点。只要系统在屏幕上至少有一个可见窗口,这一切都可以正常工作——不一定是包含我们正在绘制的面板的窗口。

    但如果我们试图在不使任何窗口可见的情况下做到这一点,GLJPanel将无法绘制。通过JOGL源代码,我发现除非它有一个有效的对等体,否则它不会绘制——基本上是除非对它调用了addNotify()。文档说,只有当面板成为可见窗口层次结构的一部分时,才会调用addNotify)。更改为GLCanvas并没有太大区别——故障模式是不同的。WindowsOnscreenGLDrawable.realized未设置,这意味着lockSurface返回 LOCK_SURFACE_NOT_READY ,导致makeCurrent()失败。

    欢迎就如何创建一个Java应用程序提供任何帮助,该应用程序可以创建和导出3D场景,而无需使其窗口可见。

    2 回复  |  直到 17 年前
        1
  •  5
  •   DJClayworth    17 年前

    我不确定我是否应该回答自己的问题,但我发现现在似乎奏效了。

    关键的是 GLP缓冲区 ,这是一个屏幕外的GLAutoDrawable,可以在没有可见组件层次结构的情况下创建。

    This article 有助于让它工作。在我确认它完全正常工作之前,我将不再接受这个答案。

    我还应该说,答案来自 this forum ,不是我自己的大脑。

        2
  •  0
  •   Paulo Lopes    17 年前

    您应该查看方法:glReadPixels()更多信息 here 基本上,它的工作原理大致如下:

    Init(); //doing some initializations in your JOGL app
    
    glDrawBuffer(GL_BACK);
    
    DrawGLScene(); //doing drawing here
    
    glReadBuffer(GL_BACK);
    
    //Copy the image to the array imageData
    glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, imageData);