JavaFX具有 abstract class Material
来表示3D曲面的材质。当前的JDK仅提供 PhongMaterial
实现。我一直在通过扩展Material
来实现自己的材料(例如Lambert或Blinn等),类似于PhongMaterial
的实现方式。
我遇到了2个问题:
PhongMaterial
文档中指定的行为(颜色计算)-不在类本身中,也不在我查看过的内部类中。它在JDK中的某个地方,但是没有那么暴露。 PhongMaterial
类仅包含属性,而不包含行为,而我一开始就觉得很奇怪。 PhongMaterial
似乎与内部类紧密结合:com.sun.javafx.sg.prism.NGPhongMaterial
,根据一些文档,它是由图形工具包/管道实现创建的对等节点。此类未指定任何行为。 com.sun.prism.PhongMaterial
,表示用于保留模式渲染的phong材质。 com.sun.prism.TextureMap
是一个包装类,用于保存PhongMaterial的地图相关信息。 这些都没有指定材料的行为。
实施我自己的材料的步骤是什么?我需要写什么课?例如,我需要一个新的
TextureMap
类,以某种方式通知Prism吗? 最佳答案
据我所知,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();
因此,看起来这里的意图不是允许子类化,而是要有一种设计,一旦决定了API,该设计将允许将来的(> 9)版本允许子类化。再次,在这里我在很大程度上阅读这句话:与JavaFX团队关系更近的用户可能会获得更完整的信息。 FWIW,当前版本的源代码包含以下注释:
材料不是油漆
PhongMaterial可能是第一个也是唯一的材料
在FX8中使用(有关详细信息,请参见3D概念性实现)
凹凸贴图:
法线贴图和高度图-如果给定一个
高度图
位移图?不在FX8中-可以进行Parallex校正
映射以提高性能成本来提高质量
支持自动生成
贴图
没有计划支持多纹理