在UE4中实现锥体下雨效果

终于不懒,打起精神更新一下前段时间做过的一些东西。。

本文主要讲述一个特别的下雨效果在UE4中的制作过程。这个效果是模仿《天涯明月刀》手游的下雨效果做的,一开始是参考了知乎上的一篇剖析天刀下雨效果的文章;之后一路顺藤摸瓜,摸到了那篇文章所参考的教程,也找到了天刀端游当时的文章,以及CSDN上一篇很实用的文章;再有一些英语的资料,把这些综合起来,成为了我学习这整个效果制作的基础;在此也要感谢无数的前辈们踩了这么多坑还愿意发到网上来分享,让我们这些后来者已经省了不少功夫。

过程

锥体

首先参考的文章为腾讯游戏学堂的文章,这个阶段的主要目标是获取到原项目的代码(教程是开源的),然后跟着教程摸清楚整个效果的实现原理。记录一下思路,大概就是,所有的这些下雨效果都是基于《微软模拟飞行2004》中所提出的方法——即在摄像机前绘制一个双锥体,然后在锥体上滚动播放雨滴纹理,达到一种下雨的效果。不同之处在于,我们如何表现这些雨幕的纵深感;如何让雨幕和环境实现交互等等,但是基本的思想就是使用一个双锥体(这不就是模拟人生里面小人顶在头上的那个吗)。

图1 梦开始的地方:锥体

知道了这一点后,下一步就在于如何体现出雨滴的纵深感。比如说我们观察就会发现,远处的雨滴相对于我们来说下落的速度比较慢,而近处的就比较快;远处的雨滴会更加细小,而且密集,近处的则会更加细长,更加稀疏;还有远近体现出的颜色深浅的效果等等。教程中给出的解决方案:给每层雨幕都自己设定两个值,一个是雨幕开始的深度a,一个是雨幕的厚度b;再加上雨滴纹理本身的B通道中存储的深度信息c,我们可以算出整张雨滴纹理的深度即为a + b * c;然后在摄像机视角获取场景深度,用这个真实的深度和我们自己拟定的虚拟深度作差;最后再经过saturate,我们就得到了一个scale,用来表示大概有多少雨是在这个像素的深度之前的;用这个值我们就可以控制雨幕的纵深感,如果设置一个远距离的雨幕,近距离的物体就不会被淋到,整个雨幕的纵深感立刻就体现出来了。

垂直遮挡s

到此为止,这篇腾讯学堂的文章已经教会了我所有它能教的,下一步要继续参考知乎的文章,来进行下一个效果的制作:垂直遮挡。也就是说,有屋顶的地方不应该还下雨,这是很正常的事情,所以也是必须实现的效果。要实现这个效果,我结合了一下CSDN的文章和知乎的文章的做法,思路大概是:

  1. 先设置一个在高处的摄像机拍一张高度图;

  2. 通过虚拟深度和视点的位置,还原出每一滴雨的虚拟世界坐标;

  3. 在高度图中取对应点的深度和我们计算出的,以高度摄像机为视点得出的虚拟深度作比较,深度比高度图的深度要大的,自然说明有遮挡物,也就不该渲染。

其实这就类似Shadowmap的实现方法,只不过是把阴影换成了雨滴而已。

途中也踩了很多很多很多很多坑,比如教程中使用的是unity的深度(0-1),还涉及到透视投影的深度是否线性这样的问题;而在UE4中,首先高度图采用的是正交投影,所以不涉及到透视相关的问题;其次不管是拍出的高度图,还是节点中给出的SceneDepth和PixelDepth,都是以真实的深度表示的,而且已经做好了深度矫正,也就是说是完全正确的深度,而不会说由于透视投影的关系,在同一个平面上的两个点会因为距离摄像机的中心距离不同而有不同的深度值。弄明白了这个才终于成功算出了虚拟的世界坐标;然后又涉及到一些从世界坐标对应到高度图的UV,以及一些UV上的各种奇奇怪怪的问题,好在最后终于是成功做出了这个垂直遮挡的效果。

最后还有一点bug,和知乎的文章第二篇所提到的一模一样,就是在进入遮挡物时,会出现一种类似于掀开帘子的效果,显得非常突兀;最后还是参考文章的做法来解决了这个问题,但是这一点在最后得到解决的时候,我都没有搞明白为什么这样做就可以做出一个进入遮挡物时的渐变效果。但至少可以确认的是,确实和导师说的一样与整个雨幕的厚度有关,因为当厚度变得非常小时,这个问题又会再次出现(并没有测试这个效果出现的厚度阈值是多少)

图2 下雨效果,左上角为垂直深度图

收尾

至此,基本上已经完成了整个效果的核心部分,接下来就是一些调优的问题。还有一些小效果本来想做,比如说CSDN的文章中提到的,雨滴对玩家的运动产生反应,有一种互动的感觉;但是后来参考了天刀手游中的实际效果,是没有做这样的交互的,效果也一样很好,于是就暂时搁置;以及,天刀手游在表现大雨时,会间歇性地有一些雨雾的产生,给人一种风大雨大的感觉,很有氛围;这个效果在我对雨幕进行调优时意外地找到了差不多的模仿方法,只要加一层雨幕,用噪声给他UV狠狠地扰乱了,就能给出看起来差不多的效果,甚至我这个看着雨还更大一点。。

来张效果预览吧:

图3 效果预览

后来一段时间,再次Review整个效果时,又加上了一个Splash的小特效,用的是快要过时的Cascaded Paticle System。。

最后,参考文献如下:

Water drop 2a – Dynamic rain and its effects | Sébastien Lagarde (wordpress.com)

