我正在寻找一种程序化地截取我的GLCanvas
屏幕截图的方法,而不使用awt Robot
。
这是我的当前设置:
构造函数:
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
是正确的答案。 - user253751glReadPixels
时,所有字节仍然为0,图像变成黑色,即使在实际的glcanvas
上渲染了一个立方体。我正在从不在display
或init
中的另一种方法中进行glReadPixels
。 - skyguy126