1.模型來源
在模型來源的問題上,Unreal內置了模型編輯器,但這是異類,美術大大多半都有順手的工具,多為max 或 maya,unity3d是多用fbx 從美術軟件中輸入資源
Unreal 同樣支持這種方法
和Unity不同,Unity導入模型必須把fbx文件放置到項目資源目錄
而Unreal導入模型你有兩個選擇
一、把fbx文件放到項目資源目錄,然后Unreal會問你,要不要導入
二、直接按導入按鈕,選中fbx文件,導入,unreal也不會把fbx文件復制過來
導入之前最好先建好目錄,進入要導入到的目錄,要不然像fbx這樣的一導入大堆,后期再管理比較討厭。
之前剛好試驗了一個地形資源,就用他當例子
無論你用那種方式導入,你都會碰到下面這個對話框
麻煩的是這個默認選項有點傻,比如這個地形模型,因為是多張貼圖擬合,擬合權重以定點色的形式輸入,默認選項就不導入定點色。如上圖修改才會導入頂點色。
導入貼圖的方法同上,但是unreal的details面板,僅僅適用於Outline面板中的Actor,改變貼圖的選項只能雙擊打開編輯,沒有unity3d方便,很多其它地方也都是這樣,需要雙擊打開一個獨立的編輯器。但是unreal內置的編輯器是真的多。
2. 把模型放進場景中
可以直接把模型拖拽進場景中,會自動創建一個StaicMeshActor
還記得把Unreal的Actor就是一個預設,你也可以在編輯Actor的時候拖上去,這時就作為一個StaicMeshComponent掛在Actor下面
放進場景的模型是白色的,這是因為他的材質不對
FBX里的材質和游戲引擎里的都對不上,我們已經習慣了自己整理材質。接下來就來整理材質
2.材質
Unreal的材質概念也是和Unity完全對不上的
1. 我們都知道Unity的材質概念 分為Shader 和 Material,Shader就是shader程序
Matrerial 就是材質和具體的參數
2. Unreal沒有shader,他有三個對應的概念,Material MaterialFunction MaterialInstance
Unreal 的 Material 即是Shader,也是材質。嗯,是不是從U3D過來覺得有點混亂。
來,打開材質編輯器看看
這就是一個shader編輯器嗎,是不是和shaderforget很像。
別急,unreal的material編輯器里可以使用這種東西,直接指定了shader使用的參數。
這說明Unreal的Material是即包含了shader 的邏輯,也包含了shader的參數。雖然從概念上不夠清晰,一把梭,用起來就好。
那么Material Function 又是什么東西呢
就是這,可以自己定義的函數,要不然拖材質塊最終會變成蜘蛛網。
這是這個函數展開的樣子
Material function 作為獨立的資源需要先創建,后使用,使用時直接拖進材質編輯器
而Material Instance 終於接近Unity的Material概念了
Material Instance 表示一個材質的實例,繼承材質,可以改變其中的參數,要注意Material使用的貼圖 數值並不全是參數,需要Material內部被明確指定為參數的,Material Instance才可以修改。
比如說你發現Unreal的材質用了一張貼圖,但你查來查去,和你沒關系,你在Material Instance里面也找不到這張貼圖。
這時候就點開Material 編輯器看看,Material function也點開看看,他們都可以隨便高興就引用一張貼圖啥的。
3. 具體材質實現
這個材質的原始意圖就是權重融合
然而到了Unreal,說實話我覺得拖流程塊的信息密度很低,我們來看看我們怎么做這個工作。
1. Unreal材質基本操作,右鍵添加節點
因為需要三張貼圖,創三個TextureSampleParameter2D,需要貼圖的TilingOffset,Unity是用一個vector4,而Unreal只有VectorParameter一種(就是個Vector4),也創建三個
注意點中參數在detials面板里排列一下排序優先級
綠色是我們創建的vector參數 和 texture參數,他們同時也都是一個功能塊,texture參數就是sampler,包含tex2d的功能,輸入uv,就可以得到顏色
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);unity的TRANSFORM_TEX是個宏
展開以后就是o.texcoord = v.texcoord*_MatnText_ST.xy+_MatnText_ST.zw
由於zw在本例中都是零
他換成流程圖塊就是這部分
紅色就是頂點的uv0 就是v.texcoord ,tex0tiling的紅和綠 就是 xy,zw部分我們不要了,看了這個,你如果高興再加上一個 + zw 的邏輯,也不復雜
然后這部分就是貼圖采樣並融合的邏輯
貼圖采樣直接由藍色的貼圖完成
因為這段邏輯展開太啰嗦,我就把他封裝到material function里了
這里的0.8 是tex1rate,1.25是tex3rate,這里他們是常量,你如果寫了個常量,但是后悔了,覺得這應該是個參數,unreal給了一個后悔的方法,選中這個節點,右鍵 convert to parameter
然后就到我們封裝的函數了
雙擊這個函數可以跳入編輯
Vertexs Color 表示定點色,就是 i.color,我們用它的三個通道分別做三張貼圖的權重
到這里你會發現其實和Unity差不多,就是流程塊的信息密度差一點,通過material function可以彌補。而Unity 也有流行的shaderforge,用這種方式去開發材質。
這樣生成的材質優化程度如何還不得而知。在考慮性能的情境下,我們傾向vertex階段多做事,fragment階段少做事兒,還不知道unreal的材質如何確認這些細節。
4. 使用材質
使用材質時盡量使用MaterialInstance,除非你不需要更改材質參數
最終完成了一個三層地表融合。