【推荐100个unity插件】将您的场景渲染为美丽的冬季风景——Global Snow 2

文章目录

一、前言

Global Snow 是一款拖放式解决方案,只需几次点击即可将您的场景转换为冬季景观。只需将单个脚本添加到您的摄像机中,即可自定义效果。

Global Snow 的功能:

  • 逼真的雪景,具有浮雕阴影、遮挡和高光效果。
  • 自动雪覆盖,支持排除选项(按层、每个游戏对象、蒙版纹理)。
  • 足迹和脚步声。
  • 地形标记和地形碰撞检测器。
  • 降雪。
  • 相机结霜效果。

二、插件下载安装

资源商店地址:https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/global-snow-2-248191?locale=zh-CN

学习版:

链接:https://pan.baidu.com/s/11_gpN2OSMcYcq62t0EydnA?pwd=2akd

提取码: 2akd

三、工作原理

Global Snow for URP 需要延迟渲染。

该资源在创建 gbuffers 之后、延迟着色 pass 之前注入自定义 pass,并根据雪的设置修改反照率、法线、高光和漫反射/全局光照缓冲区。

四、设置(URP)

1、需求

URP 版本需要 Unity 2021.3。确保在 Project Settings->Quality 或 Project Settings->Graphics 中存在 URP 资源。

2、配置

要正确安装插件,您需要:

  • 在项目设置->质量中,双击渲染管线资源。它必须是 URP。

  • 在检查器中的渲染部分,双击渲染列表中的资源。

  • 在渲染->渲染路径中,将"Forward正向"改为"Deferred延迟"。

  • 点击下方添加渲染功能,并添加Global Snow Render Feature全局雪渲染功能。

五、相机设置

  • GlobalSnow 脚本添加到场景中的主摄像机上。

  • 如果需要,检查Quality preset场景设置参数,并选择一个质量预设。

  • 可选择启用footprints足迹、 terrain marks地形标记、snowfall 降雪或camera frost features摄像机结霜功能。

当然,您可以自定义其任何参数以匹配游戏氛围和需求。

六、演示场景

只需加载包含的演示场景并点击"播放"。

您将能够使用 WASD 和鼠标进行移动。按空格键跳跃,按 T 开启或关闭雪效果,或按 L 切换日光。

在将资源导入您的实际项目时,您应该完全删除 Demo 文件夹或忽略它。

七、Global Snow 参数

1、Scene Setup场景设置
  • Sun太阳:确保已分配一个适当的方向光作为太阳。计算是必要的阴影和高光效果。Global Snow 会自动为你选择一个方向光,但请确保这是合适的光源。
  • Show in Scene View在场景视图中显示:启用此选项可在场景视图中渲染雪效果。
  • Add Snow to Grass为草地添加雪:此选项将雪添加到用于地形的集成草地着色器中。停止和启动场景以刷新更改。
  • Snow Profile雪配置文件:允许您分配具有不同选项的自定义配置文件。
2、Quality Presets质量预设
  • Best Quality最佳质量:使用高分辨率覆盖纹理、浮雕阴影、遮挡和闪光效果。
  • Medium中等:使用较小分辨率的覆盖纹理、浮雕阴影、遮挡和闪光效果。它还启用了距离优化选项,默认值为 500 米。
  • Fastest最快:使用较小覆盖纹理和平面阴影(仍然看起来不错!)。它还启用了超过 100 米的距离优化。

请注意,这些预设仅将一些工厂值应用于其他设置。它们是为了方便起见,作为其他选项的快捷方式提供的。

3、Coverage

