一、特效方式实现

1.1 Billboard特效片实现

采用这种方式的体积光实现简单,性能好,但是对于角度有特殊的要求,只适合某些场景使用

1.2 ShadowGun实现

ShadowGun是2011年的一个使用Unity开发的移动平台的第三人称射击游戏。

ShadowGun中把体积光归于是雾的一种应用。

雾和体积光有非常多类似的地方,一个大面积的体积光从视觉上来看和雾非常像,它们有一个共性的感性认识,就是其可见度和距离视角的远近有关。

因此,ShadowGun用简单网格+Alpha Blending的方法来模拟雾和体积光。

一旦玩家离网格面太近,它就会淡出,而且网格面的顶点会被拉开(因为即使是完全透明的Alpha曲面仍会消耗大量渲染时间)。

顶点颜色alpha决定哪些顶点是可移动的,哪些顶点是不可移动的(在我们的示例中,带有alpha为0的顶点不可移动,那些带有alpha为1的顶点可移动)。
顶点法线确定运动方向。
然后Shader计算到Camera的距离,并适当处理表面淡入/淡出。

ShadowGun中很多Shader就是都是通过网格来模拟光照效果,它们的frag函数一般非常简单,而大部分计算都在vert函数中。

nfadeout是一个范围在(0。1)之间的淡化系数。它用于模拟淡入或淡出效果

和它相关的有两个属性:_FadeOutDistNear和_FadeOutDistFar。

玩家由无限远开始接近这个物体的过程中,一开始是远大于_FadeOutDistFar,那么是看不到这个体积光的;

然后逐渐接近_FadeOutDistFar后,开始出现淡入效果;

假设小于了_FadeOutDistNear,那么就会开始模拟淡出的效果。

1.3 相关插件

Volumetric_Light_Beam_Kit 是根据Mesh制作体积光的Unity 插件

其原理为生成一个圆锥形Mesh,使用Shader控制颜色和边缘淡入等效果

可调整Radius Top、Radius Bottom和Length

二、光方向挤出实现

这个方案也是一个相对比较省的方案,但是效果的局限性很大,只是某些特殊情况下可以出比较好的效果,主要的思想是阴影的一种实现-体积阴影的扩展

主体思路:

两个Pass,一个Pass渲染本体,另一个Pass渲染体积光

Vert阶段:

确定受光面

进行顶点沿光方向偏移,达到挤出效果

frag阶段

采样贴图,控制衰减

三、径向模糊后处理实现

来源于 GPU Gems3的 Ch13. Volumetric Light Scattering as a Post-Process

提取高光部分代码

径向模糊部分代码

叠加部分代码

插件介绍

Legacy Image Effect中的 Sun Shaft组件

Lighting Box2 中使用的Sun Shaft组件其实就是Legacy Image Effect中的 Sun Shaft组件

Volumetric Fog Mist插件 中的Light Scattering功能

Volumetric Fog Mist插件的效果会比前面的效果要来的好

四、光线追踪实现

从摄像机发射一条射线到所要渲染的像素

摄像机到所要渲染的像素之间有“介质”(假设是均匀的)

这个“介质”可能就是尘埃之类造成丁达尔效应的胶体

光在介质中传播时,经过的每个路径点都会对最终呈现在屏幕上的像素有所影响

我们从起点开始,沿着射线每次推进一点,采样每个点的亮度,所有经过的采样点上的亮度求和再加上原像素颜色就是最终像素的颜色。

尘埃不可能把所有光都反射到眼睛里的。

光的散射应该是向四面八方的,在一个以尘埃为球心的球体中几乎所有方向都有可能反射到光线,而且每个方向散射出去的光线亮度应该是不一样的,而这些散射出去的光线亮度总合应该和射到尘埃上的那束光线亮度一样,也就是能量守恒。

这种散射可以用一个公式来表示,称为HG公式。(Mie-Scattering)

g所表示的就是光的散射系数,g越大,光束越集中,散射越少,g越小,散射越强,θ为光线方向和视线方向的夹角。

光在介质内内传播,会被吸收一部分,剩下的部分才能透过介质达到观察者眼中。

Beer-Lambert法则,表现为入射光强和透光强度的比:

OutLight = InLight * exp(- c * d)

其中 c为物质密度,d为距离。

透光强度随着介质的密度乘光传播的距离的增加呈指数下降。

另一个问题是这个对象本身的渲染,我们是把这个模型作为一个载体进行渲染的,为了更好的表现效果,不至于被其他东西遮挡住,所以开了ZTest Always,Transparent的Queue是最好。但是我们关闭了ZTest,换句话说,这个物体就不会被遮住了,这也是不现实的。

所以,我们要自己进行一个深度测试,在进行Ray-Marching的过程中,先采样深度值,计算ray的距离,在当前像素对应点的世界坐标距离初始点的距离和当前深度值计算出来的视空间距离比较,用一个更近的距离作为RayMarching的最终距离,这样就可以处理遮挡相关的问题。

相关插件介绍

1、VolumetricLights

https://github.com/SlightlyMad/VolumetricLights

Github 1.2K Star

根据《GPU Pro5》中体积光技术实现的体积光效果。

