【发布时间】:2016-09-26 23:32:08
【问题描述】:
我正在寻找一种在没有awt Robot 的情况下以编程方式截取我的GLCanvas 的方法。
这是我目前的设置:
构造函数:
glcaps = new GLCapabilities(GLProfile.get(GLProfile.GL2));
glcaps.setDoubleBuffered(true);
glcaps.setHardwareAccelerated(true);
glcanvas = new GLCanvas(glcaps);
glcanvas.setSize(720, 720);
glcanvas.addGLEventListener(this);
glcanvas 被声明为实例变量:GLCanvas glcanvas
OpenGL 初始化:
@Override
public void init(GLAutoDrawable glad) {
GL2 gl = glad.getGL().getGL2();
glu = new GLU();
gl.glEnable(GL2.GL_DEPTH_TEST);
gl.glDepthFunc(GL2.GL_LEQUAL);
gl.glShadeModel(GL2.GL_SMOOTH);
gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
gl.glClearColor(0f, 0f, 0f, 1f);
// Some camera related code not shown
}
OpenGL 显示:
public void display(GLAutoDrawable glad) {
GL2 gl = glad.getGL().getGL2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
...
// Orient camera and draw a simple cube
...
gl.glFlush();
}
截图方式:
BufferedImage b = new BufferedImage(glcanvas.getWidth(), glcanvas.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = b.createGraphics();
glcanvas.setupPrint(glcanvas.getWidth(), glcanvas.getWidth(), 50, 50, 50);
glcanvas.print(g);
try {
ImageIO.write(b, "png", new File("test.png"));
} catch (IOException ex) {
// Error handling
}
glcanvas.releasePrint();
g.dispose();
此方法有效,因为执行时不会崩溃,但是我得到的 png 文件只是黑色的,没有立方体。我也尝试使用 glReadPixels 但这也不起作用,因为它只是给了我一个充满 0 的缓冲区(黑色)。
我认为问题在于我没有从绘图线程中读取glcanvas。这是错误吗?如果是,我该如何解决?
感谢所有答案!
【问题讨论】:
-
我认为
glReadPixels是正确的答案。 -
@immibis 当我使用
glReadPixels时,我仍然得到所有字节为0 并且图像变为黑色,即使在实际glcanvas上渲染了一个立方体。我正在使用display或init之外的不同方法执行glReadPixels。 -
使用我的建议:forum.jogamp.org/… JOGL 2.3.2 可以正常工作:jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/com/…
标签: java opengl screenshot jogl glcanvas