这里允许您自定义雪的渲染位置和方式:

  • Layer Mask图层蒙版 :确定哪些对象可以被"涂抹"上雪。默认情况下,所有透明对象都被排除,因为雪是在透明队列之前渲染的。
  • Default Exclusion Layer反射排除图层:这是渲染雪时使用的层的编号,用于已专门标记为被雪排除的对象。使用一个在项目中未使用的图层编号。
  • Exclusion Double Sided双面排除:想从雪中排除双面对象时启用此选项。
  • Zenithal Mask天顶蒙版 :确定哪些对象可以遮挡其下方的其他对象。默认情况下,任何对象都会取消其下方其他对象上的任何雪。请确保在此处排除任何粒子系统,以提高性能并减少覆盖问题。
  • Default Cut Off默认截止 :从对象中排除雪时使用的默认截止值。IgnoreCoverage脚本可用于特定对象,以指定每个对象的自定义临界值。
    • Use Fast Mask Shader使用快速遮罩着色器:默认情况下,Global Snow 使用快速遮罩着色器将雪排除在设计对象之外。但是,如果对象使用具有顶点动画的自定义着色器,则需要禁用此选项,以便使用对象的材质和着色器,这可能会慢一点,但更准确。
    • Default Exclusion Cut Off默认排除切割阈值:应用于被排除对象的切割阈值。如果排除半透明对象(例如,纹理中有孔洞或透明部分的对象),则很有用。
  • Minimum Altitude and Altitude Scatter最小高度和高度散布:指定雪的起始高度。使用高度散布使雪的外观更逼真。请注意,在最小高度以上,雪将始终出现。没有"最大高度"。比如默认值-10,雪只会在-10以上(可能有点偏差)高度才会出现,低于这个高度就没有雪,可以用于实现类似雪山的效果。
  • Coverage Extension覆盖范围扩展:值为 1 表示相机位置周围 256x256 米的区域。值为 2 表示 512x512 米的区域。此参数与覆盖质量共同决定雪覆盖的最终分辨率。
  • Coverage Quality覆盖质量:确定用于雪覆盖计算的内部纹理的大小。值为 1 使用 512x512 纹理,值为 2 使用 1024x1024 纹理,值为 3 使用 2048x2048 纹理。
  • Coverage Mask覆盖蒙版 :你可以使用纹理作为蒙版来指定世界中将被雪覆盖的区域。此功能假设地形围绕 0,0 位置中心。纹理的 alpha 通道将用于确定哪里可以下雪(1=下雪,0=不下雪)。
    世界大小参数指定了纹理在世界上的映射大小。例如,一个 2048x2048 像素的纹理,如果世界大小为 2048x2048,则其映射为每像素 1 米(Y 坐标被忽略)。
4、Appearance外观

允许您自定义雪的外观。

  • Snow Complexity雪的复杂度 :Flat Shading平面明暗处理是最快的,可以产生一个看起来很平的雪。Normal Mapping法线映射 。Relief Mapping地貌映射使用有限的光线追踪算法来模拟雪地上的3D波浪。
    • Occlusion遮挡:为雪添加额外的局部阴影。仅在采用Relief Mapping地貌映射时可用。当太阳高高挂在天空时,该选项非常有用,因为从天顶看,雪看起来非常明亮和白色,没有遮挡。
    • Glitter Strength闪烁强度:控制雪上闪烁的程度。当面向太阳时,闪烁往往会更亮。
  • Slope Options坡度选项:自定义雪覆盖区域的边界,可用于调整雪覆盖悬崖和山脉的外观。请注意,此功能仅在支持 DX11 和 OpenGLCore 的图形上工作。
  • Max Exposure最大曝光度:允许您限制雪反射的光量,以避免在太阳非常高或其光强度大于 1 时发生过度曝光。请注意,这是一个人为的更改,如果与其他未覆盖的几何体相比过度使用,可能会产生奇怪的结果。
5、Features特性

