2017-04-26 52 views
3

JavaFX的abstract class Material代表三維表面的材料。當前的JDK僅提供PhongMaterial實現。我正在考慮通過擴展Material添加我自己的材料(如Lambert或Blinn等),類似於如何實現PhongMaterial我們可以在JavaFX中實現我們自己的材料嗎?

有2個問題我遇到:在PhongMaterial文檔中指定

  1. 行爲(顏色計算)是無處可尋 - 而不是類本身,而不是在內部類Iv'e看着在。它在的某處在JDK中,但沒有那麼暴露。 PhongMaterial類只擁有屬性而不是行爲,我覺得這很奇怪。

  2. PhongMaterial似乎深深加上內部類:

    • com.sun.javafx.sg.prism.NGPhongMaterial,其根據一些文檔由圖形工具包/管道實施創建的對等節點。這個類沒有指定行爲。
    • com.sun.prism.PhongMaterial,其中代表用於保留模式渲染的phong材料
    • com.sun.prism.TextureMap包裝類,用於保存PhongMaterial的地圖相關信息。

    這些都沒有指定材料的行爲。

實施我自己的材料的步驟是什麼?我需要寫什麼課?例如,我是否需要一個新的TextureMap課程,我會以某種方式告知Prism?

+0

啊,是的,你做了同樣的發現:JavaFX文檔很糟糕。 – Michael

+0

@Michael我已經有了一個想法。我的問題不在於文檔,而在於實現。 – user1803551

+0

所以看着它,Material有2個impl_抽象方法,任何子類都需要重寫,三個方法與「髒」標誌相關。所有三個'impl_'方法都被標記爲已棄用,並且「將在下一版本中刪除」。我認爲這是一個強有力的指標,你基本上可以不實施你自己的'材料'。 – Michael

回答

3

這是關於創造的OpenJFX郵件列表的回覆材料:

我們目前沒有計劃在3D渲染領域的任何改進。即使我們這樣做了,允許應用程序定義的材質也需要某種方式讓應用程序爲渲染這些材質提供所需的着色器支持。

所以這個問題的答案是「否」,並且在將來沒有計劃改變這個問題。

+0

不錯的後續行動,一旦[系統讓你](https://stackoverflow.com/help/self-answer),你應該將這個答案標記爲正確。 – jewelsea

+0

@jewelsea我可以立即將它標記爲正確,但不想採取James_D的觀點:)我認爲這是正確的做法... – user1803551

+0

不,這是最權威的答案。將其標記爲正確是適當的。 –

3

就我所知,Material類不是(目前)爲子類設計的。這可能是因爲固定的公共API尚未達成一致。

Material包含兩個抽象方法。在JavaFX 8這些都是

public abstract void impl_updatePG(); 

public abstract NGPhongMaterial impl_getNGMaterial(); 

這些被標記@Deprecated@treatAsPrivate implementation detail

JavaFX 9名稱改變和可見性的變化來包裝和私營部門:

abstract void updatePG(); 

abstract NGPhongMaterial getNGMaterial(); 

所以它看起來像這裏的目的不是爲了讓子類,但有該設計將允許未來(> 9)版本在確定API後允許子類化。再次,在這裏我正在很大程度上閱讀:更接近JavaFX團隊的用戶可能擁有更完整的信息。FWIW,源代碼的當前版本包含了以下評論:

材料不噴漆
PhongMaterial也許是第一個也是唯一材料 在FX8(詳見3D概念的實現)
凹凸貼圖: 法線貼圖和高度貼圖 - 當給定 高度貼圖時,我們可以生成法線貼圖
位移貼圖?不FX8 - 可能會做Parallex校正 映射以性能爲代價來提高質量
支持自動生成 MIPMAP
沒有計劃,以支持多紋理

+2

現在我想到了,可能值得在OpenJFX郵件列表中詢問關於未來的意圖。 – user1803551

+1

如果您有興趣,請添加他們的回覆。 – user1803551

相關問題