unity3d shader之实时室外光线散射(大气散射)渲染

散射需要:吸收,内散射,外散射

分为瑞利散射Rayleigh Scattering和米氏散射 Mie Scattering  后面会详细讲解

大气中散射由多种原因产生,微粒,尘埃,水蒸气等等

阳光由于散射增加会减弱并变色

物体也会随着距离增加散射增加而减弱并变色

大气光线散射由于 一天中的时间,天气,污染的改变而改变

散射共通篇

Radiometric Quantities辐射度量包括:

辐射通量Radiant Flux

辐射率Radiance

辐照度Irradiance

辐射通量Φ (Radiant Flux)

代表通过表面的光照量,辐射强度 (能量/时间),单位:瓦特

辐射率L   (Radiance)

代表一束光线的光照量,辐射通量/面积/立体角,单位:瓦特/(m2*球面角度 )

辐照度E

代表到表面上一个点的光照量,入射辐射通量/面积(瓦特/m2),辐射集中成半球状

吸收截面积σab   (Absorption cross section)

每辐照度的吸收辐射通量Φ/E,单位:面积(m2)

之间关系:

Φ = 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+cos2θ)

瑞利散射是米氏散射的一种

当光线穿过大气层,大气中气体蓝色部分瑞利散射强烈,但是红色或黄色等波长长的瑞利散射很弱。

由于天空产生的蓝色的光的散射,阳光到地面的颜色发黄。在日出日落中, 由于空气密度的增加和地球表面附近的粒子,瑞利散射效应更明显。

相比之下,水滴组成云与可见光的波长大小类似,更倾向于米氏散射而非瑞利散射。假设所有可见光的波长分布大致相同,因此云看起来是是白色或灰色的。

米氏散射   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   http://blog.csdn.net/wolf96

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 02:23:37

unity3d shader之实时室外光线散射(大气散射)渲染的相关文章

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

效果图 这次先上效果图*4 散射概念 光线击中空气中的微小颗粒后的偏折导致了光线的散射.我们看到的阳光应该是由视线上的散射在视线方向上的集合.如果由地面的反射,还要加上经过散射计算的地面反射. Rayleigh散射 由较小的空气分子引起的散射,对不同波长的光有不同的散射程度,蓝色最强.也就是天空为啥是蓝色的原因. Mie散射 由较大的漂浮颗粒(气溶胶--PM2.5????)导致的散射 相位方程 相位方程描述有多少光会倍散射到相机方向上. θ:采样点处光线(太阳到采样点)和视线(相机到采样点)的角

三维引擎设计专题--大气散射特效

在做GIS时, 地球周围会有一个大气圈, 大气散射, 这个方面的算法是计算机图形学界不断深入研究的领域, 不过目前有几个成熟的散射算法. 我借鉴了<<GPU精粹2.高性能图形芯片和通用计算机编程技巧>>第16章的算法,实现了一个大气散射. 效果如图. 图中蓝色的天空,就是散射的效果, 具体算法请自行查看书上的算法吧. 步骤: 1: 创建一个椭球, 生成顶点,与顶点索引数组.  这个椭球生成算法后续贴出来. 2: 根据算法传递uniform, 运行shader 3:关于影像,高程的处

大气散射 Aerial Perspective

http://mathinfo.univ-reims.fr/IMG/pdf/PreethamSig2003CourseNotes.pdf https://blog.csdn.net/toughbro/article/details/7800395 Modeling Skylight and Aerial Perspective 大气的构成 有厚度 成分不一样 会发生散射  地球是圆的 朝一个方向上看的时候 光经过的大气层厚度不一样 颜色就不一样 小粒子的散射模型 Rayleigh scatter

大气散射模型的推导过程

大气中粒子的散射作用是产生雾霾的主要原因.无论是用人的肉眼观察,还是从拍摄获取的图像中观察,雾天的景象总是存在对比度和视野降低的问题.1925年,Keim & Nemnich[1]等人提出雾天图像能见度较低是大气中的悬浮粒子对光的吸收和散射造成的.1976年,John Wiley & Sons[2]等人提出粒子的散射作用造成目标和相机之间光在传输过程的衰减,并且增加了一层大气散射光(Airlight).1999年,针对雾天能见度低的问题,Srinivasa G. Narasimhan[3]

【浅墨Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)——自定义光照模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/plus/view.php?aid=183 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文主要讲解了Unity中SurfaceShader的自定义光照模式的写法. 上篇文章中我们已经说到,表面着色器将分为两次讲解,上

【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/plus/view.php?aid=165 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文主要讲解了Unity中SurfaceShader的具体写法,以及几个常用的CG函数的用法. 在这里先说明一下,表面着色器将分为

【浅墨Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文介绍了Unity中Shader书写中会用到的剔除.深度测试.Alpha测试以及基

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

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分为系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在U

【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&amp;颜色、光照与材质

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本篇文章中,我们学习了Unity Shader的基本写法框架,以及学习了Shader中Properties(属性)的详细写法,光照.材质与颜色的具体写法.写了6个Shader作为本文S