允许您解锁特殊的全球雪功能。

  • Footprints足迹:足迹是印在雪地上的人形脚印贴花。这个功能很有趣,可以帮助玩家走很远的距离,并能够返回相同的距离路径。

    • Duration持续时间:自定义足迹的淡出持续时间。
  • Terrain Marks地形标记:这个功能可以让你在雪地上造成小型或中型的冲击。

    • default size默认大小 :自动碰撞产生的标记的默认大小(以米为单位)。您可以调用MarkSnowAt()方法来指定自定义大小。
    • Extents范围:用于在地形上渲染标记的内部控制纹理的大小------增加它以获得更大的非重复标记区域。
    • View distance视距:允许你控制地形标记的渲染距离。最大地形标记渲染到相机的距离。减少以避免标记重复或增加延伸参数
    • FPS Marks`FPS 标记:当相机移动时添加自动terrain marks地形标记(仅在FPS相机中使用)。
  • Snowfall降雪 :启用此参数以实例化位于Resources/Prefabs 中的 SnowParticleSystem 预制体。该粒子系统将以 Intensity 速率发射雪花。你可以通过修改预制体本身来自定义雪粒子系统的外观和行为。

    • Use Illumination使用照明 :将粒子材质更改为受全局照明影响的 Standard Shader 材质。
  • Snow Dust雪尘 :类似于降雪,这个自定义粒子系统模拟了风对积雪地形的影响。启用此参数以实例化位于Resources/Prefabs 中的 SnowDustSystem 预制体,可以通过修改预制体本身来自定义其他选项,如重力或雪尘碰撞。。效果强度通过Snow Dust雪尘滑块和Vertical Offset垂直偏移(海拔与当前相机高度)进行调节。此外,降雪速度选项会影响尘埃系统的速度。

  • Camera Frost相机霜冻 :添加一个屏幕空间霜冻效果。可用于为玩家增添温度感。

八、Terrain地形上的雪痕

GlobalSnow 检测与地形的碰撞并处理雪痕。它通过在你的Terrain地形游戏对象上附加一个GlobalSnowCollisionDetector脚本来实现。

如果您有自定义地形对象或在运行时创建它们,或者您想要在其他类型的表面上创建雪标记,只需使用AddComponent<GlobalSnowCollisionDetector>()将碰撞检测器脚本添加到这些对象。

一旦发生碰撞,GlobalSnow 将在屏幕空间效果期间使用的特殊纹理上渲染标记。默认情况下,GlobalSnow 将使用 Global Snow 检视器中指定的设置:

您还可以针对每个对象自定义标记效果。将 GlobalSnowColliderExtraInfo 脚本添加到您的游戏对象上:

GlobalSnowColliderExtraInfo脚本的设置会覆盖来自Global Snow检查器的默认设置:

  • Mark Size标记大小:该物体每次撞击地面时雪标记的大小。
  • Collision Distance Threshold碰撞距离阈值:与上次撞击的最小距离,用于考虑在地面添加新的标记。
  • Is Footprint是否足迹:如果启用,当角色移动时,地面将只添加一个"印记"的标记,而不是一条连续的线。一个有脚的生物应该在每只脚上都有一个碰撞器并开启它,这样每只脚上都会留下一个足迹。而滚动物体、岩石或车辆应禁用此功能,以便它们在雪地上留下连续的痕迹。
  • Step Max Distance最大距离步长:轨迹段的最大距离。如果设置为0,将仅在碰撞点添加标记,并且不会计算新旧位置之间的插值。
  • Rotation Threshold旋转阈值:适用于轮子。这是考虑留下新标记所需的最小旋转角度。物体在地面上移动或旋转时会留下标记。
  • Ignore This Collider忽略此碰撞器:启用此选项可以忽略该碰撞器在雪地上造成的任何碰撞。

九、配置人形角色在雪地上留下脚印

通过在每个脚上放置一个碰撞体,并使用 Global Snow Collider Extra Info,当每个脚接触地面时就会留下雪痕。

十、移动物体上的雪(角色、车辆等)

Global Snow 与 g-buffers 一起工作,默认情况下它不会区分移动物体和静态物体。运动物体上的雪在某些物体上看起来可能很奇怪,因为雪会随着物体的运动而发生变化。为了避免这个问题,你有两个选择:

  • 步骤 1):排除运动物体上的雪。

    • 你可以通过将物体或预制体分配到 Global Snow 覆盖部分的排除层来实现。这样,物体就不会接收到 Global Snow 渲染在场景上的正常雪。
    • 另一种从 Global Snow 中排除游戏对象的方法是将 Global Snow Ignore Coverage 脚本添加到游戏对象本身(注意,在使用排除选项时,由于 CommandBuffers 的工作方式,结果在 SceneView 中可能不准确------始终在 GameView 中验证结果)。
  • 步骤 2) :使用一个雪自定义着色器。如果你想让运动物体显示一些雪,可以使用资产中包含的 GlobalSnow/Moving Object Snow/Opaque 着色器。这是一个基于 Standard 着色器的着色器,集成了雪的功能。这个着色器的优点是:在移动的游戏对象上渲染的雪不会在对象或角色移动时改变其形状,这会产生更逼真的效果。

    这个着色器包含一些外观选项,如上图所示,包括雪色调颜色、覆盖度(雪的量)、雪比例、散射等。尝试不同的设置,直到获得理想效果。

  • 步骤 3) :如果移动对象是车辆,并且你希望 Global Snow 在其轮子后留下雪痕,将 Global Snow Collider Extra Info 添加到车辆游戏对象的根节点。该脚本负责检查轮子与地面的接触点,并将这些碰撞信息报告给 Global Snow。

十一、遮罩编辑器

另一种在自定义区域移除/添加雪的方法是使用覆盖掩码:

覆盖掩码是一种特殊纹理,其 alpha 分量决定了雪的透明度。

在给定位置。纹理在世界空间中以"世界中心"为基准,覆盖范围为"世界大小"(因此大小为 2000 表示覆盖范围从-2000 到 2000)。

你可以提供自己的纹理蒙版,或使用集成的 SceneView 编辑器。此蒙版编辑器通过在检查器中提供的部分来启用:

遮罩编辑器允许你从零开始创建一个新的遮罩纹理。根据你需要的细节级别选择合适的分辨率。对于粗略结果,1024x1024 的纹理可能就足够了。如果你需要更精细的覆盖细节,可以使用更大的纹理(例如)。

2048, 4096 或甚至 8192 像素)。

笔刷模式、宽度、模糊度和不透明度控制着绘画工具的行为。当蒙版编辑器启用时,您可以直接在场景视图中删除或添加雪花!

点击"填充蒙版"将蒙版纹理重置为完全被雪覆盖。"清除蒙版"将清除覆盖区域的所有积雪。

请注意,如果你使用 Unity 标准树木或草地,你还需要编辑 GlobalSnowForwardOptions.cginc 或 GlobalSnowDeferredOptions.cginc 文件(取决于活动的相机渲染路径),并启用#define GLOBALSNOW_MASK 行。

十二、Vehicle Physics Pro 集成

Global Snow 可以与 Vehicle Physics Pro 等资源无缝配合,后者通过在地面上的轮式碰撞实现雪地轨迹效果,正如"移动对象"部分所述。

  • 步骤 1:确保您的车辆正确报告地面碰撞,方法是将"Global Snow Collider Extra Info"脚本添加到车辆预制件或游戏对象的根目录。此脚本用于检测轮式碰撞并向 Global Snow 报告。

  • 步骤 2 :由于车辆是移动对象,您需要将其排除在 Global Snow 覆盖范围之外(将其添加到排除层或向车辆根目录添加 Global Snow Ignore Coverage 脚本)。

    然后,使用 Global Snow/Moving Object Snow/Opaque 贴图到车辆的材质上,以在车辆部件上添加静态雪地覆盖。

十三、在不同雪效果之间进行平滑过渡/插值切换

所有global snow属性都是可动画的,但该资源还包括一个 Global Snow Lerp 脚本,它允许你快速在两组值之间进行插值。

只需创建一个游戏对象,并将"Global Snow Lerp"脚本添加到它上面(你也可以将此脚本添加到相机上):

主要设置如下:

  • Target Global Snow目标全局雪:这将在脚本启动时自动选择,但允许您分配不同的对象(如果在场景加载后实例化玩家相机时有用)。
  • Transition过渡:值从 0 到 1。值为 0 将使用配置文件 1 的设置,而值为 1 将使用配置文件 2 的设置。介于两者之间的任何值将混合配置文件 1 和 2 的值,产生平滑的效果过渡。
  • Left / Right Key左/右键:允许您指定在游戏模式中按下时将减少/增加过渡值的按键。
  • Profile1 and Profile2配置文件 1 和配置文件 2:全局雪的设置。

十四、常见问题解答 (FAQ)

1、如何排除某些物体不被覆盖雪?

这里有两种方法:

  • 1):将这些物体添加到自定义图层,并在 Global Snow 的 Layer Mask 参数(Coverage 部分)中排除该图层。
  • 2):或者直接将这些物体添加"GlobalSnowIgnoreCoverage"脚本(这样无需更改它们的图层)。

注意:在延迟渲染路径中,无法使用上述方法排除地形。请查看下一个问题以获取解决方案。

2、某些物体(如浮台)上没有雪标记。它们只对地形有效。

如果你希望在碰撞发生时支持地形标记,需要将GlobalSnowCollisionDetector 脚本添加到任何几何体(除地形外)。演示场景包含一些使用此方法允许在其上生成地形标记的几何体。

你也可以使用代码添加自定义地形标记,见下文。

3、我如何能在任何地方手动添加地形标记?

您可以使用此代码向被地形或几何体覆盖的任何数量的标记添加雪:

csharp 复制代码
GlobalSnow snow = GlobalSnow.instance;
snow.MarkSnowAt(position, size);

其中,position 是一个世界空间坐标中的 Vector3,size 是一个介于 0 和 1 之间的值。

4、如何手动在任何地方添加脚印?

您可以使用此代码在任何位置添加脚印:

csharp 复制代码
GlobalSnow snow = GlobalSnow.instance;
snow.FootprintAt(position, direction);
5、我可以自定义足迹形状吗?

是的,足迹功能使用位于 Resources/Textures 文件夹中的 Footprint 纹理。您可以自由使用其他纹理来制作足迹 。

或者,您可以使用地形标记功能来生成与足迹相似的标记,当您的 FPS 角色移动时(启用 FPS 标记选项)。

6、我可以改变地形标记的大小吗?

您可以使用 GlobalSnow 检视器指定默认标记大小,或者如果您使用 API,可以将 0 到 1 之间的值传递过去。您也可以将GlobalSnowColliderExtraInfo 脚本添加到任何对象上,并在该脚本中单独设置标记大小。

7、我看到远处有地形标记,但没有任何东西应该引起这些标记。

在 Global Snow 检查器的地形标记部分中,增加 Extents 参数或减少 View Distance 参数。

8、我可以把"洞"添加到地形中吗?

如果你使用支持洞形的自定义地形着色器,可以使用位于 GlobalSnow/Resources/Prefabs 文件夹中的"CircularHole"或"QuadHole"预制件来擦除洞口处的雪。

这些预制件只是普通的几何体,使用自定义材质"GlobalSnowEraser",并附加了"GlobalSnowIgnoreCoverage"脚本。你可以使用任何其他几何体,分配相同的材质和脚本,它将作为一个模板对象------雪不会出现在该几何图形后面。

9、我的 FPS 武器正在接收雪。我该如何排除它?

要排除雪中的物体,通常适用本手册中详细说明的排除选项。然而,由于 FPS 武器在近剪裁平面处非常靠近摄像机渲染,如果深度缓冲区中像素的位置非常小,我们只需排除任何雪覆盖即可。这个技巧只适用于延迟渲染路径。

编辑 GlobalSnowDeferredOptions.cginc 文件并取消注释 EXCLUDE_NEAR_SNOW 宏。保存更改并在您的场景中验证结果。如果武器仍然受到雪的影响,您可能需要增加 NEAR_DISTANCE_SNOW 的值。

10、我如何才能通过编程知道任何位置是否有雪?

使用 GetSnowAmountAt(worldPosition) 方法。如果该位置没有雪,该方法返回 0;如果有雪,则返回大于 0 的值。


专栏推荐

地址
【unity游戏开发入门到精通------C#篇】
【unity游戏开发入门到精通------unity通用篇】
【unity游戏开发入门到精通------unity3D篇】
【unity游戏开发入门到精通------unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发------模型篇】
【unity游戏开发------InputSystem】
【unity游戏开发------Animator动画】
【unity游戏开发------UGUI】
【unity游戏开发------联网篇】
【unity游戏开发------优化篇】
【unity游戏开发------shader篇】
【unity游戏开发------编辑器扩展】
【unity游戏开发------热更新】
【unity游戏开发------网络】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

相关推荐
星夜泊客18 小时前
Unity 游戏开发中的防御性编程与空值处理实践
unity·设计模式·游戏引擎
mit6.8241 天前
[无人机sdk] Open Protocol | 协议包构造&验证
游戏引擎·无人机·cocos2d
tealcwu1 天前
【Unity踩坑】Unity测试用例命名空间错误解决方案
unity·游戏引擎·测试用例
AA陈超1 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-28 构建属性菜单小部件控制器
c++·游戏·ue5·游戏引擎·虚幻
地狱为王1 天前
Unity使用PP-MattingV2实现人像分割
unity·游戏引擎
在路上看风景1 天前
7.1 阴影贴图
unity
lrh30251 天前
Unity 高效 ListView GridView
unity·高效·复用·uilistview·uigridview
星夜泊客1 天前
[特殊字符] Unity 对象判空机制混乱原因总结(上篇)
unity·游戏引擎
应用市场2 天前
Godot C++开发指南:正确获取节点的Forward/Up/Right方向向量
c++·游戏引擎·godot
小南家的青蛙2 天前
O3DE社区发布2510.0版本
游戏引擎·图形引擎