[Unity] 【教程】UnityShader | 屏幕空间积雪效果

查看:4254 |回复:55 | 2019-11-8 09:58:43

您需要 登录 才可以下载或查看,没有账号?注册

x
为游戏中的所有纹理都加上雪花可能需要花费大量时间。本文将展示在Unity中如何创建Image Effect(屏幕空间着色器)来快速改变场景的季节。


使用着色器前后效果图对比如下:
9433746e-9e95-4024-a950-2300bc2493b0___08.png


76c9241f-e573-4dc5-bef7-5ee6499023b6___09.png


工作原理
上面两张图显示的是同一个场景。它们之间唯一的区别就是第二张图启用了相机上的雪花特效。实现该效果无需对场景的贴图做任何更改。这是什么原理呢?
其实原理非常简单。就是假定所有法线朝上的像素点(如:草,地板等)都需要覆盖雪花。同样,法线朝着其它方向的像素点(如:松树,墙),则需要在雪花纹理和原始纹理之间进行平缓过渡。
获取所需数据
实现上面的雪花效果有以下准备事项:
  • 将渲染路径设置为Deferred(延迟渲染)
  • 将Camera.depthTextureMode设置为DepthNormals

由于第二项可以很方便地由屏幕特效脚本进行设置,所以如果游戏已经使用了前向渲染路径(Forward Rendering Path)时,第一项很容易出问题。
将Camera.depthTextureMode设置为DepthNormals后可以读取屏幕深度(像素与相机之间的距离)和法线(所朝的方向)。
创建一个屏幕特效(Image Effect)由至少一个脚本和一个着色器构成。通常这个着色器不是用来渲染3D物体的,而是根据给定的输入数据渲染一个全屏的图像。在本文的例子中,输入数据就是一张相机渲染的结果图片以及一些用户设置的属性。
这里只是基础的设置,还不能生成雪花。有趣的事情还在后面。
着色器

雪花着色器是无光照着色器(unlit shader),因为屏幕空间是没有光照的,所以也不会用到任何光照信息。片段着色器才是重要部分,通过ScreenSpaceSnow脚本来获取所有数据。
找出需要下雪的地方
正如之前所说,所有法线朝上的表面都将覆盖雪。相机已经设置了生成深度法线贴图,所以现在直接获取即可。
查看Unity官方文档可以了解_CameraDepthNormalsTexture的意义:
  • 深度贴图可以作为一个着色器的全局着色器属性进行采样。通过声明名为_CameraDepthTexture的采样器,就能够采样相机的主深度纹理。
  • _CameraDepthTexture总是引用相机的主深度贴图。

Unity文档解释深度和法线的数据都打包为16位。所以获取法线需要调用DecodeDepthNormal方法进行解包。这个方法检索的是相机空间的法线。也就是说,如果旋转屏幕相机,那么法线朝向也会改变。脚本中将法线乘以_CamToWorld 矩阵就是为了避免这种情况。它会将法线从相机空间转换为世界空间,这样就不再依赖于相机的透视。



暂时渲染为RGB图像。在Unity中,Y轴是默认向上的。图中绿色部分表示Y坐标轴的值。目前为止结果不错!接下来配置积雪覆盖区域顶部和底部的阀值,以便于调整场景的积雪量。



雪纹理
如果没有纹理,雪看起来会不真实。最难的部分就是将2D纹理(屏幕空间)应用到3D物体上。一种方法是获取像素的世界坐标,然后将世界坐标的X和Z值作为纹理坐标。
这里涉及到一些数学知识,您只需知道vpos是视口坐标,wpos是由视口坐标与_CamToWorld矩阵相乘而得到的世界坐标,并且它通过除以远平面的位置(_ProjectionParams.z)来转换为有效的世界坐标。最后使用XZ坐标乘以可配置参数_SnowTexScale和远平面,来计算雪的颜色并获取适当的值。



合并
下面将积雪与场景进行合并。获取场景原始颜色,并使用snowAmount进行插值渐变为snowColor 。



最后一步:将_TopThreshold设为0.6:



完成!
结论
全屏效果见下图。看起来不错吧?






直接上代码:
尊敬的游客,如果您要查看本帖关注 或 回复可见内容请关注回复后刷新页面查看!

评分

参与人数 2元素币 +10 活跃度 +27 展开 理由
微凉. + 15 【喜欢】看到这么好的帖如同回到初恋的年代!
源支始 + 10 + 12

查看全部评分

2019-11-8 09:58:43  
 赞 赞 3

使用道具 登录

55个回答,把该问题分享到群,邀请大神一起回答。
2#
666666
回复 收起回复
2019-11-8 10:29:05   回复
 赞 赞 1

使用道具 登录

3#
这效果挺有意思
回复 收起回复
2020-1-8 17:34:11   回复
 赞 赞 2

使用道具 登录

4#
666
回复 收起回复
2020-2-11 09:09:01   回复
 赞 赞 2

使用道具 登录

5#
回复 收起回复
2020-3-25 20:35:49   回复
 赞 赞 2

使用道具 登录

6#
你特么真牛逼
回复 收起回复
2020-8-10 14:57:48   回复
 赞 赞 2

使用道具 登录

7#
感谢分享
回复 收起回复
2020-9-9 13:43:15   回复
 赞 赞 2

使用道具 登录

8#
效果很棒~
回复 收起回复
2020-9-21 16:02:11   回复
 赞 赞 2

使用道具 登录

9#
666
回复 收起回复
2020-9-30 09:04:42   回复
 赞 赞 2

使用道具 登录

10#
撒大声地
回复 收起回复
2020-11-2 12:11:31   回复
 赞 赞 2

使用道具 登录

11#
楼主辛苦了,谢谢楼主,感谢楼主分享,楼主好人一生平安!!!
回复 收起回复
2020-12-8 09:55:55   回复
 赞 赞 2

使用道具 登录

12#
学习了
回复 收起回复
2021-1-18 19:09:30   回复
 赞 赞 1

使用道具 登录

13#
回复 收起回复
2021-2-24 14:46:53   回复
 赞 赞 2

使用道具 登录

14#
资源甚好,发帖艰辛,且阅且珍惜
回复 收起回复
2021-3-12 10:55:16   回复
 赞 赞 2

使用道具 登录

15#
66666666666666666666666666666666666666666666666666666666666
回复 收起回复
2021-4-9 15:04:11   回复
 赞 赞 2

使用道具 登录

16#
6666666666666666666666666
回复 收起回复
2021-4-15 18:46:43   回复
 赞 赞 2

使用道具 登录

17#
元素那么大,我想来看看
回复 收起回复
2021-4-16 14:05:36   回复
 赞 赞 2

使用道具 登录

19#
66666666666666666666666666666
回复 收起回复
2021-4-27 11:25:58   回复
 赞 赞 2

使用道具 登录

20#
111
回复 收起回复
2021-8-6 10:05:11   回复
 赞 赞 2

使用道具 登录

CG 游戏行业专业问题

图文教程技术文章技术文库程序逻辑
显示全部 8
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表