Loading... 🐸本文为虚幻官方材质课的学习记录,并不完全,在此按我的个人需求记录了如下笔记。**这一篇是基础篇**。 🐸这里是bilibili基础篇[链接](https://www.bilibili.com/video/BV1fX4y1N7Fw?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=95a1cfccd5b1e6779677de477b25aa31) > 因为B站录制视频有瑕疵和卡顿,你可以转到[这里](https://dev.epicgames.com/community/learning/courses/pxm/unreal-engine-creating-pbr-materials/VvZ/unreal-engine-creating-pbr-materials),去看原视频链接,这个链接是基础篇的, 🐸这里是bilibili高级篇[链接](https://www.bilibili.com/video/BV1sy4y127HZ/?spm_id_from=333.788.video.desc.click&vd_source=95a1cfccd5b1e6779677de477b25aa31) 🐸**加油 ! 加油 !** --- # 一:了解材质: ## 🚩PBR(Physically-Based Rendering): 基于物理的渲染。它提供了一种光照和渲染方法,能够更精确的描绘光和表面之间的作用。PBR流程能更真实的模拟光照和材质之间的物理交互效果。 - 直观便于理解 - 物理上更具准确性 - pbr基于物理定律,如能量守恒定律和平方反比定律(Inverse-square law) - pbr材质在不同的光照下会表现的更一致 - 使用真实的物理测量单位表示亮度 - Lumens(流明),Lux(勒克斯) 💡简单来说基于物理的渲染本质上是通过: - 材质 - 灯光 - 曝光 这三大部分控制的组合结果。 ## 🚩Primary PBR Inputs: - Base col(基本颜色) - Metallic(金属度) - Specular(高光) - Roughness(粗糙度) ### 🏕️Base color(Albedo) - flat color,没有任何光照信息(没有高光和阴影) - 只保存颜色信息 - 可以是linear RGB,也可也是一个Vector3 - 各个通道的数值位于0到1之间(纯白和纯黑会导致一些场景的曝光问题) ### 🏕️Metalic - Gray scale - 数值在0 到 1的区间,不包含任何色彩信息 - 金属最正确的设置方式是全开或全关 - 数值为0时,材质底色是diffuse - 数值为1时,材质底色是specular/reflection color - 示例图: ![图片](https://cos.toalan.com/alan_image/707dd9e8008e4c8196878e22a532f990.png) ### 🏕️Roughness - Gray scale - 数值在0 到 1的区间,不包含任何色彩信息 - 数值为0时,无限接近于镜面反射 - 数值为1时,为粗糙表面 粗糙度是能量守恒的体现。 ### 🏕️Specular - 控制高光和反射(specular highlights and reflections) - Gray scale - 一般情况下保持default value 0.5就可以了 - 通常情况下,我们通过调整Roughness来调整高光质感 - 正常世界中,所有物体都有一定程度的反射和高光效果,所以千万别设置为0 示例图: ![高光](https://cos.toalan.com/alan_image/5ec3c1a0ed0147e8b5140f4d8ab079bc.png) ## 🚩UE支持的图片文件的格式(常用): - simple Alpha通常被用于植被 ## 🚩贴图规则: - 最大支持8k - 长宽必须是2的指数幂(512,1024,2048) - roughness,metallic,specular均不需要rgb通道,所以直接储存为gray scale导入UE。这样他们就会被自动设置成灰度图,并且不会启动sRGB或者Linear的颜色空间 - Normal 贴图也同理,不需要使用sRGB - HDR 也不需要使用sRGB,因为它的取值一般会超出范围 - <font color=#F36208>sRGB只适用于颜色贴图(导入需要确保灰度图没有勾选sRGB)</font> - 所有的灰度贴图只要储存形式正确,那么UE会直接自动设置为禁用sRGB - 所有的base col应当将压缩格式设置为DXT1(在贴图设置选项中,compression也可以自行更改,如果格式正确,那么UE会自动为你设置好它的compression setting) ## 🚩贴图导入方式: - 直接拖入项目 - 右键在content browser选择import Assets ## 🚩UE材质编辑器tips: - 双击节点之间的连线,创建dot整理节点 - c,创建comment,用来注释 - ctl+拖动节点连线来改变节点连接输出的位置 - clean up删除此节点图中的孤立节点(unused node) - connector改变节点显示方式 - T,创建texture sample ## 🚩混合模式: 在Material中,可以找到**Blend Mode**和**Shading Mode**这两项,这两项十分重要 ### 🍭Blend Mode: - **Opaque 不透明** - 多数不透明材质的基本设置 - **masked 遮罩** - 显示有mask遮罩的材质 - 背面默认不显示,需要开启two sided - **Translucent 半透明** - 通常使用在半透明材质,玻璃等有折射的材质 - 同时控制opacity与refraction来调整效果 - Translucent一般情况下以最简单的方式计算半透明,以节约开销 - 如果想提升半透明材质的效果,需要来到Translucency的选项下,勾选Screen SPace Reflection,并把Lighting Mode改成Surface ForwardShading;这两个选项能让我们获得最高质量的半透明材质。开启这两个选项后,着色器需要更长的时间编译。 - **additive 叠加** - **Modulate 调制** - **AlphaComposite(Premultiplied Alpha) alpha复合(预乘Alpha)** **Translucent:** ![图片](https://cos.toalan.com/alan_image/80a39c23fca34850940fbe38c653624f.png) ### 🍭Shading Mode: - **Default Lit** - 通常的光照设置,材质受光照影响 - **Unlit** - 材质不受光照影响;这种模式下允许表面产生自发光 - **subsurface** - 次表面散射,如皮肤和蜡烛 - **clear coat** - **two sided foliage** - **hair** - **cloth** - **eye** #### 🍌subsurface scattering - 将Material的shading mode设置为subsurface - 主要使用两个矢量(base color和subsurface color)和两个标量(opacity和roughness) 示例: ![](https://cos.toalan.com/alan_image/2e2e286075cf4779aabe7ac4c3dac80c.png) ![次表面](https://cos.toalan.com/alan_image/cdca7b5bdceb488cb2b73926961df99d.png) ## 🚩创建一个简单材质: - 当我们给mesh更换材质,或应用新材质时,需要在静态网格编辑器(Static Mesh Editor)中打开mesh,并且在右侧Detail面板下更换指定新材质 - UE支持多材质对象。一个mesh可以有多个elements并指定材质 - 最好遵从材质命名规则,如Material最好以**M\_name**这样以M为前缀来开头 - T for texture sample,选择我们需要的贴图 - 基础材质创建使用的大多数是:base col, roughness, normal ## 🚩继续简单材质: - 如果希望在贴图中预览并使用到UE的content,则需要再texture的选项里打开**show Engine Content** - ![](https://cos.toalan.com/alan_image/02e238d2ad1b49aaa8b0092c091197cf.png) - **反转黑白可以使用(1-x)One Minus** - **混合:Multiply(M)** - **相加:Add(A**) **注意,一般白色代表1,黑色是0,所以要用数学的运算去想上述这些操作。 - 使用constant与贴图Multiply,以达到控制灰度的效果,或使贴图与相应选区进行混合 - **常用噪波:perlin noise** - **线性插值:Lerp** - 利用alpha通道混合a,b两个图层 - **常用扁平法线:flatnormal** - **平铺纹理:Texture Coordinate** ## 🚩使用DataSmith从其他DCC软件导入材质到UE: ![](https://cos.toalan.com/alan_image/56b441818adf44b1bea5c0ebfa02adbf.png) 简单解释就是其他的软件制作好的材质会被以一种datasmith提供的方式转换到ue中,但是有些情况下是无法正确转换的。需要额外自行修正,并且灯光也不会被预先烘培。 --- # 二:创建PBR材质(基础) ## 🚩主材质实例: - 实例化材质可以为我们的主材质创建副本,然后用来代替主材在项目中使用 - 实例化材质的优点: 1.节约时间,可以通过公开主材质的某些参数,进一步调整实例材质而无需重新编译着色器。 2.对主材质进行的改动也会更新到所有的材质实例。 3.仅需要根据材质特性创建主材质,然后实例化材质应用到所有的类似材质上。 ## 🚩公开材质参数: - 右键相应节点,convert to parameter并重命名 - ![](https://cos.toalan.com/alan_image/f33e5e67e0fa48938422e0e9cac93d4f.png) ## 🚩switch: - **Static Switch Parameter**,静态开关参数 - 使我们开启或禁用某些功能 **示例:** 当True的时候,开启base color与纯色相乘,为False时则关闭相乘,仅显示base color ![](https://cos.toalan.com/alan_image/5832f517bd544b439bef954fd2c91b29.png) ## 🚩实例材质的优先级以及参数最大最小值: **当制作材质的时候,可以修改材质参数的优先级方便使用**![](https://cos.toalan.com/alan_image/83f2246201164b659385e3cee5a583f4.png) **我们可以通过修改Group和sort Piriority来实现** - 只需要选中group中的“None”,将None改为我们需要的组名 - sort Piriority为0的组会优先出现再我们的分组中,依次是1,2,3的组 - 分组需要按需求比如tex,utility,uv之类的功能不同的节点可以分开设置,并自行定义优先级 **示例:** 此时所有的参数就被归档在我们定义好的组中。 ![](https://cos.toalan.com/alan_image/342cec7937274ed59b9e1f85da6cc6e6.png) **✏️可以给参数滑块设置最大最小值,使可以调节的范围不超过我们设定的值** ![](https://cos.toalan.com/alan_image/e05bec049b42427fbf6adc1c21462f1a.png) ## 🚩动态材质: **材质一般在UE中分为两种:** 1. 静态材质 2. 动态材质 - 动态材质让我们在运行的时候实时调整 - 创建变量用于存放颜色值 - 创建自定义事件,用于蓝图通信 **Actor:** ![动态材质实例](https://cos.toalan.com/alan_image/9095b841ffce474cb32cef2e7ed114ea.png) ## 🚩编辑level Blueprint: ![关卡蓝图节点](https://cos.toalan.com/alan_image/488f61b13ae14e9ea2b8fa8c2e93dd16.png) ## 🚩材质参数集合,创建全局参数集(Parameter Collection): - 创建材质参数集 Material Parameter Collection - 添加2个Scalar Parameters,和1一个Vector Parameters - 这是为了统一控制我们材质实例里的参数,统一管理 - 进入一个材质蓝图里,通过CollectionParameter,设置参数,然后与之前节点相乘 - 注意:Vector(矢量)它是一个4维数,而颜色是三维,如果相乘会出现报错,使用Mask来进行遮罩。 - ![图片](https://cos.toalan.com/alan_image/c53ce24250584ec0bda25cd97e90408d.png) ## 🚩材质参数集合,第二部分: - 现在想要实现:允许用户点击后,更改其中的一个全局参数 - 需要在level BluePrint里进行编辑,与Actor部分相似,前半部分判断鼠标点击以及获取用户行为的蓝图操作是一样的(在我的基础篇笔记上篇) - 之后,判断点击对象,确保在视窗内选中正确对象然后 create reference带入蓝图 - ![](https://cos.toalan.com/alan_image/9ac16ebfd9b34a99935941126c4a36f1.png) - 选择正确的目标进行判断,并设置好rendom vector。 - compiled,此时play就会看见随着鼠标点击,全局对象也可以随机改变颜色了。 ## 🚩材质函数: - 材质函数就是材质图表中可以反复使用的自定义代码片段 - 它的好处是可以把复杂的材质图表转化成拥有单个输入输出的单个材质节点 - 更改代码中的函数,所有实例也会同步修改 ### ✏️此时的案例要实现的是uv tiling。 - 经常可能会用到贴图的UV平铺和平移速度设置,还有贴图旋转,那么我们就可以把这些功能放到一个材质函数里 - Panner是控制贴图平移速度和时间 - CustomRotator有两个参数,一个设置旋转中心(向量Voctor),一个设置旋转角度(Angle) - 记得点击空白位置,在细节面板设置Export to library,确认勾选。 - ![材质函数Tiling](https://cos.toalan.com/alan_image/e62ae240dbc64cd9bd5bbb09e81a86cf.png) - 在节点蓝图里使用,将参数暴露即可 **数据迁移:**![](https://cos.toalan.com/alan_image/e9988771403d4391beb820aacb27e9d4.png) - 此方式能够将做好的材质函数迁移到其他文件使用 - 当然也可以通过这种方式迁移别的需要的资产 ### ✏️另一种材质函数的方式:CustomNode ![](https://cos.toalan.com/alan_image/dfd84643b502422ab8d91f46d82f2e51.png) ![](https://cos.toalan.com/alan_image/e982d93c5bc94881903c2ffe8c0c01f8.png) - 这种方式通过hlsl语言来创建材质函数,得到自制的材质节点 - 设置的input name需要与code的名字匹配 - 定义hlsl并不像内置的材质表达式,且无法被优化 - ![](https://cos.toalan.com/alan_image/d800c25bb6204438837d4dee128e9776.png) --- # 三:实例创建不同的材质演示: ## 🚩clear coat制作类似车漆质感: ClearCoatBottomNormal节点,需要在项目设置里搜索clearcoat开启,二次发现开启。 这样就可以设置第二层的法线了。 透明涂层是一种很实用的着色模型,一般用于任何拥有透明漆面或者透明薄膜效果的表面如:这是一种常见于车漆的涂层,上过油的陶器和餐具、家具和建筑装饰,能够让粗糙的家具有打蜡的效果或者抛光(红木家具) ## 🚩Two-Sided Foliage 双面植被: 设置材质的混合模式(Blend Mode)为:Masked 材质的着色模型为(shading Model)为:Two Sided Foliage双面叶 添加贴图以后发现没有双面显示,开启双面显示Two Sided 次表面颜色连接以后,通过自定义函数双面纹理处理(TwoSidedTextureuring)来控制叶子的上下面的颜色强度。 ![双面纹理处理](https://cos.toalan.com/alan_image/5f7c1b761acc40c2b1fd2f65fc6109ce.png) 如果场景大量使用植物、树木这种半透明材质,推荐使用这种渲染模式,mask+TwoSiedFoliage,可以更节省开销,但是这种的效果并不会很好。 ## 🚩布料着色: 想要使用布料材质,需要设置材质的混合模式(Blend Mode)为:Opaque(不透明) 材质的着色模型为(shading Model)为:Cloth(布料) 如果用类似窗帘这种双面都需要看到的,需要勾选TwoSided 限制Alpha参数大小使用Clamp节点 混合角度矫正法线函数节点:BlendAgnleCorrectendNormals 毛绒着色节点:Fuzzyshading ![学习节点记录(未整理请见谅)](https://cos.toalan.com/alan_image/7de84c5a5efc4728a4a8300eed1b2ef5.png) > **小tip**:如果有时候近处被裁切影响放大观察,则可以去Output Log的cmd中输入:r.SetNearClipPlane 1,将相机近景裁切更改为1 ## 🚩染色玻璃: **方案步骤:** 1. 使用顶点色,来打造有色玻璃的效果,并且玻璃的着色颜色仅显示在最厚的部分 2. 使用UE中的内置函数,给玻璃表面添加磨砂或者模糊效果 ### 🐢**第一部分:创建基础玻璃** - 创建material,使用blendMode为 Translucent,shading mode保持Default Lit。 - 随后去到Translucency的选项下,lighting Mode选择使用Surface ForwardShading或者Surface TranslucencyVolume,开启质量较高的着色选项。开启后可以发现material可以使用metallic,roughness等通道了。 - 设置一个简单的折射控制,使用fresnel作为Lerp,alpha来设置边缘到中心的折射参数。玻璃的IOR差不多设置在1.2-1.52之间。 ![](https://cos.toalan.com/alan_image/fde717a2383b461eb1f29c627be25905.png) ### 🐢**第二部分:加上玻璃边缘的磨砂绿色质感** 一般来说如果一个模型需要定点着色,在建模的时候就要把需要着色的定点给标注出来,当然虚幻也提供了一些工具来使用。 在最新版本的虚幻引擎需要使用Shift+1/2/3/4/5 来切换不同的编辑模式。 笔刷调整大小可以使用快捷键\[ \] 记住黑色为0,白色为1,可以理解为遮罩 使用Vertex Color节点和基础颜色相乘,以添加颜色。 ### 🐢**第三部分:使用菲涅尔改进色调真实度** 使用菲涅尔函数(fresnel_function)改色 使用Lerp节点混合内外颜色 **关于Fresnel节点** 可以去看这篇文章:[Understanding the Fresnel Effect – Dorian Iten (dorian-iten.com)](https://www.dorian-iten.com/fresnel/) - **菲涅尔效应**:这是一种反射现象,指的是光线在不同角度入射到一个物体表面时,反射的亮度会发生变化。作者用一张桌子的图片来说明这一点。 - **入射角**:要理解菲涅尔效应,就要知道反射的基本原理。其中最关键的是入射角,即你的视线和你看的物体表面之间的夹角。 - **距离和曲面**:作者还举了另外两个例子,说明反射会随着距离和曲面的变化而变化。当你看向离你近的地面时,入射角很陡;当你看向远处的地面时,入射角变小,反射就更明显了。在一个圆柱体上,菲涅尔效应导致反射最明显的地方是在红色区域。 ![Fresnel效果图](https://cos.toalan.com/alan_image/64249137fd0b4829ac8d0c4da5dca37d.png) ![玻璃细节处理节点图](https://cos.toalan.com/alan_image/dae16f436ded4e68a083d3ed7cd6302a.png) ### 🐢**第四部分:设置一些磨砂效果** ## 🚩置换贴图,模拟毛毯地毯一类: > **发布支持DX11显卡时,引入了一项全新的硬件功能:real-time Dynamic Tessellation Geometry。使我们能够使用置换纹理贴图在显卡上增加对象的多边形面数,由此显著提升了对象的物理细节而无需真正对此细节进行建模。** ## 🚩顶点动画,创建窗帘随风吹动的效果: --- 终于刷完了!有种左耳朵进,右耳朵出的感觉。可能后续还要再重新学习。 --- 转载地址: [ZeTiiCannotStop](http://example.com/) Last modification:November 4, 2023 © Allow specification reprint Support Appreciate the author AliPayWeChat国外 学生请勿打赏·把钱拿去读书 ● 赞助名单 Like 服务器每月≈300块,我快顶不住了┭┮﹏┭┮