unity3d shader之实时室外光线散射(大气散射)渲染
散射需要:吸收,内散射,外散射
分为瑞利散射Rayleigh Scattering和米氏散射 Mie Scattering 后面会详细讲解
大气中散射由多种原因产生,微粒,尘埃,水蒸气等等
阳光由于散射增加会减弱并变色
物体也会随着距离增加散射增加而减弱并变色
大气光线散射由于 一天中的时间,天气,污染的改变而改变
散射共通篇
Radiometric Quantities辐射度量包括:
辐射通量Radiant Flux
辐射率Radiance
辐照度Irradiance
辐射通量Φ (Radiant Flux)
代表通过表面的光照量,辐射强度 (能量/时间),单位:瓦特
辐射率L (Radiance)
代表一束光线的光照量,辐射通量/面积/立体角,单位:瓦特/(m²*球面角度 )
辐照度E
代表到表面上一个点的光照量,入射辐射通量/面积(瓦特/m²),辐射集中成半球状
吸收截面积σab (Absorption cross section)
每辐照度的吸收辐射通量Φ/E,单位:面积(m²)
之间关系:
Φ = E*σab
σab = Φ/ E
吸收系数 βab (Absorption coefficient)
代表粒子密度 ρab Particle density, 单位:逆长度(m-1)
总吸收截面积:
Aab = σab * ρab * A *ds
A:介质总面积,ds:介质厚度
吸收的概率:
Pab = Aab/A =σab * ρab * ds = βab
光辐射经过固定密度的吸收介质的衰减:
L(s) = L0e-βab*s
s:介质厚度距离
外散射
散射截面σsc Scattering cross section
散射粒子密度ρsc
散射系数βsc βsc =ρsc * σsc
由于在固定密度的介质的外反射造成的衰减:L(s) = L0e-βsc*s
消光 Extinction
吸收与外散射损失的光线就是消光 Extinction
消光系数 Extinction coefficient βex = βab + βsc
消光产生的总衰减L(s) = L0e-βex*s --> Fex(s) = e-βex*s
内散射
所有方向的光在视角方向的散射,来自太阳,天空,大地,我们只需要处理来自太阳的内散射即可
散射相函数f(θ, ϕ)
大多数大气粒子是球形的或非常小 f(θ, ϕ) = f(θ)
f(θ)的用途:
内散射概率:f(θ)* ωsun In-scatter probability
内散射辐射率:f(θ)* ωsun*Lsun = f(θ)* Esun
θ为light方向与view方向的夹角
在同一个路径(path)中的的内散射
一次事件的辐射率: f(θ)* Esun
在同一个散射距离ds: f(θ)* Esun*βsc*ds
角散射
角散射系数 Angular scattering coefficient βsc(θ) = βsc*f(θ)
经过ds距离的内散射:Esun*βsc(θ)*ds
βsc(θ)的单位:m-1* steradian-1
增加太阳光穿过固定密度的散射媒介的辐射率
Lin(s, θ) = 1/βex * Esun * βsc(θ)*(1- e-βex*s)
消光与内散射
L (s, θ) = L0Fex(s) +Lin(s, θ)
对比GPU 雾渲染
L (s, θ) = L0(1-f(s)) +Cfog*f(s)
单纯的权重运算,效果不好
瑞利散射 Rayleigh Scattering
粒子微小(r<0.05 λ)
相函数:
fr(θ) = 3/(16 *π)*(1+cos²θ)
瑞利散射是米氏散射的一种
当光线穿过大气层,大气中气体蓝色部分瑞利散射强烈,但是红色或黄色等波长长的瑞利散射很弱。
由于天空产生的蓝色的光的散射,阳光到地面的颜色发黄。在日出日落中, 由于空气密度的增加和地球表面附近的粒子,瑞利散射效应更明显。
相比之下,水滴组成云与可见光的波长大小类似,更倾向于米氏散射而非瑞利散射。假设所有可见光的波长分布大致相同,因此云看起来是是白色或灰色的。
米氏散射 Mie Scattering
烟雾和云散射牛奶、生物组织和乳胶漆之类大粒子
在多云天气主要是米氏散射(水滴)
发生米氏散射的介质中粒子大,为球形粒子
我们用Henyey-Greenstein函数来近似相函数:
fHG(θ) = (1-g) 2/(4*π* (1+g2-2g*cos (θ)))3/2
g为各向异性因子anisotropy factor
波长相关性复杂度取决于粒子的大小
现实中,空气经常包含各种各样大小的米氏粒子Mie particles的混合,总的来说任何波长相关性倾向于平均
混合散射
现实中,空气中瑞利散射和米氏散射都有
通常情况下,光线被吸收是轻微的
βex = βscRayleigh +βscMie
总结与实现
shader中:
传入参数:
βscRayleigh
βscMie
gHG
常量:
E0sun
Esun收到消光extinction影响所以不是常量
阳光能量传到地面上会有衰减
注意:
起点处最初的阳光是白色的
密度不是常量
实现所需的所有公式:
关键部分实现代码:
<span style="font-size:14px;">float s = (GetDepth(i.uv_MainTex)-0.8)*5;
float Fex = pow(e, -(_Beta_R + _Beta_M)* s); float beta_r = 3 / (16 * PIE)*_Beta_R*(1 + cos_theta* cos_theta);
float beta_m = 1 / (4 * PIE) * _Beta_M * (1 - _G)*(1 - _G) / pow((1 + _G * _G - 2 * _G*cos_theta), 3 / 2); float3 Lin = (beta_r + beta_m) / (_Beta_R + _Beta_M)* _Sun * (1 - pow(e, -(_Beta_R + _Beta_M)* s)); float3 L = _Sun * Fex + color.rgb *Lin;</span>
实现结果
瑞利散射
米氏散射
混合散射
参考:Rendering Outdoor Light Scattering in Real Time
----- by wolf96
unity3d shader之实时室外光线散射(大气散射)渲染的更多相关文章
- 大气散射 GPU Gems2 Chapter 16. Accurate Atmospheric Scattering
效果图 这次先上效果图*4 散射概念 光线击中空气中的微小颗粒后的偏折导致了光线的散射.我们看到的阳光应该是由视线上的散射在视线方向上的集合.如果由地面的反射,还要加上经过散射计算的地面反射. Ray ...
- 大气散射 Aerial Perspective
http://mathinfo.univ-reims.fr/IMG/pdf/PreethamSig2003CourseNotes.pdf https://blog.csdn.net/toughbro/ ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 【淡墨Unity3D Shader计划】四 热带雨林的文章: 排除、深度测试、Alpha测试和基本雾编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云 ...
- 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 【译】Unity3D Shader 新手教程(1/6)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...
- Unity3D shader简介
Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包 ...
- 转 猫都能学会的Unity3D Shader入门指南(二)
猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...
- Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
随机推荐
- 在C#中使用正则表达式自动匹配并获取所需要的数据
转自:http://my.oschina.net/bv10000/blog/111736 正则表达式能根据设置匹配各种数据(比如:e-mail地址,电话号码,身份中号码等等).正则表达式功能强大,使用 ...
- A题笔记(7)
No. 1468 已知三角形的三条边求面积:海伦公式 S=√[p(p-a)(p-b)(p-c)] p=(a+b+c)/2 #include <cmath> cmath 是 c++ 语言 ...
- IIS防止同一IP大量非法访问
在服务器设置访问规则,屏蔽恶意ip就可以了
- Windows下的进程【一】
什么是进程?进程就是一个正在运行的程序的实例,由两部分组成: 内核对象.操作系统用内核对象对进程进行管理,内核对象是操作系统保存进程统计信息的地方. 地址空间.其中包含所有可执行文件或DLL模块的代码 ...
- DataGridView 绑定 List
DataGridView 绑定 List<T> 不会自动更新 正确方式是将 List<T> 设置为 BindingList<T> 即可 (双向绑定)
- 逻辑回归:使用SGD(Stochastic Gradient Descent)进行大规模机器学习
Mahout学习算法训练模型 mahout提供了许多分类算法,但许多被设计来处理非常大的数据集,因此可能会有点麻烦.另一方面,有些很容易上手,因为,虽然依然可扩展性,它们具有低开销小的数据集.这样一个 ...
- POJ 1185 状态压缩DP(转)
1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...
- 读书笔记之 - javascript 设计模式 - 接口、封装和链式调用
javascript 采用设计模式主要有下面的三方面原因: 可维护性:设计模式有助于降低模块之间的耦合程度.这使代码进行重构和换用不同的模块变得容易,也使程序员在大型项目中合作变得容易. 沟通:设计模 ...
- IE9透明filter和opacity同时生效的解决办法 IE9 hack only
转载请注明:来自于http://www.cnblogs.com/bluers/ 问题: 假设结构如下: <div class="wrapper"> <p clas ...
- 【读书笔记】【CLR via C#】【第一章】The CLR’s Execution Model
内容提要 本章的目的是对.Net 框架的设计做一个总体的介绍,包括介绍框架中使用的一些技术.定义一些术语.同时会展示从源代码生成应用程序(或者一些包含了一些自定义类型的可以发布的组件),并且会解释程序 ...