JavaFX 3D 透明度

9

我正在寻找在JavaFX 3D中渲染透明对象的方法。目前为止还没有什么收获。我发现了一个问题https://bugs.openjdk.java.net/browse/JDK-8090548。是否有解决方法,还是说我不能使用这个功能?如果需要透明对象,除了JavaFX(如Java3D)之外还需要其他工具吗?

3个回答

16
自JDK8u60版本起,b14在3D形状中启用了透明度。
以下是使用它进行的快速测试: Transparency 在盒子和两个球体的顶部添加了一个具有漫反射颜色Color.web("#ffff0080")的圆柱体。
group.getChildren().addAll(sphere1, sphere2, box, cylinder);

虽然没有深度排序算法,这意味着添加到场景中的3D形状的顺序很重要。为了允许盒子透明度,我们需要改变顺序:

group.getChildren().addAll(sphere1, sphere2, cylinder, box);

透明度


6

更新

这条回答已经过时,在Java 8u60b14中添加了JavaFX的透明度。


正如您在问题中链接的问题指出的那样,Java 8中不支持JavaFX 3D的透明度。它可能会在Java 9中实现。

用户在问题跟踪器的评论中提到了一个解决方法,涉及到对JavaFX OpenGL管道的本机代码进行修改。如果您迫切需要此功能,可以尝试该方法。如果这不适合您,那么您需要选择其他技术。


谢谢。看起来使用Java 3D(而不是JavaFX 3D)将是使透明度正常工作的更简单的解决方案。 - CJDood

2

这里是部分解决方案。如果要在球体上添加地球纹理的图像的透明度,请设置diffuseMapdiffuseColor

private void makeEarth() {
         PhongMaterial earthMaterial = new PhongMaterial();
         Image earthImage = new Image("file:imgs/earth.jpg");
         earthMaterial.setDiffuseMap(earthImage);
         earthMaterial.setDiffuseColor(new Color(1,1,1,0.6));  // Note alpha of 0.6

         earth = createSphere(0,0,0,300,earthMaterial);
         earthMaterial.setSpecularColor(Color.INDIANRED);         
         earth.setRotationAxis(Rotate.Y_AXIS);
         world.getChildren().add(earth);
    }

这只能使场景的背景图像(由 scene.setFill(starFieldImagePattern); 设置)显示出来。它还不能让其他形状显示出来。显然,这种方法有效的原因是在计算像素颜色时,漫反射颜色与漫反射贴图颜色相乘。请参见https://docs.oracle.com/javase/8/javafx/api/javafx/scene/paint/PhongMaterial.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接