我们可以在JavaFX中实现自己的材料吗?

时间:2017-04-26 00:05:20

标签: java javafx javafx-8 shader

JavaFX具有abstract class Material来表示3D表面的材质。当前的JDK仅提供PhongMaterial实现。我正在考虑通过扩展Material来添加我自己的材料(如Lambert或Blinn等),类似于PhongMaterial的实现方式。

我遇到了两个问题:

  1. PhongMaterial文档中指定的行为(颜色计算)无处可寻 - 不是在类本身,也不是在我看过的内部类中。它在JDK中的某处,但并未如此暴露。 PhongMaterial类只保存属性而不是行为,我觉得这很奇怪。

  2. PhongMaterial似乎与内部课程深深耦合:

    • com.sun.javafx.sg.prism.NGPhongMaterial,根据某些文档由图形工具包/管道实现创建的对等节点。此类指定无行为。
    • com.sun.prism.PhongMaterial表示用于保留模式呈现的phong素材
    • com.sun.prism.TextureMap一个包装类,用于保存PhongMaterial 的地图相关信息。

    这些都没有指明材料的行为。

  3. 实施我自己的材料有哪些步骤?我需要写什么课程?例如,我是否需要一个新的TextureMap课程,我会以某种方式告知Prism?

2 个答案:

答案 0 :(得分:3)

据我所知,Material类(目前)不是为子类设计的。这可能是因为尚未就固定的公共API达成一致。

Material包含两个抽象方法。在JavaFX 8这些是

public abstract void impl_updatePG(); 

public abstract NGPhongMaterial impl_getNGMaterial();

这些标记为@Deprecated@treatAsPrivate implementation detail

JavaFX 9中,名称发生变化,可见性更改为package-private:

abstract void updatePG(); 

abstract NGPhongMaterial getNGMaterial();

所以看起来这里的意图不是允许子类化,而是设计允许未来(> 9)版本在决定API后允许子类化。同样,在这里我在很大程度上阅读这些内容:靠近JavaFX团队的用户可能拥有更完整的信息。 FWIW,源代码的当前版本包含以下注释:

  

材料不是油漆
  PhongMaterial可能是第一个也是唯一的材料   在FX8中(详见3D概念实施)
  凹凸贴图:   法线贴图和高度贴图 - 我们可以在给定a时生成法线贴图   高度图
  位移图?不在FX8中 - 可以进行Parallex校正   映射以提高性能成本的质量
  支持自动生成   MIPMAP
  没有计划支持多纹理

答案 1 :(得分:3)

这是OpenJFX邮件列表中关于创建材料的回复:

  

我们目前还没有计划3D渲染领域的任何改进。即使我们这样做,允许应用程序定义的材料也需要某种方式让应用程序为渲染这些材料提供所需的着色器支持。

所以问题的答案是"否",并且没有计划在将来改变它。