首页 > 解决方案 > 首次渲染后屏幕外渲染损坏

问题描述

我正在尝试在 Java16 上使用 Scijava 的 Java3D 1.6 和 JOGL 2.4.0 从 3D 场景中渲染一系列静态图像。我创建了一些带纹理的几何体,使用屏幕外的 Canvas3D 设置了 SimpleUniverse,然后重复渲染到图像缓冲区中,然后将其转储到文件并换出几何体以进行下一次渲染。这很好用,直到我向场景添加背景,此时第一个渲染看起来很好,但所有后续渲染看起来模型的遮挡没有得到正确处理,应该隐藏在其他部分后面的几何部分改为打开最佳。

除了构建形状的代码之外,这基本上是所有渲染管道:

    public BufferedImage render(ImageComponent2D image, TransformGroup shapeTransform){
        BufferedImage bImage = new BufferedImage(TEMP_WIDTH, TEMP_HEIGHT, BufferedImage.TYPE_INT_ARGB);
        ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage);
        buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_WRITE);
        buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);

        Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration(), true);
        canvas.setSize(HEIGHT * 4, WIDTH * 4);
        canvas.getScreen3D().setPhysicalScreenHeight(0.0254/90.0 * HEIGHT);
        canvas.getScreen3D().setPhysicalScreenWidth(0.0254/90.0 * WIDTH);
        canvas.getScreen3D().setSize(HEIGHT * 4, WIDTH * 4);
        canvas.setOffScreenBuffer(buffer);
        canvas.setBackground(new Color(0,0,0,0));

        SimpleUniverse universe = new SimpleUniverse(canvas);

        BranchGroup group = new BranchGroup();
        group.setCapability(BranchGroup.ALLOW_DETACH);

        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);

        BranchGroup bgGroup = new BranchGroup();
        bgGroup.setCapability(BranchGroup.ALLOW_DETACH);
        Backgroundbackground = new Background();
        background.setImageScaleMode(Background.SCALE_FIT_MAX);
        background.setApplicationBounds(bounds);
        background.setCapability(Background.ALLOW_IMAGE_WRITE);
        background.setImage(image)
        bgGroup.addChild(background);
        
        PlatformGeometry pg = new PlatformGeometry();
        
        Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
        AmbientLight ambientLightNode = new AmbientLight(ambientColor);
        ambientLightNode.setInfluencingBounds(bounds);
        pg.addChild(ambientLightNode);
        
        Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
        Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f);
        Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f);
        Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
        
        DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
        light1.setInfluencingBounds(bounds);
        pg.addChild(light1);
        
        DirectionalLight light2 = new DirectionalLight(light2Color,light2Direction);
        light2.setInfluencingBounds(bounds);
        pg.addChild(light2);
        
        universe.getViewingPlatform().setPlatformGeometry(pg);

        group.addChild(shapeTransform);
        universe.addBranchGraph(group);
        universe.addBranchGraph(bgGroup);

        canvas.renderOffScreenBuffer();
        canvas.waitForOffScreenRendering();
        return buffer.getImage();
    }

如果需要,可以提供好/坏渲染的图像样本。

标签: javajava-3d

解决方案


推荐阅读