散射需要:吸收,内散射,外散射
分为瑞利散射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之实时室外光线散射(大气散射)渲染的更多相关文章

  1. 大气散射 GPU Gems2 Chapter 16. Accurate Atmospheric Scattering

    效果图 这次先上效果图*4 散射概念 光线击中空气中的微小颗粒后的偏折导致了光线的散射.我们看到的阳光应该是由视线上的散射在视线方向上的集合.如果由地面的反射,还要加上经过散射计算的地面反射. Ray ...

  2. 大气散射 Aerial Perspective

    http://mathinfo.univ-reims.fr/IMG/pdf/PreethamSig2003CourseNotes.pdf https://blog.csdn.net/toughbro/ ...

  3. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  4. 【淡墨Unity3D Shader计划】四 热带雨林的文章: 排除、深度测试、Alpha测试和基本雾编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云 ...

  5. 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  6. 【译】Unity3D Shader 新手教程(1/6)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...

  7. Unity3D shader简介

    Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包 ...

  8. 转 猫都能学会的Unity3D Shader入门指南(二)

    猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...

  9. Unity3D Shader入门指南(二)

    关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...

随机推荐

  1. java web hello world

    首先在eclipse 里面创建一个java 动态项目, 记住路径,这里是直接通过根目录直接访问的webContent目录下面 的文件, 创建好后 ,在本地配置Tomcat服务器, 将server加入到 ...

  2. JVM垃圾回收理论知识

  3. Servie学习总结

    一.什么是Service Service是一个应用程序组件,它是安卓实现程序后台运行的一个解决方案. 二.分类 服务有两种类别started.bound.但是一个服务类所要继承的类是一样的,都是Ser ...

  4. MORE ABORT AWR?

    For some time, Oracle’s solution in this area has been its built-in tool, Statspack.Oracle Database ...

  5. 修改tomcat默认的端口号

    协同管理系统黙认使用Tomcat默认的端口8080,除8080端口外Tomcat还会占用8005,8009和8443端口.如果这4个端口已被占用,可以将协同管理系统修改为使用其它端口. 修改方法如下: ...

  6. strace跟踪操作的详细内容

  7. python文件操作汇总

    1.创建文件 f = open(filename,'w+')

  8. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

  9. winpcap 发送接收速率

    总体情况: 在不修改winpcap源码的情况下,发包.收包最大速率3包/ms. 收包几个api的速率: 1. m_fp = pcap_open_live(adapter->name, 65536 ...

  10. dx环境搭建

    我使用的是vs2012+DXSDK_Jun10 DXSDK_Jun10下载地址http://download.microsoft.com/download/A/E/7/AE743F1F-632B-48 ...