Atmospheric Scattering

    以前由于硬件限制,很多游戏的天空和地面颜色主要是用贴图模拟,近来硬件的发展,越来越多的游戏开始采用基于比较真实的大气散射模型来实时计算。很多文章的计算最终都将眼睛高度和角度作为参数,这里主要按照Sean O’Neil系列的方法来(其实它也是Nishita的改进)。

    原理可以简单归结为:光从大气外圈,散射之后进入眼睛。散射本身是一种衰减行为,由于星球通常离太阳比较远,所以我们近似认为在大气的"顶端"光照相等,这是一个重要的近似,让相机在任何地方的时候,都可以用同样的方式来计算,所以只要是往地面的路径,则散射增加,只要是玩天空的路径,则散射减少。

特定波长的光的亮度散射公式是:

       Iv(λ) = Is(λ) * K(λ) * F(θ,g) * ∫PbPa(exp(-b/H0) * exp(-t(PPc, λ) – t(PPa, λ)))ds;

波长的影响主要由散射系数K(λ)表现,其中Is(λ)是太阳亮度,F(θ,g)是散射函数,主要有Rayleigh散射和Mie散射两种,Rayleigh散射主要是对空气中较小的粒子,主要散射较小波长的波,散射的能量对于光的入射比较对称,Mie散射主要散射空气中较大的粒子,主要散射较长的波,散射的能量在逆光部分比较少。


    Rayleigh散射的近似能量分布

 


   较大波长的Mie散射的能量分布

一般可以用Henyey-Greenstein函数来近似以上两种散射公式,即:

       F(θ,g) = (3 * (1 – g2) * (1 + cos2θ)) / (2 * (2 + g2) * (1 + g2 – 2 * g * cosθ))3/2;

角度θ为入射光与观察点之间的夹角。g是取值常量,当为0时公式近似为Reyleigh散射,当取-0.99左右时近似为Mie散射。

    亮度公式中的积分部分

PbPa(exp(-b/H0) * exp(-t(PPc, λ) – t(PPa, λ)))ds;

属于比较麻烦的地方,后面的-t(PPc, λ) – t(PPa, λ)表示的是光从大气顶部到眼睛的路径的衰减的和。积分曲线变化不是很大,所以对于积分用分段计算再取和来逼近积分的值,对于这里来说,并不是简单的求和,而是计算分段的中点(SamplePoint)的整个路径的optical depth,然后求通过这个点的路径的散射,再求根据长度比例求和。其中b是观察点高度在大气层中的比例,H0是大气中平均空气强度的那个高度在大气层中的比例,一般取0.25即可。t(PaPb, λ)即是表示单独在P1P2这条路径上的能量衰减。公式是

       t(PaPb, λ) = 4 * π * K(λ) * ∫PbPaexp(-b/H0)ds;

Pa和Pb分别为观察点和太阳离计算的采样点最近的大气位置,如果观察点在大气中则Pa就是观察点的位置。公式中的积分称为空气的视觉深度(optical depth),以前一般用预计算查找表来进行,这样不利于在GPU计算,gpugems2中Sean O’Neil通过图形曲线发现在观察角度固定的时候,每个高度上(从0到1)的积分值可以用地面的值(高度为0时候的值)乘于exp(-b/H0)来近似表示,但对于不同角度的缩放量曲线是一条类似指数函数的曲线,没有很好的表示方式,Sean O’Neil自己根据图形曲线用了一条逼近的公式来计算

Scale(ξ) = H0 * exp(-0.00287 + (1 - cos *ξ)(0.459 + (1 - cos *ξ)

(3.83 + (1 - cos *ξ)(-6.80 +(1 - cos *ξ)5.25))));

式中ξ表示观察角度,0为正上方,1为正下方,不过只有星球大气比例跟平均密度高度固定的时候才可以(0.25、0.25)。

    这样全部问题就可以放到GPU中解决了,对于每个顶点首先从camera到该点(即Pa到Pb)做一些采样(次数越多越能逼近,但计算量也越大),然后对每个采样点根据角度计算Scale(ξ),再根据高度计算optical depth以及t(PaPb, λ),然后根据各段采样长度就可以计算最终的强度。

    地面颜色的计算与此类似,不过增加了一次与原颜色的混合。

           Ig(λ) = Iv(λ) + Isrc(λ) * exp(-t(PaPb, λ));


    另外说下这个方法的问题,最大的问题是没有考虑多重散射,因此天空正上方的颜色实在太暗了,天空正中央看起来像是晚上,除非将hdr曝光调的极大,但这是不正确的,因此我自己在输出颜色的时候,对rayleigh散射输出的颜色乘了一个1+cos(cameradir,upvetor)*K(取2左右),看起来才正常一些,用这个因子来模拟多重散射。另外由于这个问题所以mie散射的影响太小了,在这里面仅仅只是对太阳产生一个光晕,导致太阳在天空中很大范围内移动的时候,天空的颜色几乎不变,如果有多重mie散射,太阳附近的亮度应该亮一些,而且会产生大小不一的光晕,目前也可以用角度差别来近似。

转载于:https://www.cnblogs.com/linyizsh/archive/2007/04/01/696270.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员面试金典 - 面试题 10.11. 峰与谷(排序/不排序)

1. 题目 在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。 例如,在数组{5, 8, 2, 6, 3, 4, 3}中,{8, 6}是峰, {3, 2}是谷。 现在给定一个整数数组&#xf…

计算机视觉自学进阶路上不可忽略的几个原创公众号