2、Hx Volumetric Lighting

https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/hx-volumetric-lighting-67665

3、Aura2

https://assetstore.unity.com/packages/tools/particles-effects/aura-2-volumetric-lighting-fog-137148

根据《GPU Pro6》中体积光技术实现的体积光效果。

使用了Compute Shader 提高性能

使用3D图预存效果

Reference

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html

https://www.shadertoy.com/view/XlBSRz

https://blogs.unity3d.com/2012/03/23/shadowgun-optimizing-for-mobile-sample-level/

https://github.com/usunyu/shadowgun

https://blog.csdn.net/puppet_master/article/details/79859678

http://advances.realtimerendering.com/s2014/wronski/bwronski_volumetric_fog_siggraph2014.pdf

Unity体积光实现浅析相关推荐

  1. Unity体积光实现

    目录 人物移动+相机跟随脚本修改 Gpuinstance实现大面积草地 风吹麦浪+人物影响 后处理动态天空实现 动态天空实现 体积光实现的三种方法 RayMarching体积光实现 体积光的项目分享: ...

  2. 【Unity Shader】聚光灯体积光效果的简单实现

    效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...

  3. Unity Shader学习:体积光/体积阴影

    Unity Shader学习:体积光/体积阴影 在前向渲染下实现平行光的体积光影效果,需要全屏深度图,延迟渲染会更划算. 思路:通过ray marching的步进点位置计算该点是否在阴影中,采样阴影贴 ...

  4. Unity URP渲染管线下体积光的实现

    随着手机硬件的提高.主流手游厂商也逐渐以3D游戏为主,游戏也开始更注重3D场景渲染氛围,对渲染技术的要求也越来越高,PBR渲染.环境光遮蔽.阴影优化.场景反射.体积光等华丽的效果也逐渐成为优质画质手游 ...

  5. Unity实现体积雾与体积光

    Unity实现体积雾与体积光 大家好,这次给大家分享在Unity中实现体积雾与体积光,先来看一下效果

  6. unity制作体积光实现丁达尔效应

    unity制作体积光实现丁达尔效应 在生活中,我们常会看到类似这样的效果,也就是丁达尔效应, 而在unity里面是无法直接通过灯光实现的,在学习流粒子系统后发现可以用它实现,现在把我的经验告诉大家. ...

  7. unity3d 求两个点长度_Unity3D实现体积光

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

  8. 【UnityShader】光线追踪体积光

    最近尝试实现了一下光线追踪体积光,效果如下: 光线追踪(Ray tracing)是三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型 ...

  9. unity-builtin实现体积光

    参考GitHub - SlightlyMad/VolumetricLights: Volumetric Lights for Unity这里实现的体积光会包括几个方面的影响. 制作的核心: 核心是灯光 ...

  10. RayMarching实现体积光渲染

    RayMarching实现体积光效果(平行光) 前言 本次Demo核心代码来自github https://github.com/AsehesL/VolumetricLight 本次Demo分享简化了 ...

最新文章

  1. android flux 与mvp,使用 MVP 时在设计上的考量
  2. ABAP Pattern usage - define own custom user exit
  3. Python中抓网页的小陷阱
  4. Java之品优购课程讲义_day20(5)
  5. 1D/1D动态规划的三种优化方法
  6. Shell通过过滤条件(比如IP)分类流量包,最后合并流量包
  7. ubuntu 20.04 下安装使用clash for windows
  8. 图片作为背景并且是链接的写法(背景图片加链接)
  9. JavaScript文档对象模型document对象改变Html表单属性(4)
  10. 《大话数据结构》读后总结(八)
  11. EasyIcon:免费图标搜索和下载平台
  12. python遗传算法之geatpy学习
  13. 向日葵服务器怎么修改密码,向日葵远程服务器ip
  14. Halcon区域特征
  15. Hadoop1.0,2.0,3.0区别
  16. delphi去掉字段前后的引号_delphi 单引号在字符串中使用方法
  17. SEPIC 单端初级电感转换器 稳压器 -- Zeta 转换器
  18. VHDL设计一个同步置数、异步清零的D触发器
  19. 什么是照度(光照强度)?
  20. python坐标转换_python 编写的经纬度坐标转换类

热门文章

  1. jQuery + JavaScript 实现的动态添加文本框功能 和 动态删除文本框功能(二)
  2. 要闻君说:华为“发飙”了;快手抛出了1000+社招岗位;迅雷2018年度财报:云连续三年上涨;定论!小米成立AIoT战略委员会...
  3. Git 常用回滚撤销命令总结
  4. 顺式作用元件-增强子、终止子、沉默子、绝缘子
  5. 服务器显示屏 超出工作频率范围,如何解决显示器出错提示:超出工作频率范围...
  6. 入门短视频剪辑,可以选择什么类型的做?
  7. Zstack协议栈中CC2530协调器掉电重启后重新加入之前网络的方法
  8. android 投屏与控制,android投屏pc及电脑adb控制手机
  9. Matlab的数据导入和导出
  10. c语言汉字属于什么类型_【C语言】必学知识点 - 基本数据类型!你学会了吗?...