UE 3D数学材质
材质编辑介绍
材质节点是封装好的HLSL高级着色器语言
流程:
shader graph→HLSL Code →Assembly Instructions→ Graphics Driver
材质连接图转换为HLSL代码再转换为汇编语言指令然后传递给驱动程序。
渲染管线介绍
各种贴图的作用与介绍
https://zhuanlan.zhihu.com/p/396841468
贴花
创建一个材质,材质域改为延迟贴花,混合模式改为半透明,需要透明贴图,颜色贴图,法线贴图,粗糙度贴图。
贴图可以在bridge下载。延迟贴花对静态光照支持程度不太好,适用于动态光照。
可以在模型的细节面板中调节是否接受贴花
多个贴花重合时可以通过更改贴花的排序顺序来控制贴花的出现前后
材质中可以更改贴花混合模式。
节点函数
BreakMaterialAttributes(中断材质属性):
在使用 分层材质 (“材质功能”系统的一项特性)时,**BreakMaterialAttributes(中断材质属性)**表达式十分理想。在材质中使用 材质层功能 时,您可能想只使用材质层的某一个方面。例如,您可能有一个定义漂亮的一般材质(如钢铁)的材质层。您可能希望在最终材质中仅使用该材质层的“粗糙度”和“底色”属性,而不是使用整个材质层。在此类情况下,您可使用 BreakMaterialAttributes(中断材质属性)节点对材质层的所有传入属性进行拆分,然后仅连接所需的属性。这也使您能够对各种材质属性进行复杂混合。
纹理
AO,Displacement,normal,roughness,metalness(金属贴图)都是不需要勾选srgb的。ORM三合一贴图也是需要将srgb关掉。
混合模式
不透明它定义了光线无法通过或穿透的表面。此模式适用于大部分塑料、金属、石头以及较大比例的其他表面类型。
已遮罩混合模式用于您需要以二元(开/关)方式选择性地控制可见性的对象。例如,假定一个材质要模拟铁丝网围栏或格栅。某些区域看起来像是固体,而其他区域不可见。此类材质适合于"遮罩"(Masked)混合模式。
半透明:
“叠加型”(Additive)混合模式无非获取材质的像素,并将其与背景的像素相加。这与Photoshop中的_线性减淡(添加)_混合模式非常相似。这表示不会进行暗化;因为所有像素值都_添加_到一起,因此黑色将直接渲染为透明。这种混合方式适合于各种特殊效果,例如火焰、蒸汽或全息图。
其他混合模式详情:
https://docs.unrealengine.com/zh-CN/RenderingAndGraphics/Materials/MaterialProperties/BlendModes/index.html
光照模式(半透明)
体积无方向 适用于烟雾和沙尘之类的粒子效果
体积方向
逐顶点体积无方向
逐顶点体积方向
表面半透明体积
表面向前着色
从上往下依此消耗性能越来越大,质量越来越高。
着色模型
https://docs.unrealengine.com/zh-CN/RenderingAndGraphics/Materials/MaterialProperties/LightingModels/index.html
其中无光照(Unlit) 着色模型仅输出颜色自发光,非常适用于特殊效果,例如火焰或照明物。它看起来会发光,但是此对象不会投射光线或阴影。
只提供自发光的灯棒可以使用此着色模型,之所以使用无光照模式是因为这样
默认光照(Default Lit) 是默认着色模型,而且很可能是最常用的模型。 此着色模型使用直接和间接光照,以及反射高光。
次表面(Subsurface) 着色模型能够模拟次表面散射效果。适用于植物(树叶,荷叶),皮肤,冰面,大理石,蜡烛,牛奶,雪。
预整合蒙皮(Pre-integrated Skin) 着色模型的性质与次表面(Subsurface)模型非常相似,适用于人类角色的低性能开销皮肤渲染。尽管在物理效果上并不完美, 但此着色模型渲染开销低于次表面(Subsurface)法,而且通常能实现不错的角色效果。
次表面轮廓着色模型的性质与次表面(Subsurface)和预整合皮肤(Preintegrated Skin)着色模型非常相似, 但该模型只适用于高端皮肤渲染。如果希望模拟皮肤,尤其是人类皮肤,该模型为着色模型最佳选择。
双面植被 着色模型允许光线穿透材质表面,形成自然、统一的外观效果,比如光线穿透树叶那种效果。次表面颜色(使用此着色模型后可以访问的输入)用于定义光线穿透量,同时用于为叶片茎脉等部分创建遮罩。
单层水面:可以通过 单层水(Single Layer Water) 着色模型在使用 不透明(Opaque) 混合模式时实现透明水面的效果。这样可以降低需要使用 透明(Transparent) 混合模式的材质的使用开销和复杂性。更多详情请参阅单层水体着色模型。
薄半透明(Thin Translucent) 着色模型支持基于物理原理的半透明材质类型,可以通过该模型创建能准确处理高光度和背景对象的真实有色或彩色玻璃。
From材质表达式(From Material Expression) (或逐像素(Per-Pixel))着色模型是一种高级功能,用于通过材质图表中的逻辑将多个着色模型合并到单个材质(或材质实例)中。当 着色模型(Shading Model) 设置为 From材质表达式(From Material Expression) 时,着色模型 输入将变为可用,可以使用材质图表(Material Graph)中的 阴影模型(Shading Model) 节点进行设置。
各种材质的制作方法
玻璃制作
玻璃:细节面板要为使用此光照模式是因为这个效果最好但是性能消耗也最高,并且使用此光照模式的话需要通过
Thin Translucent Material节点来控制玻璃的颜色(只有在使用表面向前着色的光照模式下,才能更好的控制玻璃的颜色)。如果想要制作性能消耗较低的光照模式可以使用
屏幕空间反射的勾选和高品质反射可以进一步提升质量
景深后渲染影响的是玻璃物体是否受到景深的影响
玻璃有菲涅尔效应
玻璃的边缘不透明度高,中间不透明度低。
边缘折射率高,中间折射率低。
可以设置的折射模式介绍:
假反射的hdr贴图需要将贴图属性的srgb关掉
截图中的颜色是显示错误的,按照数值创建不会显示为白色
植被材质
混合模式改为已遮罩,着色模型改为双面植物,开启双面
two sided sign节点 :双面迹象(可以在做双面材质比如植物的时候配合multiply节点)
实现让法线贴图影响双面的效果。
想让草动可以加个simple grass wind 节点
(其中WPO应该连接color贴图这里图片弄错了,作用是提供植物图不让植物动时产生撕裂感。)如果是整个植物一起动那么就用world position和object pivot point(对象轴心点)和distance(测量距离节点)
(1,1,0目的是使植物不向上移动,那个黑白贴图是根据植物的UV绘制的,将根涂黑,使根不产生位置偏移。)
最终节点连接到世界场景位置偏移
简单的土壤材质制作:通过使用matlayerblend_standard节点配合vertex color节点制作可以使用顶点绘制控制土壤材质的混合材质
(vertex color节点还可以配合浪花贴图,制作出可以手动绘制岸边浪花效果的材质。)
各个材质函数基本连线:
地形材质
做地形材质之前首先要有一个 材质函数(在内容浏览器中右键→材质和纹理中找到),在使用材质函数时可以使用MakeMaterialAttributes节点,地形的UV坐标节点是使用LandscapeCoords,将节点细节中的映射缩放改为1
材质函数创建好后,可以在新建的材质中调用这个材质函数。FunctionInput为输入函数,调用时:(Grass为材质函数名字,UV为输入函数名字)
最后通过landscape layer blend节点将制作的各个材质函数混合到一起,预览权重改成1。
这里的layer blend 既可以连接贴图也可以连接材质。创建地形混合材质时,如果混合的贴图过多,在绘制时会出现这种编译不出来的情况,解决办法:将混合的材质的每个贴图的采样器源改为包裹
混合类型的功能区别:
混合类型 | 功能 |
---|---|
LB权重混合 | 如层来自外部程序,如World Machine,或需要独立绘制各层,而无需担心层顺序,即可使用此类型。 |
LB Alpha混合 | 如要绘制细节并需要已定义的层顺序,则使用此类型。例如,在岩石和草地上绘制雪层会遮住,但擦除后会显示下放岩石和草地。 |
LB高度混合 | 此与LBWeightBlend相同,但会基于高度图将细节添加至层间的过渡。利用此项,可进行如岩石间缝隙中的层过渡点出现泥土等操作,而不仅仅是岩石和泥土平滑混合。 |
此为 LB高度混合 的操作范例。正如所见,岩石缝隙间的层过渡点出现了泥土。如此便可在层交回处实现自然过渡。
LB权重混合的意思类似于PS中的:
两个不同的贴图使用同一个图层
LB Alpha混合类似于PS中的:
两个不同的贴图在不同的图层,权重小的不能够覆盖在权重大的上面,图层关系通过预览权重来决定(UE5教程是这样,但是UE4.26亲测不行,UE4.26是根据图层顺序排布的,看官方文档上说的预览权重影响的是材质编辑器上预览的权重大小。),预览权重高的在上面
使用Alpha混合时需要使用非权重混合层。其他两种方法使用权重混合层。
LB高度混合使用height图后高度效果只会影响同一权重的贴图效果而不会影响Alpha混合类型的贴图。
地形绘制出现黑斑的处理方法
官方文档描述:总结就是将默认地形材质层混合模式设置为LB_AlphaBlend
使用层混合模式的特定组合时,地形上不同层交叉的位置将出现大量黑斑。将LB_HeightBlend模式用于多地形层时,此问题尤其常见。LB_HeightBlend的工作原理是使用指定权重值调制层的混合系数或权重。如区域上绘制有多个层,且均被设为LB_HeightBlend,则可能特定区域中绘制的所有层将同时拥有0高度值,因此各层的理想混合系数将变为0。
由于无隐式或显式排序,且无层对该区域有贡献,因此结果会产生黑斑。由于混合法线贴图会产生法线值(0,0,0),且该值无效,会导致照明渲染问题,因此混合法线贴图时情况会更糟。针对此问题的解决方案是对其中一个层使用 LB_AlphaBlend,如以下范例所示。
左图中所有层均为LB_HeightBlend,会导致部分区域变黑。在右图中,红色"1"层已改为使用LB_AlphaBlend,从而解决该问题。
以下是混合起来的所有层的 Landscape Layer Blend 节点属性范例。务必注意 土壤 层将其混合模式设为LB_AlphaBlend,而其他层则设为LB_HeightBlend。此设置旨在避免发生上文中的问题(层交汇处出现黑斑)。
高级地形
:材质混合节点(和线性插值节点作用很相近,区别在于材质混合节点针对的是材质)
(常量偏差比例):默认功能是将数据都加上1然后都乘0.5,可以手动更改数值,可以配合sine实现数值的偏移。
第二个节点:此处节点作用是将切线空间转换为世界场景空间
此节点也可以设置其他的空间的转换:
整体:
地形自带植物效果:
LandscapeLayerSample节点:其中None为参数名,使用时将None改为
layer blend中的名字,作用是将混合的材质取样出来然后配合landscape grass output节点
实现地貌使用对应地形材质时上面附带植物。其中grass节点参数即植物类型可以通过
地形草地类型来创建。
如果有根据斜率实现混合材质功能时,如果不想让有高度的地形出现植物则可以使用以下方法。
地貌岩石材质
材质函数:
中间的节点为world aligned textures_complex
VertexNormalWS的作用是获取世界顶点坐标,和1,1,1相乘的作用是确保是三维数据。Normalize的作用是规范化,防止无限大无限小的值的出现。
海洋材质
越接近岸边海洋的折射率越低,通过控制。ref上方的结果是
海与其他物体交接处的透明度变化:
法线:
海浪波动效果(使海浪有起伏感):整体连接到world displacement(需要开启
)这里texture图片显示有错误,应该四个贴图都是一样的。
浪花:
使四张贴图混合的节点叫blend_screen。
与物体接触边缘海浪:
其中water_color可以扩展成效果是实现不同深度的地方水的透明度不同所造成的颜色差别。
角色材质
角色制作技巧
眼球:
眼球和眼睑外层制作湿润效果(透明)
内眼角和眼球的过渡:用来制造眼球到内眼角之间的过渡效果
男士睫毛要做的比女士睫毛短,双眼皮的睫毛比单眼皮的睫毛要长一些
从maya导出模型时设置:
人体材质
制作皮肤材质时着色模型选择次表面轮廓(次表面轮廓着色模型 的性质与次表面(Subsurface)和预整合蒙皮(Preintegrated Skin)着色模型非常相似, 但该模型只适用于高端皮肤渲染。如果希望模拟皮肤,尤其是人类皮肤,该模型为着色模型最佳选择。)其中不透明度控制的是次表面散射的强度(光透过去效果的强度,为1时是完全开启的)其中subsurfaceProfile通过右键
创造(整理时将次文件放置在新创建的DataTypes文件夹里,方便整理)命名规范举例:SSS_ColorSubsurfaceProfile。
次表面描述文件作用是可以通过参数调节次表面散射的颜色和衰减效果等。即描述次表面的文件。
皮肤毛孔
两张贴图第一个是控制粗糙度贴图,第二个是法线贴图,首先将第一个贴图的srgb关掉,将调整属性中的最大透明度改为0,在复合属性中
。这样调整后使用第一张贴图的alpha通道来实现效果
眼睛材质
详细解析网站:https://www.bbsmax.com/A/obzbDw665E/
眼球材质的着色模型为眼睛,混合模式改为遮罩。
眼球的虹膜边缘有轻微黑色的叫角膜缘
布料材质
要制作不了材质首先要了解布料的特点,布料外边的绒毛在受到光的照射的情况下是发白的。因此做布料要制作边缘发白的效果。
UE4提供了专门的布料的着色模型,因此制作材质时首先更改为布料的着色模型,改为布料的着色模型后会为材质自动带有边缘发白的效果。材质属性变为这个:其中Fuzz Color控制的是绒毛的颜色,Cloth控制的是边缘发白的强度。
各种材质效果的实现
摄像机的距离测量公式
调节法线强度节点连线
置换材质效果的制作
首先更改
其中无裂纹置换的作用:防止出现这种情况
如果出现模型闪烁的情况可以增大模型的边界缩放的值
制作置换效果时:其中乘以40时为了控制置换强度,乘以vertexnormalws是为了使置换效果应用的方向正确。20连接到曲面细分乘数的作用是通过材质增加模型的细分程度(平时使用不需要给那么大给20是为了效果明显)。
使用vertexnormalws的效果:左边为没有使用,右边为使用。
此效果通过连接到世界场景位置偏移实现,但是需要模型自身具有较高的细分,因为世界场景位置偏移是通过更改顶点的位置实现的。它与置换的区别在于置换是虚幻四替你进行模型细分。
还有一个实现此效果的方法是利用视差,视差不会更改模型本身,视差是一种视觉特效。
消融动画效果的实现
配合SP为基础材质增加控制各种mask的效果(mask可以为控制灰尘Dust区域,边缘Edge区域,污垢Dirt等)
为了获得相应的mask贴图,需要在sp中增加相应的通道,
其中User012可以更改名称,在SP中分别为User012通道绘制对应效果的遮罩,然后将3个通道合并成一个Mask贴图,最后将Mask贴图和未应用基础材质时的法线贴图一起导出。
通过色温的数值控制颜色的变化(适用于自发光物体)
通过BlackBody(黑体),配合multiply来控制灯光强度。
注意:要想使自发光物体影响场景需要勾选勾选
顶点动画
雨打函数(下雨时植物的上下晃动动画)
其中localmask和worldmask均为noise贴图。
涟漪函数
通过材质实现模型自转:
在材质中实现模型自转占用的是gpu的性能,而利用c++或者蓝图或者sequence等实现模型自转占用的是cpu的性能。
纹理
纹理流送池
该纹理池的大小控制着实际用于要显示的纹理的空间量,
在制作场景时左上角可能会出现红字多少多少GiB预算上的纹理流送池。
虚幻默认的纹理流送池大小为2000MB,如果要更改纹理流送池的大小那么可以通过控制台输入
r.Streaming PoolSize 3000 其中3000是你想要更改的纹理流送池大小(单位是MB)
如果场景的纹理尺寸超过了纹理流送池的大小,那么虚幻将会通过Mipmap来降低纹理质量,这样会导致纹理模糊。
也可以通过项目文件夹中的DeaultEngine.ini文件中更改项目默认纹理流送池的大小。
纹理尺寸与Mipmaps
Mipmap只支持2的n次幂的纹理大小
Mipmap的关闭: 无mip贴图的设置通常适用于HDRI贴图和UI贴图上面。
还可以通过使用不同的锐化等级或者模糊等级来额外控制贴图是否模糊或锐化。
左侧为启用mipmap,右侧为未启用mipmap
纹理文件格式和纹理压缩
无论导入的纹理是什么格式的(TGA,PNG等),导入到UE4后,纹理都会被压缩成同一个格式的。
纹理压缩的设置:通常只会使用前三个和HDR的设置,例如是法线贴图就使用Normalmap 灰度图就使用Masks(要想更高质量就用grayscale r8,需要确保只有一个通道)bc7格式需要满足dx11,bc7格式质量更好但是消耗内存会更大,bc7一般是如果分辨率较低的贴图才有可能会去使用。
纹理组的使用
此处可以更改纹理组,默认情况下所有的纹理导入进项目中都将归为world组,导入纹理后可以为纹理归为不同的组,例如人物,武器,载具,虽然只进行组的归类并不会产生什么效果,但以后如果想要优化就可以针对组进行管理优化。
这些组其中除了UI和Color Lookup Table会更改纹理的效果控制,其他的组均没有额外控制,只是便于管理使用。
使项目针对不同设备对已经整理好的纹理组进行优化:
渲染目标
渲染目标本质上是虚幻引擎或编辑器生成的纹理
在虚幻编辑器中通过过程化生成的纹理就是渲染目标,例如在材质编辑器中中通过noise节点创建的noise纹理还有通过场景捕获创建出来的纹理(通过搜索场景捕获可以创建),。渲染目标占用的性能要更高。渲染目标会导致着色器开销过高。
渲染目标的使用可以实现雪的实时互动和水的实时互动等效果。
虚拟纹理
https://zhuanlan.zhihu.com/p/127051539
将贴图转换为纹理对象的好处
将贴图转换为纹理对象再使用贴图采样节点使用贴图的好处是多次使用同一张贴图时这样更节省纹理内存。
对象
视窗、世界、物体和切线空间
世界空间:世界空间是恒定的,不管场景发生了什么,世界空间坐标系都不会改变。
物体空间:物体空间坐标系是随着物体改变的,随着物体的旋转平移,物体坐标系也会随着改变。
摄影机空间(视图空间):摄影机空间坐标系由摄影机的照射位置为Z轴。
切线空间:切线空间是每个顶点都有对应的坐标系,坐标系的xyz是由法线,边法线,切线组成,边法线和切线能够代表UV坐标的U和V
如果是不同空间的向量,它们如果要进行运算就需要将它们转换为同一个空间。
使用PS制作一张不同通道存储不同灰度图的贴图
首先新建一个跟灰度图相同大小的文档分离出来三个通道
将三张贴图导入到不同通道的图层上,然后与背景合并起来。(Ctrl+E快捷键:是当前活动的操作图层和下一个图层合并。,Shift+Ctrl+E快捷键是合并可见图层,就是指图层前面有眼睛的图层都会被合并为一个图层。)最后合并通道
选择RGB颜色模式
sRGB与伽马矫正
给人看的就打开srgb,给电脑看的就关闭srgb(法线,金属度,粗糙度等贴图)。
Alpha通道
可以通过此方法添加Alpha通道,UE4对Alpha通道的压缩成都是很低的,如果使用Alpha通道会使图片容量大幅度提高,可以通过此选项使不使用Alpha通道
。
光栅化与前向渲染与延迟渲染
这里延迟渲染中介绍的G缓存中的图像合成就是可以将点光源当成周围有一个白色的球体遮罩,不同光源可以重叠相加在一起。
延迟渲染因为会生成各种缓存所以会占用带宽,因此VR中一般不使用延迟渲染而使用前向渲染。
遮蔽剔除和半透明材质
计算遮蔽关系
在一个场景里会包含大量物体,渲染时,被遮挡的物体是不用被渲染出来的。
所以需要进行遮挡关系的计算,通常来说主要有以下几点:
距离剔除、视锥剔除、遮蔽剔除、深度检测若出现半透明物体的渲染排序问题时,可以通过更改半透明排序优先级来进行调整。
纹理采样
极坐标
把一张普通的贴图转换成极坐标形式可以直接用这个节点:VectorToRadiaValue
原来的纹理:
经过节点转换后的纹理:
节点的X Y 通道:
制作技能CD的效果:
只利用的他的x坐标,他的x坐标逆时针的大小是从1~0,所以给他慢慢加上0~1,这样他的x坐标就会慢慢的变成2~1。
马赛克贴图的制作
控制材质预览窗口的自动曝光
消融材质效果制作
首先将材质属性的混合模式更改为masked
消融效果:
增加边缘效果:
还原ps图层混合模式
multiply节点对应着ps混合模式中的正片叠底(注意图层顺序是相反的)
Blend_ColorBurn 对应着ps的颜色加深混合模式,公式为
ue4中有ps全部混合模式的算法的材质函数,只需要搜索混合模式的英文名称即可找出对应的材质函数。
顶点着色器
WPO
PDO
PDO对应的是像素深度偏移(深度偏移即是像素离你的远近的偏移),可以通过控制像素深度偏移来制造材质边缘柔和的效果
进阶边界混合
注:Normal贴图对应WAN节点,其他例如base color ,roughness都可以使用WAT节点。
基于世界坐标投影贴图,使不同物体在纹理的衔接更好。
视差原理
视差和置换相比,他是配合高度图,和camera vector来实现效果,如图所示节点连法(等同于bump offset 节点)。
等同于
使用此原理实现的效果 相比置换的优势在于它不需要模型拥有很高的面数。
材质参数集
材质参数集的作用是 将材质参数集的参数放入到其他多个材质中,只需要调整材质参数集中的参数即可控制全部使用材质参数集的材质的参数。
光照函数材质
材质中,光照函数材质是赋予聚光灯 点光源 等光源的材质,可以制造假投影的效果,针对图形的数学运算(例如旋转,平移,缩放)都可以在材质中实现,但是颜色是受灯光的颜色控制的。
后期处理材质
在材质中更改
scene texture 节点,只能在后期处理材质中使用
BRDF 双向反射分布函数
高光
subsurface scattering 次表面散射
次表面散射简称SSS
具有次表面散射特性的物体有植物(树叶,荷叶),皮肤,冰面,大理石,蜡烛,牛奶,雪。
次表面散射是厚度敏感的,例如人的皮肤,越薄的地方次表面散射效果越明显
在Bridge导入到UE4的植物的材质中提高SSS强度的数值会增加穿透过植物的光线量
SSS color tint控制的是穿透出来的颜色,一般不需要更改
color variation控制的是植物颜色变化(使叶子的颜色不那么统一)如果要更改数值,一般给很小的数值,0.02左右。
在UE4中制作SSS效果的材质:植物材质的着色模型给双面植物开启双面混合模式改为已遮罩。
其他的一些SSS材质着色模型改为次表面。
通过不透明度的大小来调整SSS的强度
折射
折射是厚度不敏感的。例如玻璃
如果折射出现了这种奇怪的效果,可以通过更改,更改的这种折射模式适用于水这种大型折射表面。
环境光遮蔽的正确使用
为了让环境光遮蔽效果更好 需要通过lerp节点控制高光的产生区域,使用lerp目的是在即使只有动态光照的情况下也能够显示正确的环境光遮蔽效果。