[内容分享] Unity3D实时体积光
旺道朋友圈广告 -> 最新发布

体积光是现实中常见的因丁达尔效应而产生的一种大气现象,文人墨客常用“慵懒的阳光泄下”描绘该现象带来的美感。笔者在一次旅游后见到了这种神奇的自然现象,遂决定在游戏中实现并使用这样的效果。


 

青藏高原上雨后初晴的体积光


体积光是由空气中的水蒸气和灰尘对光线的散射造成的,显然在实时渲染中我们无法模拟庞杂的微小粒子,只能用近似的方法获得,实现的原理其他的大神已经解释的非常详细,我们这里将更加着重于实现。


我们将使用Unity自带的Shadowmap实现体积光,众所周知,实时渲染中的阴影是通过将像素点的世界坐标(在fragment shader中获得或由像素深度反推获得)乘灯光的viewProjectionMatrix获得该像素点在shadowmap下的uv,并与shadowmap记录的像素点深度进行比较,若shadowmap记录的深度大于等于该点,则表示该点并没有在阴影下,应该受到光照,反之则表示该点受到遮挡,不应该受到光照。Unity中目前支持的实时光照有Directional Light, Spot Light, Point Light,这三种光照类型的实现大同小异。


另外,希望读者在阅读之前,确保自己对Unity渲染管线,官方提供的.cginc文件以及CommandBuffer, GL等API比较熟悉,接下来的分析将不会出现对此类基础的详解。


效果的实现全部在本人的开源里,注意,本开源项目并非完全原创,在经过Slightly Mad大神的同意后,对其开源原型进行魔改,增减.


 


Directional light常用来模拟太阳光,月光等自然光照,由于所有物体都会受到directional light的影响,因此我们的可以直接使用后处理来实现。正如链接里的解释,raymarch的基本原理就是将一条线段按比例分成多段,然后将每个顶点上的采样结果相加,所以首先需要获得射线的起点,我们通过以下代码获得renderTexture上的4个角的近裁面位置,然后在后处理shader中通过fragment shader的线性插值即可获得每个像素点在近裁面上的位置:


这样我们就拥有了摄像机近裁面的四个角的世界坐标,同理可以通过这样的方法取得摄像机远裁面的四个角:


使用其他引擎或DirectX的朋友请注意,是使用OpenGL标准的投影,所以我们这里需要经过GL.GetGPUProjectionMatrix函数获得确实的投影矩阵,并且远裁面深度为0,近裁面深度为1。


以近裁面坐标作为线段起点,以近裁面坐标到远裁面坐标为线段方向,我们还需要确定线段的终点,显然,直接取远裁面是非常愚蠢的,假设摄像机会渲染1000米,而我们的显卡性能中等偏良好,大概可以承受64次采样的性能消耗,那每一步采样之间将会相隔1000 / 64 = 15.625米,也就是说在15米左右之内的物体变化都不会体积光产生任何影响,而且还会导致采样点出现在着色像素之后,产生严重的bug。


因此,我们需要通过深度图,获得屏幕像素的深度并以此为线段的终点,同时限制线段最大长度,将线段长度设置到一个精度与视觉效果的相对平衡,确定终点的示例代码大致如下:


通过类似实现,可以获得一个简易的体积光效果,如何获得阴影采样的实现,在UnityCG.cginc和UnityShadowLibrary.cginc中有详细的实现,文件目录在(Unity Folder)/Editor/Data/CGIncludes/,其中平行光的阴影采样涉及到cascadeShadowMap的计算,需要对采样进行由近及远分成4层,有兴趣的朋友可以自行研究一下,这里不再赘述。



2. Point Light

不同光源之间其实唯一的不同就是计算ray march线段的起点与终点的方法不同,point light的照射范围其实是一个球形,所以我们可以简单的直接在灯光的位置放一个球,然后通过直线与球交点的计算方法,然后其他诸如深度比较等操作,与Directional Light并无不同,示例代码大致如下:


3. Spot Light

原理与点光源其实大致相似,只不过我们这里为了性(tou)能(lan),就不在shader中判断角度,而是直接使用CommandBuffer渲染两次锥形mesh,然后通过两次渲染的深度的差别,计算线段的起点和终点,示例代码大致如下(注意,这段代码在背面深度已渲染到指定的RenderTarget之后,被渲染的像素应该在Mesh的正面):



