3.灯光
灯光大小对应物理值
1.灯光层级
设置灯光的照射层级
模型渲染器设置接受照射层
Window > Rendering > Lighting
打开灯光设置
Scene:场景灯光配置
Environment:环境光配置
Baked Lightmaps:烘焙灯光数据
2.场景光源配置
1.Reatltime Lighting:实时全局光照
Indirect Resolution:分辨率,越大效果越好越销毁性能。
2.Mixed Lighting:混合光照
3.Lightmapping Settings:灯光烘焙设置
4.workflow Settings 工作流设置
设置灯光探针显示
3.Environment:环境光配置
环境光,这里设置的环境光照针对整个场景。可以使用其他体积内容独立设置区域的环境。
这个如果不设置会使用Graphics 图形设置的全局默认体积设置的内容。在场景中添加全局的体积会替代上面2种方式添加的环境。
Static Lighting Sky: 使用配置里面设置的内容进行光照
PhysicallyBasedSky:基于物理的光照
GradientSky:颜色渐变光照
HDRI Sky:
Static Lighting Background Clouds: 配置的云层内容进行光照
CloudLayer: 云层
4.材质Shader
1.内置渲染管线材质转HDRP材质
1.在向导里面
2.在编辑-渲染-材料里面
下面3项是对当前项目进行材质球升级到HDRP渲染管线
ConvertAllBuilt-in Materials to HDRP 全部内置材质更新到HDRP
Convert Selected Built-in Materials to HDRP 选择到的材质更新到HDRP
Upgrade HDRP Materials to Latest Version 更新到最新版本的HDRP
2.内置HDRP材质
1.常用着色器
Lit 着色器:可用于模拟大多数材质效果,是 HDRP 中最常用的着色器。
LayeredLit 着色器:可在同一个材质上叠加多个 Lit 材质,并使用遮罩来对材质做分层,确保在需要的地方显示正确的材质。
LitTessellation 着色器:可用于为物体表面添加更多自适应的顶点细节而无需为模型添加更多的顶点。
Lit Tessellation 比 Lit 多了一个 Tessellation Options 选项区。Lit Tessellation 可认为是 Lit 着色器的升级版本,当然性能上也会更费一些。
LayerLit Tessellation 着色器:与 Layered Lit 着色器功能一样,区别是它使用的材质是 Lit Tessellation 而不是 Lit。
Lit 着色器是 HDRP 高清渲染管线中制作材质时最常用的着色器。它可被用于模拟大多数写实类的材质(后面我们也会看到,其实 Lit 也可以用于卡通类材质的制作)
Surface Options(表面选项)
用于控制材质的总体表现效果。在这里我们可以选择物体表面类型(Surface Type)是不透明的(Opaque)还是透明的(Transparent)
材质类型(Material Type)HDRP 支持其他材质类型:
Standard 标准材质类型
Subsurface Scattering(次表面散射),
Anisotropy(各向异性),
Iridescence(彩虹色),
Specular Color(高光色),
Translucent(半透明)。
Alpha Clipping:透明镂空
Threshold:透明镂空插值
Use Shadow Threshold: 是否使用镂空阴影
Receive Decal : 接受贴花
Surface Inputs(表面输入)
HDRP 默认支持 Metallic/Smoothness 工作流(当选择材质类型为 Specular Color 时,HDRP 也可以支持 Specular 工作流)。
通过控制Metallic(金属度)和 Smoothness(光滑度)这两个参数,参考现实世界中的数值,我们可以模拟大多数写实类材质。
此处我们可以关联大多数所需的纹理,比如基础贴图(Base Map),遮罩贴图(Mask Map),法线贴图(Normal Map)等。我们也可以控制纹理的平铺(Tiling)和偏移(Offset)数值。
DetailInputs(细节输入)
这里可以关联一个额外的细节纹理,用于为物体表面添加更多微观细节。
EmissionInputs(自发光输入)
此处用于控制所有与自发光相关的参数。我们可以控制自发光颜色,强度等。
Advanced Options(高级选项)
更多高级功能,比如启用/禁用 GPU Instancing,
高光遮蔽模式(Specular Occlusion Mode)等。
如果我们选择表面类型为透明(Transparent),材质界面还会出现额外的Transparency Inputs(透明输入)参数区
这里我们可以选择当前透明物体适用的
折射模型(RefractionModel),
折射率(Index Of Refraction),
厚度(Thickness),
透射颜色(Transmittance Color)
以及透射吸收距离(Transmittance Absorption Distance)参数。
一个基本工作流如图:
2.专用着色器
1.Eye Shader(眼球着色器)
眼球着色器可用于制作各种类型的眼睛(不仅限于人类的眼睛)
要正确使用Eye Shader,我们首先要了解典型眼球的结构组成
2.Hair Shader(头发着色器)
头发着色器可用于模拟长毛和短毛。它是基于发卡(Hair Cards)方式来渲染毛发的。每个发卡代表整体毛发的不同部分。因此如果你使用的是半透明发卡,你就要手动排列这些发卡的前后次序,确保从任何角度观看都不会出错
3.Fabric(布料)着色器
目前HDRP 有两种布料相关的着色器,分别用于模拟光在表面发生散射的布料(比如棉布,羊毛,亚麻布等)和带各向异性效果的布料(比如丝绸)。
Cotton/WoolShader(棉/毛着色器):可用来制作棉布,牛仔布,羊毛,亚麻布和天鹅绒(如图 8 所示)。组成布料的纤维类型和编织方式都会影响布料的外观。自然纤维通常更粗糙,也因此会让光发生散射。
Silk Shader(丝绸着色器):可用来制作丝绸,缎子,尼龙和聚酯纤维(如图 9 所示)。丝绸和其他人造纤维更光滑的原因是由于它们是由单根光滑细丝编织而成。当我们使用这些纤维来编织布料时,得到的布料会自带各项异性的高光。
上述布料着色器都可以添加Thread Map 和 Fuzz Map 来为布料表面添加细节。
4.Terrain Lit Shader(地形着色器)
用于在HDRP中应用到Unity的Terrain上。此着色器是一个简化过的Lit着色器。
5.Decal Shader(贴花)
贴花可被用于为物体表面添加更多细节,而且使用起来非常灵活便利。我们可以使用同一个纹理,通过缩放旋转操作,在场景中不同的位置和物体表面上重复利用,达到即为场景添加了丰富的细节,又能有效节省内存的目的。
6.Unlit Shader(无光照着色器)
无光照着色器不受场景灯光的影响,因此非常适合用于制作UI 这种不需要接受光照的组件。
3.Shader Graph工具
自定义Shader工具:Shader Graph,这个要使用的时候在来详细查看
文档:https://docs.unity.cn/Packages/com.unity.shadergraph@12.1/manual/index.html
在资产界面创建资源:
双击这个进入编辑界面:
4.HDRP材质样板
在包管理里面HDRP里面可以选择材质样板导入
导入后的资源:有贴花,眼睛,布料(麻布和丝绸),头发和其他金属,树叶,皮革玻璃等样板
第二套详细的材质需要Git下载
https://github.com/Unity-Technologies/MeasuredMaterialLibraryHDRP
这套材质库包含以下分类共300个写实类行的材质:
塑料
织物
皮革
木材
金属
橡胶
碳纤维
镜子
车漆
这套材质非常适合用于建筑建造,汽车设计等项目中。当然,如果性能合适,你也可以应用到游戏项目中。
5.新粒子系统?
Visual Effect Graph 是一个可用于为 Unity 项目创建大规模视觉效果的包。Visual Effect Graph 利用 GPU 模拟粒子行为,可模拟的粒子数量远远超过内置粒子系统。如果要创建包含大量粒子的视觉效果并且需要高度可自定义的行为,请使用 Visual Effect Graph 而不是内置粒子系统。有关安装和使用 Visual Effect Graph 的信息
https://docs.unity.cn/cn/2022.1/Manual/VFXGraph.html
https://docs.unity.cn/Packages/com.unity.visualeffectgraph@12.1/manual/GettingStarted.html
6.贴花和投影仪,体积雾
1.贴花和投影仪
属性-描述
Size投影器影响盒体(因此也是沿投影平面的贴花)的尺寸。投影器会缩放贴花以匹配 Size 的 Width(沿本地 X 轴)和 Height(沿本地 Y 轴)分量。
Projection Depth投影器影响盒体的深度。投影器会缩放贴花以匹配 Projection Depth。Decal Projector 组件沿本地 Z 轴投影贴花。
Material要投影的贴花材质。贴花材质必须使用HDRP/贴花着色器。
Decal Layer贴花层用于指定要将贴花投影到哪些材质。任何网格渲染器或地形只要使用了匹配的贴花层就会收到贴花。
Draw Distance从摄像机到贴花的距离,若超过此距离,则投影器停止投影贴花且HDRP 不再渲染贴花。
Start Fade使用滑动条设置投影器开始淡出贴花的距离(相对于摄像机)。值范围从0 到 1,表示 Draw Distance 的百分比。值 0.9 表示在 Draw Distance 的 90% 处开始淡出贴花,并在 Draw Distance 处完成淡出。
Angle Fade使用最小/最大滑动条可根据贴花向后方向与接收表面顶点法线之间的角度来控制贴花的淡出范围。仅当启用 Decal Layers 功能的情况下才可用。
End Angle Fade使用滑动条设置相对于贴花向后方向的角度,使投影器在该角度停止淡出贴花。缩放范围是0 到 180,代表度数。仅当启用 Decal Layers 功能的情况下才可用。
Tiling沿着UV 轴缩放贴花材质。
Offset沿着UV 轴偏移贴花材质。当使用材质图集作为贴花时,请同时使用此属性和 UV Scale 属性。
Fade Factor允许手动淡入和淡出贴花。值为0 使贴花完全透明,值为 1 使贴花变为不透明,具体不透明度取决于 Material。Material 使用 Global Opacity 和不透明度贴图来控制贴花的最大不透明度。
Affects Transparent启用此复选框可以允许HDRP 在透明表面上绘制投影器的贴花。HDRP 在启用 Affects Transparency 的情况下将贴花中的所有纹理打包到图集中(这会影响内存和性能)。可以在 Unity 项目 HDRP 资源的 Decals 部分中编辑此图集的尺寸。
2.体积雾
财产-说明
单次散射反照率设置雾颜色。当灯光散射时,体积雾会对照明进行着色以显示此颜色。它只对雾后或雾内的灯光发射的灯光进行着色。这意味着它不会对在雾后或雾内反射游戏对象的灯光进行着色。随着雾密度的增加,反射光变暗(逐渐变黑)。例如,如果你用红色单散射反照率在雾后面的白色墙壁上照射灯光,那么雾看起来是红色的;如果你将灯光照射在白色墙壁上,并从雾的另一边观看,雾会使灯光变暗,但不会将其染成红色。
雾距控制雾底部的密度,并确定可以通过雾看到的距离(以米为单位)。在这个距离上,雾吸收并散射了63%的背景光。
遮罩模式选择要应用于雾的遮罩类型:•纹理:将3D纹理应用于雾体积。•材料:将材质应用于雾,该材质将更新每个帧。可以使用该选项创建动态雾效果。
混合模式确定该雾体积如何与场景中的现有雾混合:•覆盖:用此雾体积替换体积区域中的现有雾。•添加剂:将此雾体积的颜色和密度添加到场景中的其他雾。这是默认值。•倍增:将此雾体积的颜色和密度与场景中的其他雾相乘。可以使用该选项创建相对于特定雾密度的效果。•分钟:确定此雾体积及其边界框内的场景雾的最小密度值。例如,如果值为0,则会移除特定区域中的雾。•马克斯:确定此雾体积及其边界框内的场景雾的最大密度值。
优先确定了HDRP混合雾体积的顺序。HDRP首先渲染优先级最低的卷,最后渲染优先级最高的卷。
大小控制体积的尺寸。
每轴控制基于每个轴控制混合距离。
混合距离“混合距离”(Blend Distance)从该雾体积的级别淡出到其外部的雾级别。此值指示从体积边界边缘的绝对距离,由“大小”属性定义,淡入开始处。Unity将此值钳制在大小属性中最低轴值的0和一半之间。如果你使用正常选项卡上,可以更改名为“混合距离”的单个浮点值,该值在每个方向上提供统一的淡入度。如果你打开高级选项卡上,可以对每个轴使用两个淡入淡出,每个方向一个淡入淡出。例如,在X轴上,可以有一个从左到右,一个从右到左。值为0将隐藏淡入度,值为1将创建淡入度。
衰减模式控制应用于混合的衰减函数混合距离。默认情况下,衰减是线性的,但您可以将其更改为指数以获得更真实的外观。
反转混合反转淡入的方向。将每个轴上的“混合距离”(Blend Distances)设定为其最大可能值,会保留体积中心的雾并使边淡出。相反,反转中心并保留边。
距离淡入开始与摄影机的距离,在该距离处局部体积雾开始淡出。这在优化具有大量局部体积雾的场景并使较远的雾消失时非常有用
距离渐变结束与摄影机的距离(局部体积雾已完全淡出)。这在优化具有大量局部体积雾的场景并使较远的雾消失时非常有用
密度遮罩纹理指定映射到体积内部的三维纹理。局部体积雾仅使用纹理的RGB通道作为雾颜色,A通道用于雾密度倍增。“纹理alpha通道”(Texture alpha channel)中的值为0时,体积的“密度”(density)为0;值为1时,将生成原始恒定(均匀)体积。
滚动速度指定局部体积雾滚动纹理的速度(每轴)。如果将“每个轴”(every axis)设定为0,则局部体积雾不会滚动纹理,且雾是静态的。
平铺指定纹理的每轴平铺速率。例如,将x轴组件设置为2意味着纹理在体积内部的x轴上重复2次。
材料体积材质遮罩,此材质需要具有材质类型的明暗器图形雾量.
HDRP资源中的相关设置
这个HDRP资产包含以下与局部体积雾相关的设置:
财产说明
屏幕上的最大局部体积雾控制屏幕上一次可以显示多少个局部体积雾组件。此设置会影响性能,尤其是在高值时。
要更改这些设置,请打开HDRP资源的照明节并展开体积光效果放下。
7.作业系统Jobs
借助Unity C#作业系统,您可以编写简单安全的多线程代码来与 Unity 引擎进行交互以提高游戏性能。
可将C#作业系统与 Unity 实体组件系统 (ECS) 结合使用,通过这种架构可轻松为所有平台创建高效的机器代码。
https://docs.unity.cn/cn/2022.1/Manual/JobSystem.html
这个系统到时需要详细查看
8.AssetBundle
AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。
AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。
一个AB包里面包含2个内容:
A.一个序列化文件,其中包含分解为各个对象并写入此单个文件的资源。
B.资源文件,这是为某些资源(纹理和音频)单独存储的二进制数据块.
1.构建准备
在构建AB包前,选用给资源设置AB包名称,多个资源可以设置相同资源包名称,这些设置相同名称的会打入一个AB包里面。
一个资源在构建AB包时会把他自身引用的资源一起加入到自身的AB包里,这样如果有多其他的资源也引用了这个资源时,也会把这个资源单独放到自己的AB包里面,所以一般通用的资源都会独立设置AB包,这样引用这个资源的就不会单把引用资源打入自己的包里面。
1.手动设置
2.代码设置
代码设置一般情况是在资源导入的编辑器代码里面设置
2.构建 AssetBundle
使用代码构建,编辑器脚本构建。
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows64);
}
BuildAssetBundleOptions.None:此捆绑包选项使用 LZMA 格式压缩,体积小但是加载要解压速度会慢一点。
BuildAssetBundleOptions.UncompressedAssetBundle:未压缩的缺点是文件下载大小增大。但是加载时间会快得多。
BuildTarget:构建目标平台,根据打包后使用的平台设置。
通用资源独立设置AB包的测试,没独立设置的通用资源都会独立复制一个副部都引用资源包里面,单独设置的就不会。
这是加载资源时系统不会自动加载引用的其他AB包资源,在获取AB包里面的资源前,需要手动添加关联AB包。
3.AssetBundle 依赖项
加载AssetBundle 清单可能非常有用。特别是在处理 AssetBundle 依赖关系时。
使用AssetBundleManifest 对象进行获取资源的依赖关系,
//AB包目录路径
stringassetsPath = string.Format("{0}/{1}", Directory.GetParent(Application.streamingAssetsPath).Parent.FullName, "AssetBundles");
//加载依赖项
AssetBundle abmAB = AssetBundle.LoadFromFile(Path.Combine(assetsPath, "AssetBundles"));
AssetBundleManifest manifest = abmAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//加载AB包
AssetBundle assetBundle = AssetBundle.LoadFromFile(Path.Combine(assetsPath, "t01"));
//加载依赖AB包
string[] dependencies = manifest.GetAllDependencies("t01");
foreach(stringdependency independencies)
{
AssetBundle.LoadFromFile(Path.Combine(assetsPath, dependency));
}
//获取AB包里面的资源
GameObject gameObject = assetBundle.LoadAsset<GameObject>("t01");
GameObject.Instantiate(gameObject);
4.AssetBundle加载资源获取卸载
1.加载AB包
AssetBundle.LoadFromFile //路径加载
AssetBundle.LoadFromFileAsync //延迟路径加载
AssetBundle.LoadFromMemory //byte数据加载
AssetBundle.LoadFromMemoryAsync //延迟byte数据加载
AssetBundle.LoadFromStream //文件流加载
AssetBundle.LoadFromStreamAsync //延迟文件流加载
一般使用路径加载AB包,如果要对AB包进行自定义加密,使用byte加密解密后使用byte数据加载。
2.AB包资源获取
通过已加载的AB包获取里面的资源。
assetBundle.LoadAsset<T>(“name”); //根据类型和名称获取
assetBundle.LoadAssetAsync<T>(“name”); //延迟获取
//获取AB包里面的资源
GameObject gameObject = assetBundle.LoadAsset<GameObject>("t01");
//获取的资源如果是对象,需要实例化到场景,其他资源引用的方式使用。
GameObject.Instantiate(gameObject);
获取的资源,如果在场景里面只使用过一次时,可以直接把AB包释放了
3.资源的释放
场景里面的对象被删除后,对应的AB包资源并不会被删除。
如上面实例加载的t01对象,实例化的对象不删除后,原来获取的预制体和关联的AB包资源还在
根据情况,使用下面的资源卸载方式进行卸载
Resources.UnloadUnusedAssets(); //卸载场景中未被使用(被参数引用的是也使用中)的资源,当然也包括未使用的AB包资源。
Resources.UnloadAssets(object); //卸载指定的资源
AssetBundle.UnloadAllAssetBundles(bool unloadAllObjects);//卸载所有ab包资源,是否同时卸载实例化出来的对象
assetBundle.Unload(bool unloadAllLoadedObjects); //卸载当前AB包,是否同时卸载实例化出来的对象
System.GC.Collect(); //资源卸载完成后调用垃圾收集器
9.性能
1.内存释放方式增量GC
是把GC过程分配到多帧里面操作,不会卡主线程,手动调用垃圾收集器System.GC.Collect();
没启用增量GC
启用增量GC
Edit > Project Settings > Player > Other Settings > Configuration > Use Incremental GC
2.CullingGroup 实现LOD和剔除
Culling Group实现LOD和剔除逻辑
利用可见性(剔除)
CullingGroup 为其计算可见性的所有体积都由包围球体定义;实际上,由位置(球体中心)和半径值定义。出于性能原因,不支持其他包围形状。在实践中,这意味着您将定义一个球体来完全包围希望剔除的对象。如果需要更紧密拟合,请考虑使用多个球体来覆盖对象的不同部分,并根据所有球体的可见性状态做出决定。
为了评估可见性,CullingGroup 需要知道应该从哪个摄像机可见性开始计算。目前,单个 CullingGroup 仅支持单个摄像机。如果需要评估多个摄像机的可见性,应为每个摄像机使用一个 CullingGroup 并合并结果。
CullingGroup 将仅基于视锥体剔除和静态遮挡剔除来计算可见性。它不会将动态对象视为潜在遮挡物。
利用距离(LOD)
CullingGroup 能够计算某个参考点(例如,摄像机或玩家的位置)与每个球体上最近点之间的距离。此距离值不会直接提供给您,而是使用您提供的一组阈值来量化,以便计算离散的“距离带”整数结果。目的是将这些距离带解读为“近距离”、“中距离”、“远距离”等。
一个对象从一个区域移到另一个区域时,CullingGroup 将提供回调,让您有机会进行某些操作,例如将该对象的行为更改为 CPU 使用强度较低的操作。
超出最后一个距离的任何球体都将被视为不可见,这使您可以轻松构建一个剔除实现来完全停用非常远的对象。如果不想要此行为,只需将最终阈值设置为无限远的距离。
每个CullingGroup 仅支持一个参考点。
3.摄像机动态分辨率
动态分辨率是一种摄像机设置,允许动态缩放单个渲染目标,以便减少GPU 上的工作负载。在应用程序的帧率降低的情况下,可以逐渐缩小分辨率来保持帧率稳定。如果性能数据表明由于应用程序受 GPU 限制而导致帧率即将降低,则 Unity 会触发此缩放。
必须在HDRP质量配置表里面设置动态分辨率。
4.深度学习超级采样
只有Windows 10 64位,DirectX11和12,NVIDIA显卡,471.11驱动程序或更新版本才支持。Unity 2021.2以上版本, 需要高清渲染管线 (HDRP)。要启动动态分辨率才能使用。
导入显卡的DLSS支持,在HDRP质量配置表里面设置动态分辨率下面,点击Fix进行安装:
使用:开启动态分辨率,启动DLSS
Mode:模式选择
Balance: Balances performance with image quality.
平衡:平衡性能和图像质量。
Quality: Emphasizes image quality over performance.
质量:强调图像质量高于性能。
Performance: Emphasizes performance and image quality.
性能:强调性能和图像质量。
Ultra Performance: Produces the highest performance and the lowest image quality.
超高性能:产生最高性能和最低图像质量。
摄像机启动DLSS:
可以单独设置这个摄像机的DLSS质量。
10.编辑器
1.预设
预设可以保存组件属性为资源,游戏对象组件快速设置值使用。可以对导入的资产进行预设设置。
1.选择要重用设置的游戏对象、资源导入设置或Project Settings窗口。选择后会出现在 Inspector 窗口。
2.窗口中,根据需要配置属性以保存它们。
3.单击Inspector窗口右上角的预设选择器(滑动条图标)。
4.在 Select Preset 窗口中,单击 Save current to。
显示一个File Save对话框。
5.选择新预设的位置,输入其名称,然后单击 Save。在资产里面会出现该预设资源。
6.使用方式:
A.单击Inspector窗口右上角的预设选择器(滑动条图标)。在弹出框里面选择对于的预设。
B.拖拽预设对象到组件节点上面的标题上:
这个位置
C.资产导入时使用代码设置。
2.属性值设置表达式
在属性表情里面可以设置表达式来设置多个不同的值,比如在场景选择到多个物体,设置位置可以使用表达式设置。
1.线性插值L(a,b)
2.随机值R(a,b)
3.+=, -=, *=, /= 数值计算
使用加等于,减等于,乘等于,除等于的方式对原来的值进行计算赋值。
4.可以使用其他数学表达式进行组合操作
cos(L(0,2*pi))*5 设置X sin(L(0,2*pi))*5 设置Z 型成一个圆