我正在尝试编写一个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"));
答案 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"));
现在绘制的代码应位于OffscreenJOGL
,init(...)
和reshape(...)
方法下的自定义display(...)
课程中。请注意,设置当前上下文必须采用init(...)
方法[{1}}。否则我会抛出异常。
OffscreenJOGL
答案 1 :(得分:0)
您很可能已找到查询所需的答案。
如果没有,我建议添加一行,例如:
gl.glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
我已经对其进行了测试,并且可以正常工作。