如何實現一個類似UE4中的材質編輯器?
就是靠可視化連線來編輯材質的那種,思路是怎樣的?
之前在網易實習的時候干過類似的。我簡單介紹下思路,具體的你可以去看下代碼,特別是MaterialTemplate.usf
這種可視化編輯器其實是根據節點和相互之間的關係,配合一個代碼模板生成最終結果
節點可以分為三種:
- 輸入節點,譬如參數、紋理、uv、pos等
- 輸出節點,材質的各種屬性,albedo
ormalspecular等
- 中間節點,相當於代碼里各個臨時變數
節點之間支持各種運算符操作,需要注意的是節點有不同的類型(float, float4之類)。等整張圖連好之後,就可以根據中間運算符的連接組合出一個大函數。
至於可視化編輯節點之類的,你可以找一些WPF控制項...具體細節就母雞了(主要這部分但是是別的同學完成的,我也不是很了解,逃
謝孟同學邀請。
答主做了一個類似ue3的材質編輯器,並整合到公司的引擎。我說一下我實現的過程吧。
首先,得有一個流程圖控制項,這個有很多現成的,比如extreme toolkit,實在不行自己寫一個也不難。
答主是基於shdertree做的,基本上shadertree可以認為是多棵抽象語法樹(根節點的每一個輸入都可以當地一棵樹),每一個節點可以認為是一個shader中的函數,inout很好用。然後就是一個編譯的逆過程,把抽象語法樹變成源代碼。
至於每一個節點的預覽,可以把節點當成獨立的抽象語法樹,重複一下之前的過程即可,只是要注意處理一下變成了繪製一個quad,繪製完以後再拷貝出來貼回到界面上。
還有一個要注意的地方就是函數多態,比如add函數可以接受不同的參數輸入,這個可以參考c++的做法,生成多個不同的函數簽名,在編譯期根據參數類型決定使用哪個函數。
其實界面的操作都是小事情(undoredo這些做編輯器的都會做吧,最難的就是流程圖子節點預覽了),難的還是底層的優化與原系統的整合上。底層的優化包括寄存器的使用,sematic暴露機制,文本生成的優化(可讀性優化,內存佔用優化)。ue3生成的shader可讀性比答主寫的好很多,這就是功力吧。不過我覺得既然都已經是機器生成了,沒必要保證可讀性 。另外就是shader緩存機制了,這個是個材質系統都會做吧。材質系統最好還是和defershading的管線整合,因為跟節點的每一個輸入,都剛好可以對應上deferredshading的輸出,當然也沒有必要一一對應,可以根據實際情況生成對應批次的shader源碼即可。
答主做的這個材質系統及編輯器也在一個項目中使用,使用下來發現,非程序人員在材質方面確實比程序有想像力,另外,在一些沒有太大技術難度的擴展上,確實比讓程序寫shader及c++來得快,所見即所得還不需要重新編譯程序嘛。我之前做過一個可視化Shader編輯器,當時設計得比較簡單,只有變數、常量和節點,每個節點視為一個函數,節點的行為也與函數一致,有多個輸出參數,但僅有1個輸出結果,如果輸出的值的類型是諸如float3的向量,再特別提供各分量輸出埠。編譯時先生成HLSL代碼,然後再用D3DCompiler編譯生成的HLSL代碼。各種數據類型和內置函數都是專門寫的節點,不支持使用節點自定義函數。實際寫的過程中遇到很多細節上的問題,用了一些"不講究"的辦法去解決,代碼寫得很難看,最終的結果只能說是"還算能用",能讓美術製作一些簡單的材質,遇到複雜的需求,還是得要程序員手動寫代碼。後來雖然有了新的想法,但是因為需求不足,所以一直沒有實際動手去做。
編輯器裡面隨便拖了幾個節點之後的樣子:
你需要的是一個非線性編輯器,網上應該有不少。不限於做材質編輯,劇情,AI,技能,都可以做。
推薦閱讀:
※如何在 Graphics 頂級會議上 (SIGGRAPH / EG / PG) 上發表論文?
※請問FXAA、FSAA與MSAA有什麼區別?效果和性能上哪個好?
※能否設計出不會導致近視的顯示屏?
※光線追蹤中的透視畸變如何矯正?
※為什麼會有那麼多類型的 BxDF?