人工智能行业目前已接近饱和状态,如何从内卷中脱颖而出,除了极强的自律之外,系统性的学习方法也很重要。今天给大家推荐10个原创公众号,这些公众号定期会发些高质量原创,希望可以让你更高效的学习。深度学习与图网络最…

python列表功能默写_初识 Python 作业及默写

1、简述变量量命名规范 2、name input(“>>>”) name变量是什么数据类型? 3.if条件语句的基本结构? 4.用print打印出下面内容: 文能提笔安天下, 武能上马定乾坤. 心存谋略何人胜, 古今英雄唯是君. 5.利用if语句写出猜⼤小的游戏: 设定一个理想数字比如:66&#xff…

关于淘宝的无耻!

前两天在TAOBAO上以个人名义买了两个CN域名,买了之后才知道个人是无权购买CN域名的,这也就是说个人够买的CN域名是没有任何保障的!在购买前,买家没有给出提醒,很明显,买家存在欺诈行为,所以我向TAOBAO发起投诉.下面是投诉处理结果:据淘宝游戏频道免责声明,如买家通过…

整顿职场,从 ROC 曲线开始

文 | 天于刀刀大家好,我是刀刀。这周有个哥们在组会上被领导刁难了一波,来群里吐槽,最后意外地在大神的指导下又复习了一下 precision recall rate (PRR) 和 ROC 曲线的知识点:后面聊天的画风就彻底转向吐槽…

数据结构--树状数组

文章目录1. 树状数组2. 单点修改3. 区间修改4. 完整代码5. 参考文献1. 树状数组 类似数据结构:线段树(Segment Tree) 树状数组 跟 线段树 的区别: 树状数组能做的事情,线段树都能做!(线段树功…

python异常数据处理_Python爬虫提高之异常处理

Python爬虫框架之异常处理 任何访问服务器获取数据的请求,都需要做异常处理,当然爬虫更需要我们对各种异常进行处理。只有这样才能提高爬虫的健壮性。如果我们的爬虫足够健壮,那么就能确保程序几个月不停止。 我们从以下几个方面做出讲解&…

BERT部署加速622%,YOLOv7部署加速590%,这款开源压缩神器火了!

导读 众所周知,计算机视觉技术(CV)是企业人工智能应用比重最高的领域之一。为降低企业成本,工程师们一直在探索各类模型压缩技术,来产出“更准、更小、更快”的AI模型部署落地。而在自然语言处理领域(NLP&…

程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

文章目录1. 题目2. 解题2.1 map2.2 树状数组1. 题目 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入…

python常用函数的用法_python中常用函数整理

1、map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象。 class map(object):""" map(func, *iterables) --> map objectMake an iterator that computes the…

.NET中得到计算机硬件信息

VB.NET中得到计算机硬件信息 本文汇集了在.net中得到计算机硬件信息的一些功能。 得到显示器分辨率 Dim X As Short System.http://dev.21tx.com/os/windows/" target"_blank">Windows.Forms.Screen.PrimaryScreen.Bounds.Width Dim Y As Short System.…

diffusion新高度!可一次性生成200张图??

文 | Pine 明敏(凹非寺)源 | 量子位给AI一个提示词,一次性出200张图!生成速度嗖嗖的,不到3分钟全搞定。喜欢哪张任君挑选,还能直接二次调整编辑。咱就是说,这回用AI画画,终于不废人了…

转正

三个月的时间悄悄的溜走这也是我走出学校之前与社会的一段磨合期感觉自己是幸运的因为在我身边总是可以遇到很多很好的朋友一起陪伴着走过风风雨雨或许生活是残酷的或许我们总是会遇到这样那样不如意的事情但是只要我们勇敢的去面对雨后的天空总会有绚丽的彩虹不要埋怨命运因为…

程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)

1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。 注意,不是必须有这些素因子,而是必须不包含其他的素因子。 例如,前几个数按顺序应该是 1,3,5,7&…

python怎么封装供java调用_python调用第三方java包实例

先看结果:对于python与java的互调,我一开始是用的py4j,但是后来发现在使用方法的时候,不知道如何在python中导入jar包,然后网上的资料也比较少。后来想不出来办法,又看到有Jpype这个东东。博友们说Jpype的安装比较不好…

推特大裁员后,马斯克与白宫发生冲突!META 大批裁员正在路上

文 | 天于刀刀他来了他来了!他带着他的裁员方案走来了!带着他的水槽 sink in 的第一天,全球打工人的目光不由自主地聚焦于这个神奇的男人身上:paypal 帮派元老,特斯拉 starlink 创始人,埃隆火星人马斯克&am…

*如何循序渐进向DotNet架构师发展(转)

微软的DotNet开发绝对是属于那种入门容易提高难的技术。而要能够成为DotNet架构师没有三年或更长时间的编码积累基本上是不可能的。特别是在大型软件项目中,架构师是项目核心成员,承上启下,因此RUP方法论也认同以架构为核心,体现4…

如何利用python整合excel_使用 Python 合并多个格式一致的 Excel 文件(推荐)

一 问题描述 最近朋友在工作中遇到这样一个问题,她每天都要处理如下一批 Excel 表格:每个表格的都只有一个 sheet,表格的前两行为表格标题及表头,表格的最后一行是相关人员签字。最终目标是将每个表格的内容合并到一个 Excel 表格…

程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)

1. 题目 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。 有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。 给定两个列表,一个…

神经网络的简单偏好

文 | 许志钦知乎(已授权)源 | 天天机器学习作者注记我是2017年11月开始接触深度学习,至今刚好五年。2019年10月入职上海交大,至今三年,刚好第一阶段考核。2022年8月19号,我在第一届中国机器学习与科学应用大…