直接渲染两次mesh这个方法确实比较丑陋,不过我们两者相权取其轻,多一个drawcall一般来讲比在shader中进行复杂的运算更为节省性能,而且还要考虑到lighting cookie的使用,在许多次时代渲染中,场景地编常常使用cookie改变灯光形状,增加灯光真实度,因此我们必须保证GetShadow传入的值确实的存在于shadowmap中。


4. 优化性能:

由于多次迭代,体积光的消耗实际非常高昂,即使是在性能强大的PC平台也是如此,因此我们可以考虑许多优化方法大幅度降低性能消耗,而降采样就是其中非常好的一种方法。我们将目标贴图的分辨率设置为摄像机Render Target的分辨率的一半,也就是直接将计算量缩小到了之前的1/4,但是降采样后的图像马赛克化严重,我们可以使用高斯模糊,将其通过正态分布的模糊采样放回到原分辨率的贴图中,降采样不仅不会降低画质,反而会给体积光带来一种朦胧感与意境。


 

降采样模糊后的太阳体积光效果

5. 进一步提高质量:

细心观察的朋友已经注意到,这个体积光虽然已经实现,但是极其生硬,单调,仿佛蒙了一层布一样,实在谈不上美感,原因很简单,空气中的雾气,尘埃并不是简单的发光,而是折射太阳光,因此我们需要考虑透光时光线强弱的变化。


首先,既然是透射,那么当视线与太阳射入角度越小时,阳光应该越发强劲,这种算法称之为Mie Scattering,即通过视线与光源夹角计算强度值,有时会在次表面透射材质中使用到。加上Mie Scattering后效果为:


 

加上Mie Scattering后已经初步拥有了真实感



大气的情况复杂多变,有时雾并不是静止不动而是在风的影响下有缓慢的飘动,但是若是使用3D贴图进行二次raymarch,将会导致性能消耗非常高昂,这是无论如何也无法接受的,因此我们这里使用一个比较Trick的方法,使用一张2D贴图在屏幕空间进行采样,影响体积光的强度。(Demo中这么使用确实没什么问题,但是有时场景复杂可能会穿帮)。


 


水雾的密度大于空气,因此会缓慢下沉,由于我们的ray march全程使用统一的世界坐标,因此想要基于采样点的高度进行强度累计非常容易,这里就不赘述了,直接给出最终实现效果:


拥有了高度雾与扰动贴图后的效果有了较大的提升



唔,比较核心的技术细节大概就这些了,想到了再加,想到了再加,嘿嘿。


知乎@MaxwellGeng




