雾效模拟方法及装置技术领域
本发明涉及场景渲染技术领域,尤其涉及雾效模拟方法及装置。
背景技术
雾效对增强三维渲染场景的真实感起到了很重要的作用,特别是运用在比较写实
性的三维游戏场景中时,能制造出很好的环境氛围。对雾的模拟最为常见的是模拟全局雾,
即在均匀的雾密度下,雾浓度随着视点到物体的距离变化而变化。
OpenGL(Open Graphics Library,开放图像库)提供了雾效混合函数可以进行雾
效模拟。具体是根据下面三个雾方程之一进行计算的:
f=e-dc (1)
f=(end-c)/(end-start) (3)
其中,c为世界坐标系内视点到物体的距离,d为雾的浓度,start、end分别表示从
视点起雾开始生效和结束生效的距离;f表示雾效因子,它的值会被裁剪到[0,1],并按公式
(4)和已有片元颜色Cr和预设的雾的颜色Cf混合而得到片元的最终颜色C:
C=f×Cr+(1-f)×Cf (4)
现有的雾效模拟方法仅仅是通过计算视点到物体的距离来生成全局雾效果,或者
通过设置雾的开始生效、结束生效的距离来生成体积雾效果。但是,在模拟特定的场景环
境,比如清晨或者瀑布附近时,需要从高度上体现出雾的层次效果,达到自然环境中真实雾
的那种堆积感,现有技术还未有该方面的解决方案。
发明内容
本申请提供雾效模拟方法及装置,以在高度上将雾的浓度达到层次性的渐变效
果。
本发明的技术方案是这样实现的:
一种雾效模拟方法,该方法包括:
根据设定的雾密度控制系数k,设定的雾的最大有效高度h,视点的位置以及顶点p
的位置,计算雾在顶点p处随高度变化的雾效因子f1;
根据顶点p的位置,设定的从视点起雾开始生效的距离和结束生效的距离start、
end,计算雾在水平方向上的雾效因子f2;
根据f1和f2,计算最终的雾效因子f;
根据雾效因子f,已有片元颜色Cr和预设的雾的颜色Cf,计算片元的最终颜色C。
所述计算雾在顶点p处随高度变化的雾效因子f1包括:
其中,Oz表示视点的高,表示视点的高度与顶点p的高度差,
表示点p到视点的距离。
所述计算雾在水平方向上的雾效因子f2包括:
f2=f'×(2.0-f')
其中,表示点p到视
点的距离。
所述计算最终的雾效因子f包括:
f=(1-f1)×f2
所述计算片元的最终颜色C包括:
C=f×Cr+(1-f)×Cf。
一种雾效模拟装置,该装置包括:
高度雾效因子计算模块,用于根据设定的雾密度控制系数k,设定的雾的最大有效
高度h,视点的位置以及顶点p的位置,计算雾在顶点p处随高度变化的雾效因子f1;
水平雾效因子计算模块,用于根据视点的位置,顶点p的位置,设定的从视点起雾
开始生效的距离和结束生效的距离start、end,计算雾在水平方向上的雾效因子f2;
雾效因子计算模块,用于根据f1和f2,计算最终的雾效因子f;
片元颜色计算模块,用于根据雾效因子f,已有片元颜色Cr和预设的雾的颜色Cf,计
算片元的最终颜色C。
所述高度雾效因子计算模块计算雾在顶点p处随高度变化的雾效因子f1包括:
其中,Oz表示视点的高,表示视点的高度与顶点p的高度差,
表示点p到视点的距离。
所述水平雾效因子计算模块计算雾在水平方向上的雾效因子f2包括:
f2=f'×(2.0-f')
其中,表示点p到视
点的距离。
所述雾效因子计算模块计算最终的雾效因子f包括:
f=(1-f1)×f2
所述片元颜色计算模块计算片元的最终颜色C包括:
C=f×Cr+(1-f)×Cf。
可见,本申请能够在高度上将雾的浓度达到层次性的渐变效果。
附图说明
图1为本申请实施例提供的雾效模拟方法流程图;
图2为本申请实施例提供的雾效模拟装置的组成示意图。
具体实施方式
下面结合附图及具体实施例对本发明再作进一步详细的说明。
图1为本申请实施例提供的雾效模拟方法流程图,如图1所示,其具体步骤如下:
步骤101:根据设定的雾密度控制系数k,设定的雾的最大有效高度h,视点Ow的位
置,以及顶点p的位置,计算雾在顶点p处随高度变化的雾效因子f1。
视点Ow的位置即摄像机的位置。
具体地,
其中,Oz表示视点Ow的高,即摄像机距离地面的高度;表示视点Ow的高度与顶点p
的高度差,表示顶点p到视点Ow的距离,ln(MAX)的取值可预先给定,
例如:ln(MAX)=16,MAX表示无穷大。
步骤102:根据视点Ow的位置,顶点p的位置,设定的从视点起雾开始生效的距离
start、雾结束生效的距离end,计算雾在水平方向上的雾效因子f2。
具体地,
f2=f'×(2.0-f')
其中,表示顶点p到
视点Ow的距离。
步骤103:根据f1和f2,计算最终的雾效因子f。
具体地,
f=(1-f1)×f2
步骤104:根据雾效因子f,已有片元颜色Cr和预设的雾的颜色Cf,得到片元的最终
颜色C。
具体地,
C=f×Cr+(1-f)×Cf
在实际应用中,在OpenGL中,在顶点着色器中根据外部传入的雾密度控制系数k、
视点位置、雾的最大有效高度h、从视点起雾开始和结束生效的距离start和end以及计算出
的顶点p位置,通过步骤101~103计算出最终的雾效因子f,然后将顶点p位置和雾效因子f
传输至硬件光栅器中,经过光栅器的光栅化处理后,雾效因子f继续传入到片元着色器中,
在片元着色器中,根据已有的片元颜色Cr和外部传入的雾的颜色Cf以及雾效因子f,最终得
到每个像素点的颜色输出至屏幕上。
得出雾效因子f的具体过程如下:
步骤01:通过公式(1),可以看出雾的浓度d是一个常数。本申请中,为了体现雾随
高度的变化,将雾密度ρ(x,y,z)采用如下公式(5)表示:
ρ(x,y,z)=ke-mz (5)
其中,x、y、z分别表示世界坐标系中的X、Y、Z轴分量,k为雾密度的控制系数,为设
定值,且0≤k≤1;m代表雾随高度衰减的衰减因子,为常数;z由雾的位置所决定,表示雾的
高度。
对于衰减常数m的意义在实际应用中不是很直观,在实际应用中采用雾从地面到
天空的最大有效高度h来描述。为了在雾的衰减因子m和雾的最大有效高度h之间建立联系,
本申请认为根据公式(5),雾在最大有效高度h处的雾密度为0,则有:
e-mh=ε (6)
其中,ε表示无穷小的值。
说明一下,雾的特点是:离地面越近密度越大,离地面越远密度越小,则在最大有
效高度h处,雾密度会减少至0。
则可以求得m的表达式:
其中,MAX表示无穷大的取值。
实际应用中,可将ln(MAX)取值为16。
另外,从视点Ow到世界坐标系中的任意一点p:(xp,yp,zp)的雾浓度D可以通过第一
类曲线积分进行计算:
由于世界坐标系中的任意一点p:(xp,yp,zp)都可以表示为:
其中,Ow为视点,分别是Ow在X、Y、Z轴上的分量;Dw是视线的方向,
分别是Dw在X、Y、Z轴上的分量;如果Dw采用单位向量,则参数l有明确的几何
意义,即视线上的点p到视点Ow的距离。因此式(8)可以转化为如下定积分:
其中,l1、l2分别对应点Ow和点p:(xp,yp,zp)在参数方程式(9)下对应的l值。当视点
Ow为点p时,将Ow代入式(9)的等式的左边可以看出,无论Dw怎么取值,其对应的l1=0,而l2的
取值取决于怎么设置Dw。Dw最简单的取值方式是直接令
Dw=(xp,yp,zp)-Ow (11)
此时,(xp,yp,zp)在参数方程式(9)中对应的l2=1。综合式(9)、(11),则式(8)可以
表示为如下定积分:
其中,Oz表示视点Ow的高,表示视点Ow的高度与当前点p的高度差,根据式(11)可
知,表示点p到视点Ow的距离。
需要说明的是,
根据公式(1)可将随高度变化的雾效因子f1表示为:
再根据公式(7)和(12),可得随高度变化的雾效因子f1:
f1仅仅是随高度变化的雾效因子,还需与给定的由从视点起雾的开始生效距离
start和结束生效距离end生成的水平方向上的雾效因子f2进行融合。
首先计算距离比例因子f':
根据如下公式(16)将f'的值裁剪到[0,1]:
f2=f'×(2.0-f') (16)
则得到最终的随高度和水平距离变化的雾效因子f:
f=(1-f1)×f2 (17)
将f代入式(4)中可得到片元的最终颜色C。
可见,本申请实施例中,首先计算出了随高度变化的雾效因子,然后将随高度变化
的雾效因子与水平方向上的雾效因子进行融合,得到最终的雾效因子,使得雾效具有了随
高度而渐变的层次性和堆积感。
图2为本申请实施例提供的雾效模拟装置的组成示意图,该装置主要包括:高度雾
效因子计算模块21、水平雾效因子计算模块22、雾效因子计算模块23和片元颜色计算模块
24,其中:
高度雾效因子计算模块21,用于根据设定的雾密度控制系数k,设定的雾的最大有
效高度h,视点的位置以及顶点p的位置,计算雾在顶点p处随高度变化的雾效因子f1,将f1发
送给雾效因子计算模块23。
水平雾效因子计算模块22,用于根据视点的位置,顶点p的位置,设定的从视点起
雾开始生效的距离和结束生效的距离start、end,计算雾在水平方向上的雾效因子f2,将f2
发送给雾效因子计算模块23。
雾效因子计算模块23,用于根据高度雾效因子计算模块21发来的f1和水平雾效因
子计算模块22发来的f2,计算最终的雾效因子f,将f发送给片元颜色计算模块24。
片元颜色计算模块24,用于根据雾效因子计算模块23发来的雾效因子f,已有片元
颜色Cr和预设的雾的颜色Cf,计算片元的最终颜色C。
一实施例中,高度雾效因子计算模块21计算雾在顶点p处随高度变化的雾效因子
f1包括:
其中,Oz表示视点的高,表示视点的高度与顶点p的高度差,
表示点p到视点的距离。
一实施例中,水平雾效因子计算模块22计算雾在水平方向上的雾效因子f2包括:
f2=f'×(2.0-f')
其中,表示点p到视
点的距离。
一实施例中,雾效因子计算模块23计算最终的雾效因子f包括:
f=(1-f1)×f2
一实施例中,片元颜色计算模块24计算片元的最终颜色C包括:
C=f×Cr+(1-f)×Cf。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精
神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。