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

我们可以在JavaFX中实现我们自己的材料吗?,java,javafx,javafx-8,shader,Java,Javafx,Javafx 8,Shader,JavaFX具有表示3D曲面材质的功能。当前的JDK只提供了一个实现。我正在考虑添加我自己的材料(如Lambert或Blinn等),方法是扩展材料,类似于PhongMaterial的实现方式 我遇到了两个问题: 在PhongMaterial文档中指定的行为(颜色计算)找不到-不在类本身中,也不在Iv'e查看的内部类中。它在JDK中的某个地方,但不是那么公开。PhongMaterial类只保存属性,而不保存行为,我觉得从一开始就很奇怪 PhongMaterial似乎与内部类紧密结合: com.s

JavaFX具有表示3D曲面材质的功能。当前的JDK只提供了一个实现。我正在考虑添加我自己的材料(如Lambert或Blinn等),方法是扩展
材料
,类似于
PhongMaterial
的实现方式

我遇到了两个问题:

  • PhongMaterial
    文档中指定的行为(颜色计算)找不到-不在类本身中,也不在Iv'e查看的内部类中。它在JDK中的某个地方,但不是那么公开。
    PhongMaterial
    类只保存属性,而不保存行为,我觉得从一开始就很奇怪

  • PhongMaterial
    似乎与内部类紧密结合:

    • com.sun.javafx.sg.prism.NGPhongMaterial
      ,根据一些文档,它是由图形工具包/管道实现创建的对等节点。此类不指定任何行为
    • com.sun.prism.PhongMaterial
      ,它表示用于保留模式渲染的phong材质
    • com.sun.prism.TextureMap
      是一个包装类,用于保存PhongMaterial的贴图相关信息
    这些都没有指定材质的行为


  • 实施我自己的材料的步骤是什么?我需要写什么课程?例如,我是否需要一个新的
    TextureMap
    类,我会以某种方式通知Prism吗?

    据我所知,
    材质
    类(目前)不是为子类化而设计的。这可能是因为尚未商定固定的公共API

    Material
    包含两种抽象方法。这些是

    public abstract void impl_updatePG(); 
    

    它们被标记为
    @已弃用
    @treatAsPrivate实施细节

    在名称更改和包专用的可见性更改中:

    abstract void updatePG(); 
    

    因此,这里的意图似乎不是允许子类化,而是设计一种允许将来(>9)版本在API确定后允许子类化的设计。同样,这里我在很大程度上是在字里行间阅读:更接近JavaFX团队的用户可能拥有更完整的信息。FWIW,源代码的当前版本包含以下注释:

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


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

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


    所以这个问题的答案是“不”,今后也没有计划改变这一点。

    啊,是的,你已经有了我曾经做过的同样的发现:JavaFX文档太糟糕了。@Michael,我已经想到了这一点。我这里的问题与其说是关于文档,不如说是关于实现。所以仔细研究一下,Material有2个抽象方法,任何子类都需要重写,还有三个方法与“脏”标志相关。所有这三种
    impl\uu
    方法都标记为已弃用,并且“将在下一版本中删除”。我认为这是一个强有力的指标,表明你基本上无法实现你自己的
    材料
    。现在我想起来了,也许值得在OpenJFX邮件列表上询问未来的意图。如果你感兴趣,添加了他们的回复。很好的跟进,你应该在考试结束后把这个答案标记为正确的。我本可以马上把它标记为正确的,但我不想接受詹姆斯的观点:)我想无论如何,这是正确的做法……不,这是最确定的答案。将其标记为正确是适当的。
    abstract void updatePG(); 
    
    abstract NGPhongMaterial getNGMaterial();