PrintCanvas3D не будет работать - PullRequest
0 голосов
/ 02 марта 2012

У меня возникли проблемы с печатью графики с Java3d, когда при печати на некоторых компьютерах (графических картах Intel) происходит полный сбой.Я получил это исключение.

    javax.media.j3d.IllegalRenderingStateException: GL_VERSION
    at javax.media.j3d.NativePipeline.createNewContext(Native Method)
    at javax.media.j3d.NativePipeline.createNewContext(NativePipeline.java:2736)
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:4895)
    at javax.media.j3d.Canvas3D.createNewContext(Canvas3D.java:2421)
    at javax.media.j3d.Renderer.doWork(Renderer.java:895)
    at javax.media.j3d.J3dThread.run(J3dThread.java:256)

    DefaultRenderingErrorListener.errorOccurred: 
    CONTEXT_CREATION_ERROR: Renderer: Error creating Canvas3D graphics context
    graphicsDevice = Win32GraphicsDevice[screen=0]
    canvas =   visualization.show3D.show.print.OffScreenCanvas3D[canvas0,0,0,3000x2167,invalid]
    Java 3D ERROR : OpenGL 1.2 or better is required (GL_VERSION=1.1)
    Java Result: 1

Я знаю, что в нем сказано, что я должен перейти на OpenGL 1.2, но после проверки у меня уже установлено 1.5 (сообщение об ошибке не точное)

String glVersion = (String)getCanvas3D().queryProperties().get("native.version");

Iпопытался поймать IllegalRenderingStateException, но это не работает, JVM просто аварийно завершает работу в любом случае.Кто-нибудь знает, как использовать функцию печати для графических карт на базе Intel?

1 Ответ

0 голосов
/ 05 марта 2012

Я выяснил причину своей проблемы.На некоторых компьютерах отсутствует поддержка OffScreenRendering, необходимая для PrintCanvas3D.java.

Поэтому я использовал робот для создания снимка экрана

 public BufferedImage canvasCapture(Dimension size, Point locationOnScreen) {
    Rectangle bounds = new Rectangle(locationOnScreen.x, locationOnScreen.y, size.width, size.height);
    try{
    Robot robot = new Robot(this.getGraphicsConfiguration().getDevice());
    return robot.createScreenCapture(bounds);
    }catch (Exception e){
    e.printStackTrace();
    return null;
    }
 }

Последняя сложная задача - определить, когда следует переключиться с правильного метода печати.в метод ScreenCapture (поскольку перехват возбужденного исключения не работает), после некоторого поиска я обнаружил, что queryProperties () может дать мне эту информацию

вот код в моем Frame3D, чтобы выбрать правильный метод

Boolean OffScreenRenderingSupport = (Boolean)getCanvas3D().queryProperties().get("textureLodOffsetAvailable");
if (OffScreenRenderingSupport){
    bImage = getOffScreenCanvas3D().doRender(dim.width, dim.height); 
}else{
    bImage = getOffScreenCanvas3D().canvasCapture(getCanvas3D().getSize(), getCanvas3D().getLocationOnScreen());
}

Если кто-нибудь может найти лучший способ справиться с этим, пожалуйста, дайте мне знать;)

...