天刀下雨效果分析和复现(一) - 知乎 (zhihu.com)

教程 | 在Unity中实现逼真的下雨效果-腾讯游戏学堂 (qq.com)

移动端天气系统–【下雨】效果之【雨滴】的实现和分析_lyuavery的博客-CSDN博客

《天涯明月刀》中的雨景渲染-腾讯游戏学堂 (qq.com)

天刀下雨效果分析和复现(二) - 知乎 (zhihu.com)

[Sci-Hub | ACM Press ACM SIGGRAPH 2004 Sketches - Los Angeles, California (2004.08.08-2004.08.12)] ACM SIGGRAPH 2004 Sketches on - SIGGRAPH '04 - Rendering falling rain and snow | 10.1145/1186223.1186241

以及"ATI Toyshop Demo" from AMD

在UE4中实现锥体下雨效果相关推荐

  1. 如何在UE4中制作赛博朋克LED效果

    我们日常生活中常见的LED灯,如何在UE4中实现呢?其实实现起来非常简单,今天就带大家制作一个赛博朋克LED效果. 一.基础LED形状制作 正常LED的形状是由一个个小圆形组成,然后将圆形排列成想要的 ...

  2. 如何在UE4中做出涟漪的效果

    涟漪这个效果我相信很多人都尝试实现过,也有各种实现方法.在这里,我实现的方法是使用Custom节点,用算法生成法线.接下来向大家分享一下思路,看一下最终效果图.文末提供了材质球百度云链接. 最终效果图 ...

  3. Unity3d中使用自带动画系统制作下雨效果(一)

    之前看了以前版本的unity3d demo AngryBots ,觉得里面的下雨效果不错,刚好前段时间学习了,写出来跟大家分享下,直接开始. 使用自带动画系统制作下雨效果. 先制作下雨的雨滴涟漪. 步 ...

  4. mfc三视图和斜等测图实现_如何在UE4中实现NPR(非真实感)渲染效果?

    如何在UE4中实现NPR(非真实感)渲染效果?本文作者尝试在UE4中制作了秋叶原南出口的画面,并分享了全部的制作过程,希望对大家有所帮助. 在虚幻引擎中制作秋叶原南出口 我经常在artstation上 ...

  5. 如何在UE4游戏中实现植物风场效果?

    导语:如何让游戏里的植物产生类似风吹过的效果?腾讯游戏学院专家Freddy将在本文中,尝试使用UE4引擎的PivotPainter2.0插件制作此效果,一起来看看吧. 静态的游戏场景氛围是十分生硬的, ...

  6. UE4中的主要材料和光线跟踪

    迈克·戈麦斯(Mike Gomez)对真实的UE4舞厅场景进行了细分,讨论了他在"主材料"和"照明"方法中的工作流程,并向其他艺术家分享了有用的建议. 介绍 大 ...

  7. ue4 离线渲染_[译]Real Shading in Unreal Engine 4(UE4中的真实渲染)(2)

    利用假期接着把剩下的部分搞完吧,其实,纯粹的翻译应该还是比较简单的,但是,为了更好地理解,我一般都会多找一些资料来进行互相印证.在上面一部分Shader Model的改变过程中,我主要是参考了一些PB ...

  8. ue4蓝图节点手册中文_在UE4中播放视频

    简介: 在日常使用UE4做项目时,会遇到在UE4里播放视频文件的需求,在UE4中可以使用媒体框架(Media Framework)来实现这一功能.这里介绍两种简单的方法来使用这一功能,分别是在场景里播 ...

  9. ue4怎么导出fbx文件_【教程】Houdini Engine在UE4中的基本使用(一)

    后续文章更新移步→微信公众号"虚幻社区"(mantra-xhsq),您的支持是我创作的动力. 在读本篇文章之前大家最好搞懂"程序化建模"的概念. 1.Houdi ...

最新文章

  1. plor 回归的r方_简单线性回归模型
  2. http头部content-type与数据格式
  3. iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager
  4. 远程开发初探 - VS Code Remote Development
  5. 【Python CheckiO 题解】Between Markers
  6. 看懂云计算、虚拟化和容器,这一篇就够啦!
  7. 深入理解iPhone数据持久化(手把手教你iphone开发 - 基础篇)
  8. wav格式的音频文件 16位转化成8位的
  9. LeetCode 97. 交错字符串(动态规划)
  10. Building libmesh with Petsc support
  11. 织梦index.php不更新,亲测dede织梦后台无法更新生成,更新没反应的解决方法
  12. WindowsXP自带小工具(转)
  13. cad线性标注命令_CAD中线性标注的快捷命令是什么
  14. [存档]使用CxServer的7个战略原因
  15. 【51单片机开发板】可调周期、占空比pwm工程
  16. Django 修改时区时间
  17. 6岁女孩出口之乎者也 用《论语》典故批评妈妈
  18. RabbitMq(二)一文彻底弄懂RabbitMq的四种交换机原理及springboot实战应用
  19. Java基于springboot+vue+elementUI高速公路收费管理系统设计与实现
  20. 【Spring源码】Spring事务原理

热门文章

  1. (转)Hadoop即将过时了吗?
  2. Scrapy框架实例-2(沪江网网课信息)
  3. dataTables国际化
  4. 谷歌语言设置_如何设置您的Google主页以使用两种语言
  5. 网站降权的特征和原因有哪些呢?
  6. java前端插件有哪些,前端常用插件、工具类库汇总(上)
  7. 2022-2027年中国降糖药行业市场调研及未来发展趋势预测报告
  8. 金山快盘API二次开发 - OAUTH协议
  9. 收支科目不为零_期间损益结转余额为零能结账吗
  10. 配置http和https