Unity程序员的Unreal 简明教程(二,模型与材质)

1.模型来源

在模型来源的问题上,Unreal内置了模型编辑器,但这是异类,美术大大多半都有顺手的工具,多为max 或 maya,unity3d是多用fbx 从美术软件中输入资源

Unreal 同样支持这种方法

和Unity不同,Unity导入模型必须把fbx文件放置到项目资源目录

而Unreal导入模型你有两个选择

一、把fbx文件放到项目资源目录,然后Unreal会问你,要不要导入

二、直接按导入按钮,选中fbx文件,导入,unreal也不会把fbx文件复制过来

wps1

导入之前最好先建好目录,进入要导入到的目录,要不然像fbx这样的一导入大堆,后期再管理比较讨厌。

之前刚好试验了一个地形资源,就用他当例子

wps2

无论你用那种方式导入,你都会碰到下面这个对话框

wps3

麻烦的是这个默认选项有点傻,比如这个地形模型,因为是多张贴图拟合,拟合权重以定点色的形式输入,默认选项就不导入定点色。如上图修改才会导入顶点色。

导入贴图的方法同上,但是unreal的details面板,仅仅适用于Outline面板中的Actor,改变贴图的选项只能双击打开编辑,没有unity3d方便,很多其它地方也都是这样,需要双击打开一个独立的编辑器。但是unreal内置的编辑器是真的多。

2. 把模型放进场景中

wps4

可以直接把模型拖拽进场景中,会自动创建一个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过来觉得有点混乱。

来,打开材质编辑器看看

wps5

这就是一个shader编辑器吗,是不是和shaderforget很像。

别急,unreal的material编辑器里可以使用这种东西,直接指定了shader使用的参数。

wps6

这说明Unreal的Material是即包含了shader 的逻辑,也包含了shader的参数。虽然从概念上不够清晰,一把梭,用起来就好。

那么Material Function 又是什么东西呢

就是这wps7,可以自己定义的函数,要不然拖材质块最终会变成蜘蛛网。

这是这个函数展开的样子

wps8

Material function 作为独立的资源需要先创建,后使用,使用时直接拖进材质编辑器

而Material Instance 终于接近Unity的Material概念了

Material Instance 表示一个材质的实例,继承材质,可以改变其中的参数,要注意Material使用的贴图 数值并不全是参数,需要Material内部被明确指定为参数的,Material Instance才可以修改。

比如说你发现Unreal的材质用了一张贴图,但你查来查去,和你没关系,你在Material Instance里面也找不到这张贴图。

这时候就点开Material 编辑器看看,Material function也点开看看,他们都可以随便高兴就引用一张贴图啥的。

3. 具体材质实现

wps9

这个材质的原始意图就是权重融合

然而到了Unreal,说实话我觉得拖流程块的信息密度很低,我们来看看我们怎么做这个工作。

1. Unreal材质基本操作,右键添加节点

wps10

因为需要三张贴图,创三个TextureSampleParameter2D,需要贴图的TilingOffset,Unity是用一个vector4,而Unreal只有VectorParameter一种(就是个Vector4),也创建三个

注意点中参数在detials面板里排列一下排序优先级

wps11,Unreal 的材质参数默认的顺序很随机。

wps12

绿色是我们创建的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在本例中都是零

他换成流程图块就是这部分

wps13

红色就是顶点的uv0 就是v.texcoord ,tex0tiling的红和绿 就是 xy,zw部分我们不要了,看了这个,你如果高兴再加上一个  + zw 的逻辑,也不复杂

wps14

然后这部分就是贴图采样并融合的逻辑

贴图采样直接由蓝色的贴图完成

wps15

因为这段逻辑展开太啰嗦,我就把他封装到material function里了

这里的0.8 是tex1rate,1.25是tex3rate,这里他们是常量,你如果写了个常量,但是后悔了,觉得这应该是个参数,unreal给了一个后悔的方法,选中这个节点,右键 convert to parameter

wps16他就变成一个参数了

然后就到我们封装的函数了

双击这个函数可以跳入编辑

Vertexs Color 表示定点色,就是 i.color,我们用它的三个通道分别做三张贴图的权重

wps17

到这里你会发现其实和Unity差不多,就是流程块的信息密度差一点,通过material function可以弥补。而Unity 也有流行的shaderforge,用这种方式去开发材质。

这样生成的材质优化程度如何还不得而知。在考虑性能的情境下,我们倾向vertex阶段多做事,fragment阶段少做事儿,还不知道unreal的材质如何确认这些细节。

4. 使用材质

使用材质时尽量使用MaterialInstance,除非你不需要更改材质参数

wps18

最终完成了一个三层地表融合。

posted @ 2020-08-12 18:54  疯光无线  阅读(937)  评论(0编辑  收藏  举报