一种实时体积雾化效果算法

文档序号:8431522阅读:976来源:国知局
一种实时体积雾化效果算法
【技术领域】
[0001]本发明涉及计算机图形学领域,尤其涉及一种实时体积雾化效果算法。
【背景技术】
[0002]在雾气比较严重的地区,往往距离观察点很近的物体比较清晰,而远处的物体随着距离的增加会变得越来越模糊。在计算机绘图中,一般使用雾化在三维显示中模拟真实世界的云雾、水汽和灰尘等自然景观,增加三维场景的真实感。目前,像素雾化和顶点雾化由可以实现真实而高效的雾化渲染效果,能够大大增强虚拟现实、3D视频游戏、飞行仿真等实时图形系统场景的真实感、沉浸感和纵深感,所以,得到了较多的关注和广泛的使用。
[0003]在Direct3D图形系统中,雾化是通过将景物颜色与雾的颜色,以混合因子混合而实现的,其中,混合因子随物体到观察点距离的增加而衰减。计算雾化的公式为:
[0004]color = f*colorscene+(1-f)*colorfog
[0005]其中,colorscene为物体的颜色,colorfog为雾的颜色,f为混合因子,color为雾化后的颜色,即雾化效果。
[0006]从公式中可以看出,影响雾化效果的因素主要包括混合因子和雾的颜色,一般情况下,雾的颜色为白色或背景色,所以,影响雾化效果的因素主要是混合因子,这样,雾化效果算法的关键点就是如何确定混合因子。
[0007]目前,Direct3D提供的确定混合因子的方法主要包括以下三种:
[0008](1.D3DF0G_LINEAR
[0009]F = (end-d) / (end-start)
[0010]其中,F表示混合因子,start表示雾起始的深度,end表示雾终止的深度,d表示当前点距观测点的距离;
[0011](2.D3DF0G_EXP
[0012]P = e-d*density
[0013]其中,F表示混合因子,d表示当前点距观测点的距离,density表示雾的密度;
[0014](3.D3DF0G_EXP2
[0015]F = e_(d*density)2
[0016]其中,F表示混合因子,d表示当前点距观测点的距离,density表示雾的密度。
[0017]但是,上述3种方法得到的混合因子,应用于雾化中,仅仅能够实现基本的雾化效果,如果需要模拟更复杂的、更真实自然的效果,往往还需要根据应用需求的不同,另外构建其他公式或算法,因此,在图形系统的雾化渲染技术中应用率很低。

【发明内容】

[0018]本发明的目的在于提供一种实时体积雾化效果算法,从而解决现有技术中存在的前述问题。
[0019]为了实现上述目的,本发明采用的技术方案如下:
[0020]一种实时体积雾化效果算法,包括如下步骤:
[0021]SI,从Z-Buffer与Frame-Buffer中,获取每个像素点的深度信息,所述深度信息包括场景深度信息、雾正面深度信息和雾背面深度信息;
[0022]S2,将所述深度信息保存到深度纹理图片上,具体包括:将所述场景深度信息保存到场景深度纹理图片上;将所述雾正面深度信息保存到雾正面深度纹理图片上;将所述雾背面深度信息保存到雾背面深度纹理图片上;
[0023]S3,在可编程流水线中,调用HLSL取样函数,从所述深度纹理图片中调取深度值,具体包括:从所述场景深度纹理图片中调取场景深度值,从所述雾正面深度纹理图片中调取雾正面深度值,从所述雾背面深度纹理图片中调取雾背面深度值;
[0024]S4,根据所述深度值计算雾所占距离,即视点与目标象素点的距离上雾所占的距离;所述深度值包括所述场景深度值、所述雾正面深度值和所述雾背面深度值
[0025]S5,根据所述雾所占距离和雾的浓度,利用如下公式计算混合因子:
[0026]float Disfactor = clamp(dis/FogDensity, 0, I);
[0027]式中,
[0028]Disfactor,混合因子,其取值区间为(0,I);
[0029]di S,雾所占距离;
[0030]FogDensity,雾的浓度;
[0031]S6,根据所述混合因子、模型纹理颜色值和雾的浓度,计算并返回混合后的颜色值;
[0032]S7,在3D图形渲染中,根据所述返回的混合后的颜色值雾化渲染场景,得到实时体积雾化效果。
[0033]进一步地,SI之前,还包括步骤S0,获取Z-Buffer与Frame-Buffer。
[0034]优选地,S2中所述将所述深度信息保存到深度纹理图片上,使用MultiRenderTarget 技术。
[0035]优选地,S3中,所述取样函数为HLSL内置函数tex2D (s,t)。
[0036]进一步地,S3和S4之间还包括步骤:
[0037]按照设定的第一规则,将float类型的深度值转换成float4类型的A\R\G\B颜色值并进行保存,其中,透明度值A为不透明,R、G、B的数值均小于I大于等于O ;
[0038]按照设定的第二规则将float4类型的A\R\G\B颜色值转换成float类型的深度值并进行调用,其中,所述第二规则为所述第一规则的相反的逻辑规则。
[0039]优选地,所述设定的第一规则为:
[0040]将所述深度值除以设定的系数,得到第一结果,如果所述第一结果包括整数部分和小数部分,则将所述第一结果中的小数部分做为R的数值予以保存,将所述第一结果中的整数部分除以所述设定的系数,得到第二结果;如果所述第二结果包括整数部分和小数部分,则将所述第二结果中的小数部分做为G的数值予以保存,将所述第二结果中的整数部分除以所述设定的系数,得到第三结果;如果所述第三结果包括整数部分和小数部分,则将所述第三结果中的小数部分做为B的数值予以保存,并结束;
[0041]如果所述第一结果只包括整数部分,则将O做为R的数值予以保存;将所述第一结果的整数部分除以所述设定的系数,得到第二结果,将所述第二结果中的小数部分作为G的数值予以保存;将所述第二结果中的整数部分除以所述设定系数,得到第三结果,将所述第三结果中的小数部分作为B的数值值予以保存,并结束;
[0042]如果所述第一结果只包括小数部分,则将该小数部分做为R的数值予以保存,将O做为G、B的数值予以保存,并结束。
[0043]其中,S4具体为:
[0044]如果所述场景深度值介于所述雾正面深度值与所述雾背面深度值之间,则按照如下公式进行计算:雾所占距离=场景深度值-雾正面深度值;
[0045]如果所述场景深度值大于所述雾背面深度值,则按照如下公式进行计算:雾所占距离=雾背面深度值-雾正面深度值;
[0046]否则,雾所占距离等于O。
[0047]优选地,S6按照如下公式计算混合后的颜色值:
[0048]Color = sceneColor* (1-Disfactor)+fogColor*Disfactor
[0049]式中,
[0050]Color,混合后的颜色值;
[0051]sceneColor,模型纹理颜色值;
[0052]Disfactor,混合因子;
[0053]fogColor,雾颜色值。
[0054]进一步地,S5和S6之间还包括步骤,获取模型纹理颜色值和雾颜色值。
[0055]优选地,所述模型的颜色根据如下方法获取:利用HLSL内置函数tex2D(s,t)获取模型的纹理信息,所述纹理信息包括采样器和纹理坐标,根据所述采样器和所述纹理坐标,获取所述模型纹理颜色值。
[0056]本发明的有益效果是:本发明实施例提供的实时体积雾化效果算法,基于Z轴深度雾化,从观察点到顶点的有效距离计算,得到的雾化效果会随着两点间距离的增大而增加,符合真实的云雾、水汽或灰尘存在的场景,因此,在利用3D图形引擎进行渲染时,能够更好的表现复杂的雾化效果,而无需再构建其他公式或算法,且场景雾化效果更真实,更具有沉浸感和纵深感;同时,本发明实施例中,使用HLSL极大的提高了 3D程序设计的灵活性,实现了许多固定功能流水线所不能实现的功能,从而可以提高该算法在图形系统中的应用率。
【附图说明】
[0057]图1是本发明实施例提供的实时体积雾化效果算法流程示意图。
【具体实施方式】
[0058]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进行进一步详细说明。应当理解,此处所描述的【具体实施方式】仅仅用以解释本发明,并不用于限定本发明。
[0059]如图1所示,本发明实施例提供了一种实时体积雾化效果算法,包括如下步骤:
[0060]SI,从Z-Buffer与Frame-Buffer中,获取每个像素点的深度信息,所述深度信息包括场景深度信息、雾正面深度信息和雾背面深度信息;
[0061]S2,将所述深度信息保存到深度纹理图片上,具体包括:将所述场景深度信息保存到场景深度纹理图片上;将所述雾正面深度信息保存到雾正面深度纹理图片上;将所述雾背面深度
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1