java - 首次渲染后屏幕外渲染损坏
问题描述
我正在尝试在 Java16 上使用 Scijava 的 Java3D 1.6 和 JOGL 2.4.0 从 3D 场景中渲染一系列静态图像。我创建了一些带纹理的几何体,使用屏幕外的 Canvas3D 设置了 SimpleUniverse,然后重复渲染到图像缓冲区中,然后将其转储到文件并换出几何体以进行下一次渲染。这很好用,直到我向场景添加背景,此时第一个渲染看起来很好,但所有后续渲染看起来模型的遮挡没有得到正确处理,应该隐藏在其他部分后面的几何部分改为打开最佳。
- 这仅在将背景附加到场景时才会发生 - 多个渲染没有背景就可以了。
- 它独立于被渲染的形状——我可以删除所有形状并添加完全不同的形状,新形状仍然会被错误地渲染。
- 我也可以完全保持场景不变,只需调用 canvas.renderOffScreenBuffer / canvas.waitForOffScreenRendering 两次并观察损坏的结果。
- 它似乎确实已本地化到 Universe/Canvas3D,因为我可以实例化整个对象堆栈的其他副本,并且它们在第一次运行时也可以很好地渲染,所以这是一个可行的解决方法,但我想避免重新创建 Universe对于每个渲染。
除了构建形状的代码之外,这基本上是所有渲染管道:
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();
}
如果需要,可以提供好/坏渲染的图像样本。
解决方案
推荐阅读
- typescript - 方法调用的`this`强制
- python - 一个 Python 函数,它需要多少行和多少列,它应该以网格形式打印一对空方括号 []
- python - 即使在 gropandas 绘图时安装了模块 rasterion.io 也找不到
- sql - 当 h2 数据库查询的一部分重复几次时,如何保持它的简短?
- python - “ValueError:无法将权重广播到值。在昏暗 1 处不匹配。” 在序列模型上使用自定义损失函数时
- android - 在android应用程序中显示所有网络响应
- unity3d - 编辑器中的 Unity 模糊和像素化精灵(无像素艺术)
- sql - 对于简单的乘法,Sqlite 更新表的速度真的很慢
- arrays - 从 XML 转换 XSLT 后,在 JSON 中正确表示集合数据
- python - 为什么这个 Plotly 图在 Y 轴和 X 轴上悬停?