建筑设计专业推荐网站,做网站的费用计入销售费用吗,陕西交通建设集团西商分公司网站,安卓系统优化软件以前由于硬件限制#xff0c;很多游戏的天空和地面颜色主要是用贴图模拟#xff0c;近来硬件的发展#xff0c;越来越多的游戏开始采用基于比较真实的大气散射模型来实时计算。很多文章的计算最终都将眼睛高度和角度作为参数#xff0c;这里主要按照Sean O’Neil系列的方法… 以前由于硬件限制很多游戏的天空和地面颜色主要是用贴图模拟近来硬件的发展越来越多的游戏开始采用基于比较真实的大气散射模型来实时计算。很多文章的计算最终都将眼睛高度和角度作为参数这里主要按照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散射输出的颜色乘了一个1cos(cameradir,upvetor)*K(取2左右),看起来才正常一些用这个因子来模拟多重散射。另外由于这个问题所以mie散射的影响太小了在这里面仅仅只是对太阳产生一个光晕导致太阳在天空中很大范围内移动的时候天空的颜色几乎不变如果有多重mie散射太阳附近的亮度应该亮一些而且会产生大小不一的光晕目前也可以用角度差别来近似。转载于:https://www.cnblogs.com/linyizsh/archive/2007/04/01/696270.html