0

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");

IllegalRenderingStateException をキャッチしようとしましたが、うまくいきません。JVM はいずれにしてもクラッシュします。Intel ベースのグラフィック カードで印刷機能を使用する方法を知っている人はいませんか?

4

1 に答える 1

0

私の問題の原因がわかりました。一部のコンピューターでは、PrintCanvas3D.java が必要とする OffScreenRendering のサポートがありません。

だから私はロボットを使ってスクリーンキャプチャを作成しました

 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());
}

誰かがこれを処理するより良い方法を見つけることができる場合は、私に知らせてください;)

于 2012-03-05T08:16:55.260 に答える