教育培训机构-如何策划节日招生?
做教育培训,最重要的事情莫过于招生了。面对不同的学员,招生方…于招生。目标不同,活动策划也会不一样。② 活动主题要鲜明不仅主题要鲜明,主题之间要有连续性。就像看连续剧一样,一集接一集,一环扣一环。策划好一系列活动,一个接一个来,从多个角度延续活动的宣传,突出主题,引起关注度。常用的招生方式有:体验课招…-------------想要获得更多运营技巧、doc文案,
教育培训:如何提高满班率和续班率
什么是满班率?就是实际人数除以计划招生人数,这个值就是满班率…员有流失是正常的,但要保证一个概率。在保障老学员续期的基础上,我们也要大胆创新,开设网络课程,拓宽招生区域。实地课程录制后,进一步发行到商弈云课上,通过商弈云课系统转成真实流量,网上有人点击观看,点赞,可以按点播量分佣金。助你在日常的营销推…-----------------------想要获得更多运
培训机构难盈利的问题出在哪里,如何实现盈利?
竞争白热化实地培训班、托管辅导班竞争白热化了,利润越来越稀薄…现没有多少盈利。还有一部分负责人在刚招生时,掌握了不少资金,开始盲目扩张,盲目做课程推广,以期待获得更多生源和收费,从而使培训班陷入了这种恶性循环的陷阱里。其实这些到手的钱,并不是你的利润,而是你未来要支出的钱。如遇到行业快速发展时期,或者…-----想要获得更多运营技巧、doc文件,请“关注”并“转
“差异化”经营是网络培训赚钱的关键所在
“差异化经营”这个词,相信大多数人都耳熟能详,但要做到的却是…。在现有的基础上更新升级或者资源整合就是对现有的产品或者技术,进行升级版本,或者通过一些资源整合,成一个项目。你的技能以前是用来生产或制造产品,现在是把技能升级成知识培训,转换云课堂。直白一点就是可以让老师自行录好课程并上传到学校的商弈云课…在着缺点和不足之处。在创新改革时,要从功能、服务、价格等方面
教育培训行业是如何运作的?
以前读书时,学校附近有个小摊卖鸡蛋灌饼。刚开始的时候只有一家….%,剩下的一对一和多人大班其实市场份额都很小。家长报培训班,是希望孩子能够学到知识。老师通过课上教学和课后辅导来满足孩子的需求,达到成绩提高的目标。我见过上百人的大培训班,为什么一个班这么多人?因为是名师讲课,但人太多坐后面,基本听不到重…是你的核心竞争力。想要得到用户的认同,你就必须做到产品质量好
旺道:实体店怎么做网络营销?
年纪大了,体力不好了,便赚不了什么钱了。所以,一定要在年轻的…写文案都是非常头痛的事情,那么下面我会给大家提供一个解决方案。在互联网营销系统里面有很多细节营销,软文营销就是其中一种,但好多小白头痛写文章,所以可以用这个方法也一样可以植入广告语,或者是图片广告,轮显切换广告,使用 旺道营销系统,也就是每…以帮你吸引海量精准粉丝。有了粉丝,你通过广告、产品、服务就可
旺道:圈里圈外,铁饭碗距离瓷饭碗究竟有多远?
中国人爱混圈子,从线下一直混到线上,各种奇形怪状的圈子勾勒出…不能推则敷衍了事,盼着混到主任科员退休;一种是老黄牛式,踏踏实实、兢兢业业工作,但拙于人际关系,活干得最多,但依旧不见晋升迹象;还有一种是提线木偶式,你扯一下线他动一下,好像脑子和身体是分离的。我突然一拍脑袋,这是提前衰老的迹象啊,工作内容…即使选择留在铁饭碗圈里,也应保有随时离开的思想警惕和进行必要
旺道:微信要双开了,朋友圈推广更好做了
现在手机只能登一个微信,如两个,三个微信的小伙伴们就只能退出…动推广工具、 设置头像点击头像图标,点“+”选择图片,可以上传你的企业,个人头像,产品服务等。旺道微信朋友圈广告免费朋友圈广告-旺道、 设置推广主题点“广告”,再点“+”设置推广的主题(类别),填好中文主题,以及你的网址。教你不花一分钱做朋…简直就是一劳永逸哟。如果你点开发布的文章看不到广告,那就是你
旺道:如何能让网站多个关键词排名百度首页?
最近接了一个单,做婴儿游泳馆加盟的。优化推广范围是全国,但是…泳馆加盟哪家好”、“婴儿游泳加盟多少钱”这类与我息息相关的词。如何能让网站多个关键词排名百度首页?但客户并不认同,客户说这个词指数低,或者说搜的人不多。是,这是一方面原因。但是,指数低有什么关系,你是卖产品还是卖指数。搜的人不多有什么关系,…实现广告效果最大化,来满足大众化的广告需求。对于这样的四两拔
旺道:如何成为网络营销达人?这个技能帮你节省80%的时间
在某次名师讲坛上,听到了一个让人警醒的故事。说有个村子缺水,…准的产品。现在已经不是新鲜事物,好多企业因为百度竞价的高额费用,头疼不已,所以做网站关键词优化排名,成为了企业必选的推广项目。做优化也要做到有成效,不然就是一分钱也是昂贵的。用 旺道智能机器人 就可以持续代替人工去做,它非常聪明,只要你够耐…手,设备先进,你多努力奔跑也于事无补。简单说,要去一个地方,

此文章来源来互联网,如果你有任何版权冲突,可以联络我们,微信号:WANCOME,QQ:1444641。加我们时,请说明来意,我们将优先处理你的问题。




商弈云推  | 圈推广  | 随手推  | 圈推广  | 跨圈推
粤ICP备10213132号
旺道商标注册证号:8608864
Copyright © 2016 环企网络信息科技有限公司 版权所有