Java OpenGL将屏幕外缓冲区绘制成图像

时间:2014-04-10 01:05:24

标签: java opengl jogl off-screen

我正在尝试编写一个java opengl(JOGL)方法,该方法写入屏幕外的drawable,然后将其写入图像。我在使用屏幕可绘制以及GLP缓冲区时验证了这一点,但是当前状态的输出图像只是纯黑色。代码如下。

GLProfile glp = GLProfile.getDefault();
GLCapabilities caps = new GLCapabilities(glp);
caps.setOnscreen(false);

// create the offscreen drawable
GLDrawableFactory factory = GLDrawableFactory.getFactory(glp);
GLOffscreenAutoDrawable drawable = factory.createOffscreenAutoDrawable(null,caps,null,width,height);
drawable.display();
drawable.getContext().makeCurrent();

// a series of x/y coordinates
FloatBuffer buffer = generateData();

GL2 gl = drawable.getGL().getGL2();

// use pixel coordinates
gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();    
gl.glOrtho(0d, width, height, 0d, -1d, 1d);

// draw some points to the drawable
gl.glPointSize(4f);
gl.glColor3f(1f,0f,0f);    
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL2.GL_FLOAT, 0, buffer);
gl.glDrawArrays(GL2.GL_POINTS, 0, numPoints);

BufferedImage im = new AWTGLReadBufferUtil(drawable.getGLProfile(), false).readPixelsToBufferedImage(drawable.getGL(), 0, 0, width, height, true /* awtOrientation */);
ImageIO.write(im,"png",new File("im.png"));

2 个答案:

答案 0 :(得分:1)

这有点旧,但我找到了解决问题的解决方案,这似乎对我有用。我刚刚在drawable上调用GLEventListener之前添加了一个普通的.display()对象,如下所示:

//...
drawable.addGLEventListener(new OffscreenJOGL());
drawable.display();

//Move drawing code to OffscreenJOGL

BufferedImage im = new AWTGLReadBufferUtil(drawable.getGLProfile(), false).readPixelsToBufferedImage(drawable.getGL(), 0, 0, width, height, true /* awtOrientation */);
ImageIO.write(im,"png",new File("im.png"));

现在绘制的代码应位于OffscreenJOGLinit(...)reshape(...)方法下的自定义display(...)课程中。请注意,设置当前上下文必须采用init(...)方法[{1}}。否则我会抛出异常。

OffscreenJOGL

答案 1 :(得分:0)

您很可能已找到查询所需的答案。
如果没有,我建议添加一行,例如:

gl.glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) 

我已经对其进行了测试,并且可以正常工作。