Unity5 PBR如何实现游戏天气系统的雪景效果

Unity5之后加入了Physically Based Shading, 即PBS。PBS提供一整套BRDF Shading和Global Illumination解决方案,可以实现真实质感的渲染品质。

使用PBS改变了美术资源制作的pipeline。美术不需要再把光影表现画在贴图上,而是通过第三方工具在贴图上标记出模型表面的物理属性,通过引擎的shading和lighting系统自动得到当前环境下正确的渲染结果。这种方式还有利于实现游戏中的日夜系统和其他动态光影效果。

Unity自带的Standard Shader提供金属度和高光两种方式Shading, 可以满足大部分场景物件的材质表现需要。下图是Unity官方给出类似于迪士尼Shading Spectrum的Shader Charts。
 


但是在实际项目的开发过程中,往往需要在Standard Shader的基础上添加一些自定义效果,比如服装道具上Bling Bling的反光,天气系统里的雨雪等。这种需求既要求兼容Unity的光照系统,又要实现PBR多样化的表现。

下面以在Standard Shader上添加雪的效果为例,主要扩展BuildIn Shaders的两个文件:

1. Standard Shader.shader。Standard Shader里有两个lod sub shader。以第一个sub shader为例,分为5个pass。第一个pass是对主光源的前向渲染。第二个pass是对应动态点光源的渲染。第三个pass是关于Shadow map的计算。第四个pass是延迟渲染。第五个参与烘培间接光照计算,不参与实时渲染。添加雪的示例需要创建自己的shader文件: Standard Shader with Snow.shader。并且修改第一个pass,自定义fragment shader: #pragma fragment fragForwardBase_Snow。

2. StandardCore.cginc。此文件包含了vertex shader和fragment shader的实现。所以要自己创建一个新的StandardCoreSnow.cginc文件,在里面实现fragment shader。并且在Standard Shader with Snow.shader里包含此文件。

fragment shader的前向渲染实现是在fragForwardBaseInternal函数内。函数主要分三部分

i. 在FragmentSetup()内获得像素的BRDF参数,例如albedo,metallic, normal, eyeVec等。

ii. 在FragmentGI()内收集光照信息。

iii. UNITY_BRDF_PBS()在StandardBRDF.cginc内根据当前graphics tier setting获得相应的BRDF模型和光照输入,输出计算结果。

后两步涉及lighting和BRDF模型的计算,游戏购买无需改动。只需要重写第一部分像素信息的收集函数即可: FragmentSetup_Snow()。这个函数内部实现照抄FragmentSetup(),只在结尾添加一个AddSnow()函数,在内部定义albedo如何表现雪的机制(示例中的实现因为项目关系暂时不便公开)。

Standard Shader的场景效果:


Standard Shader上加雪的效果:
 


还可以用一些trick做出不同的效果。比如下面石头上雪的两种覆盖效果。第一种是正常的覆盖方式,第二种侧面覆盖方式。后者可以用到石板台阶上,造成雪地被踩过的效果。


还可以做其他的一些效果,比如雪消融的动态效果,或者修改下颜色模拟植被。
 


结论, Unity5的Buildin Shaders虽然不是一个严格意义上的开源工程,但Unity实现了lighting和shading的分离,仍然很容易在其基础上做出更复杂的扩展效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity UnityWebSocket插件是一款用于在Unity项目中实现WebSocket通信的插件。WebSocket是一种新的网络通信协议,它建立在HTTP协议之上,可以提供全双工通信,使得客户端和服务器可以通过一次HTTP握手建立持久的连接,实现实时的双向通信。 Unity UnityWebSocket插件可以方便地在Unity中使用WebSocket协议进行网络通信。它提供了简洁易用的API接口,开发者可以轻松地实现连接、发送和接收消息等操作。通过该插件,我们可以构建实时的游戏功能,例如聊天系统、多人游戏和实时更新等。 使用Unity UnityWebSocket插件,开发者可以通过几行代码实现WebSocket的连接和消息处理。首先需要创建WebSocket连接,通过指定服务器地址和端口号等参数进行连接。连接建立后,可以通过发送消息来与服务器进行通信,并通过接收消息事件来处理服务器返回的数据。 Unity UnityWebSocket插件还提供了一些高级功能,例如心跳机制和断线重连。心跳机制可以保持连接的稳定性,防止连接断开。断线重连功能可以在网络连接断开后自动重新连接服务器,确保通信的连续性。 总之,Unity UnityWebSocket插件是一款强大的工具,可以帮助开发者在Unity实现WebSocket通信。它提供了简单易用的接口,并支持一些高级功能,使得开发者可以轻松地构建实时的游戏功能。该插件的使用可以提高开发效率,为游戏开发带来更多可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值