论文部分内容阅读
摘要:本文提出了一种基于simplex 噪声的游戏中高效率火焰的绘制方法。其基本思想是,在光线行进过程中,将火焰的轮廓纹理绕y轴旋转一周获得基本的火焰形状,并用simplex 噪声扰动来实现动态的火焰效果。当火中有其他物体时,场景的深度信息被事先存储在一张深度纹理中,并在光线行进过程中将采样点的深度与场景的深度进行比较,作为光线行进终止的条件;因为采样点的不连续性,会在火与物体相交处出现带状分层现象,本文采用了“多采样一次”来解决这一问题。另外,本文通过对顶点位置进行偏移,实现了简单的受风影响的火。最后,本文给出了火海的绘制方法。
关键词:simplex噪声;光线行进;场景深度;火海;实时性
中图分类号:TP391.41 文献标识码:A 文章编号:1007-9599 (2012) 23-0000-02
火是自然界中常见的现象之一,在电影特效、游戏制作、场景模拟教学、抢险救灾演练等许多领域都有重要应用。随着计算机图形学的发展,为适应各个领域的需求,人们采用了不同的方法来模拟火焰,并取得了很大的成就。
本文采用simplex 噪声来模型火焰[1],既能实现较为逼真的火焰,又具有较低的算法复杂度,在大型网络游戏、场景模拟等领域都可以被采用。
本文算法是在GPU中基于物体坐标系实现的,眼睛坐标也变化到物体坐标系下相应的位置,因此此算法具有很好的移植性,可以适应于不同的外部环境。
1 光线行进与颜色转化
火焰的效果是在GPU中用光线行进算法实现的。这一算法是在物体坐标系下展开的。因此,在顶点着色器中,如果对单位正方体盒子做了平移或者缩放操作,眼睛坐标的位置都需要做相反的操作,以保证光线行进的准确性。这里,正方体盒子 坐标的长度均为1,范围为 。
每一条光线从视点位置发出,接触到正方体盒子时光线行进开始,离开盒子时光线行进结束。在光线行进过程中,每一条光线都被分成等距离的多段,每一段的长度为一固定值;而对每一个采样点,都对其竖直方向赋予一个系统的时间值,使其随着时间进行变化,然后用simplex噪声对其扰动,以获得动态的火焰的3D噪声灰度图。
本文绘制火焰时使用的唯一纹理是火焰轮廓纹理。通过将采样点的位置绕纵坐标旋转获得火焰轮廓纹理对应的横坐标,以获得基本的火焰形状。若采样点位置坐标为 ,则其与纹理坐标的映射可采用以下公式获得:
其中, 对应纹理的坐标, 为粗糙系数, 为对采样点位置进行扰动之后的值。
当遇到结束条件(离开正方体盒子或遇到障碍物)时,光线行进终止。此时,将这条光线各个采样点获得的颜色叠加,获得的最终的颜色值赋给像素着色器的对应像素,即可得到对应像素的颜色。
2 场景深度的获取与反走样[2]
当把一个物体(如燃烧的木头、在火上架着的水壶等)放入到火焰中时,就需要获取到物体的深度信息,本文是这样实现的:
2.1 首先获得物体(如木头、水壶等)的深度信息,并将其存储在一张额外的纹理中(这一步可以在GPU中实现,用FBO将场景的深度信息绑定到纹理。只需将深度测试打开,获取其深度即可)。
2.2 在光线行进过程中,对已事先存储了深度信息的纹理进行采样,获得场景的深度值。当采样点的深度值大于这一点场景的深度值时,则光线行进对本条光线的采样结束。
当进行场景的深度测试之后,因为采样点的不连续性,就会在火与物体的交汇处,出现带状分层现象。当物体的深度变化比较明显的时候,这一现象尤为突出。
为了解决这一问题,我们采用“多采样一次”的方式。
在光线行进过程中,对于每一个采样点 ,都同时判断它的下一个采样点 的深度值是否大于场景的深度。如果 的深度值大于场景深度,则我们定义光线行进的下一个采样点,即最后一个采样点为光线与物体的交点(设这一点为 ),其颜色值由 对其贡献的权重值决定。具体公式为:
(1)
上式中, 表示 对其贡献的权重,其初始值为1; 表示 点与采样点 之间的距离; 为采样步长,即采样点 与 之间的距离。
获得权重 之后,即可将其作为采样点颜色的修正值,以消除因采样的不连续性而造成的带状分层现象。
3 受风的影响的火
当受风的影响时,火的燃烧方向会受风的影响做一些偏斜。风越大,则火受到的沿风方向的水平力越大,其偏斜的角度也越大。为了实现这一效果,我们在顶点着色器中对其顶点的位置作了一定的偏移,偏移的大小与风的大小和顶点的位置有关。其中,偏移量 由以下方式获得:
上式中, 表示顶点纵坐标的值,因为用于描述火的单位正方体盒子的坐标范围是-0.5~0.5, 这里加上0.5即可把顶点范围变到0~1。新的顶点位置的横坐标 可以通过以下方式计算得到:
上式中, 作为偏移量的系数,可以控制偏移的大小,与风的大小成正比。因为自然界中的风的大小和方向不是固定不变的, 的值可以通过外部线性随机函数赋值获得。
对于受风影响的火,我们对采样点沿斜向上的方向赋予随时间变化的数值,风越大,倾斜的程度越大。
4 火海的实现
本文采用基本的长方体盒子来实现火海的效果。设采样点位置 ,长方体盒子的长宽高分别为: 、 、 ,并且假设长方体的最长轴与横坐标平行,长方体盒子的中心依然处于原点位置,则 点与纹理坐标对应如下:
上式中, ,可知,纹理的采样方式由 点横坐标的位置有关:当 点处于长方体盒子的两端时,则绕其中心旋转使火焰两端看起来平滑;而当 点处于盒子的中间位置时,仅使纹理与其纵坐标的位置对应。
5 结果与小结
本文基于simplex噪声的火焰效果是在普通的PC机上实现的,其硬件配置为Intel(R) Core(TM)2 Duo 2.93Hz、DDR 2GB、GeForce GTX 260,软件环境为VS2008、OpenGL 2.0、OSG 8.4。这里生成火焰的光线行进算法的步长设置为 ,火焰灰度图由4个不同频率的simplex噪声叠加而成,频率系数分别为 。
本文实现基于simplex噪声的柏林火。通过将火焰的轮廓纹理绕纵坐标旋转获得基本的三维火焰形状,然后用simplex噪声对其进行扰动。当火与其他物体交互时,本文进行了场景深度测试并且解决了因采样点的不连续性造成的带状分层现象。本文通过对顶点位置进行偏斜实现了受风影响的火。另外,本文给出了火海的绘制方法。以上所有算法均是在GPU实现的,因此保证了较高的效率,可以适应游戏场景中对实时性要求比较高的特点。
参考文献:
[1]White Paper - Perlin Fire. NVIDIA SDK 10: PerlinFire.
[2]KEENAN CRANE I. L., TARIQ S.: Real-Time Simulation and Rendering of 3D Fluids, GPU Gems 3, first ed. Addison-Wesley Professional,2007.
*国家自然科学基金项目(No. 60903118)基于图形处理器的高性能计算(High Performance computing based on GPU);
*国家自然科学基金项目(No. 60832011)先进塔台视景模拟系统基础理论与关键技术(Basic theory and key technology of advanced visual simulation system for Tower)。
[作者简介]
郑娜(1987-),女,山东潍坊人,硕士研究生,主要研究方向:计算机图形学,虚拟现实;段茗(1986-),男,四川省广安市人,硕士研究生,主要研究方向:计算机图形学,虚拟现实;姜宏(1986-),男,四川宜宾人,硕士研究生,主要研究方向:图形学,人机交互;孙青云(1987-),女,安徽宣城人,主要研究方向:信息安全,图形图像。
关键词:simplex噪声;光线行进;场景深度;火海;实时性
中图分类号:TP391.41 文献标识码:A 文章编号:1007-9599 (2012) 23-0000-02
火是自然界中常见的现象之一,在电影特效、游戏制作、场景模拟教学、抢险救灾演练等许多领域都有重要应用。随着计算机图形学的发展,为适应各个领域的需求,人们采用了不同的方法来模拟火焰,并取得了很大的成就。
本文采用simplex 噪声来模型火焰[1],既能实现较为逼真的火焰,又具有较低的算法复杂度,在大型网络游戏、场景模拟等领域都可以被采用。
本文算法是在GPU中基于物体坐标系实现的,眼睛坐标也变化到物体坐标系下相应的位置,因此此算法具有很好的移植性,可以适应于不同的外部环境。
1 光线行进与颜色转化
火焰的效果是在GPU中用光线行进算法实现的。这一算法是在物体坐标系下展开的。因此,在顶点着色器中,如果对单位正方体盒子做了平移或者缩放操作,眼睛坐标的位置都需要做相反的操作,以保证光线行进的准确性。这里,正方体盒子 坐标的长度均为1,范围为 。
每一条光线从视点位置发出,接触到正方体盒子时光线行进开始,离开盒子时光线行进结束。在光线行进过程中,每一条光线都被分成等距离的多段,每一段的长度为一固定值;而对每一个采样点,都对其竖直方向赋予一个系统的时间值,使其随着时间进行变化,然后用simplex噪声对其扰动,以获得动态的火焰的3D噪声灰度图。
本文绘制火焰时使用的唯一纹理是火焰轮廓纹理。通过将采样点的位置绕纵坐标旋转获得火焰轮廓纹理对应的横坐标,以获得基本的火焰形状。若采样点位置坐标为 ,则其与纹理坐标的映射可采用以下公式获得:
其中, 对应纹理的坐标, 为粗糙系数, 为对采样点位置进行扰动之后的值。
当遇到结束条件(离开正方体盒子或遇到障碍物)时,光线行进终止。此时,将这条光线各个采样点获得的颜色叠加,获得的最终的颜色值赋给像素着色器的对应像素,即可得到对应像素的颜色。
2 场景深度的获取与反走样[2]
当把一个物体(如燃烧的木头、在火上架着的水壶等)放入到火焰中时,就需要获取到物体的深度信息,本文是这样实现的:
2.1 首先获得物体(如木头、水壶等)的深度信息,并将其存储在一张额外的纹理中(这一步可以在GPU中实现,用FBO将场景的深度信息绑定到纹理。只需将深度测试打开,获取其深度即可)。
2.2 在光线行进过程中,对已事先存储了深度信息的纹理进行采样,获得场景的深度值。当采样点的深度值大于这一点场景的深度值时,则光线行进对本条光线的采样结束。
当进行场景的深度测试之后,因为采样点的不连续性,就会在火与物体的交汇处,出现带状分层现象。当物体的深度变化比较明显的时候,这一现象尤为突出。
为了解决这一问题,我们采用“多采样一次”的方式。
在光线行进过程中,对于每一个采样点 ,都同时判断它的下一个采样点 的深度值是否大于场景的深度。如果 的深度值大于场景深度,则我们定义光线行进的下一个采样点,即最后一个采样点为光线与物体的交点(设这一点为 ),其颜色值由 对其贡献的权重值决定。具体公式为:
(1)
上式中, 表示 对其贡献的权重,其初始值为1; 表示 点与采样点 之间的距离; 为采样步长,即采样点 与 之间的距离。
获得权重 之后,即可将其作为采样点颜色的修正值,以消除因采样的不连续性而造成的带状分层现象。
3 受风的影响的火
当受风的影响时,火的燃烧方向会受风的影响做一些偏斜。风越大,则火受到的沿风方向的水平力越大,其偏斜的角度也越大。为了实现这一效果,我们在顶点着色器中对其顶点的位置作了一定的偏移,偏移的大小与风的大小和顶点的位置有关。其中,偏移量 由以下方式获得:
上式中, 表示顶点纵坐标的值,因为用于描述火的单位正方体盒子的坐标范围是-0.5~0.5, 这里加上0.5即可把顶点范围变到0~1。新的顶点位置的横坐标 可以通过以下方式计算得到:
上式中, 作为偏移量的系数,可以控制偏移的大小,与风的大小成正比。因为自然界中的风的大小和方向不是固定不变的, 的值可以通过外部线性随机函数赋值获得。
对于受风影响的火,我们对采样点沿斜向上的方向赋予随时间变化的数值,风越大,倾斜的程度越大。
4 火海的实现
本文采用基本的长方体盒子来实现火海的效果。设采样点位置 ,长方体盒子的长宽高分别为: 、 、 ,并且假设长方体的最长轴与横坐标平行,长方体盒子的中心依然处于原点位置,则 点与纹理坐标对应如下:
上式中, ,可知,纹理的采样方式由 点横坐标的位置有关:当 点处于长方体盒子的两端时,则绕其中心旋转使火焰两端看起来平滑;而当 点处于盒子的中间位置时,仅使纹理与其纵坐标的位置对应。
5 结果与小结
本文基于simplex噪声的火焰效果是在普通的PC机上实现的,其硬件配置为Intel(R) Core(TM)2 Duo 2.93Hz、DDR 2GB、GeForce GTX 260,软件环境为VS2008、OpenGL 2.0、OSG 8.4。这里生成火焰的光线行进算法的步长设置为 ,火焰灰度图由4个不同频率的simplex噪声叠加而成,频率系数分别为 。
本文实现基于simplex噪声的柏林火。通过将火焰的轮廓纹理绕纵坐标旋转获得基本的三维火焰形状,然后用simplex噪声对其进行扰动。当火与其他物体交互时,本文进行了场景深度测试并且解决了因采样点的不连续性造成的带状分层现象。本文通过对顶点位置进行偏斜实现了受风影响的火。另外,本文给出了火海的绘制方法。以上所有算法均是在GPU实现的,因此保证了较高的效率,可以适应游戏场景中对实时性要求比较高的特点。
参考文献:
[1]White Paper - Perlin Fire. NVIDIA SDK 10: PerlinFire.
[2]KEENAN CRANE I. L., TARIQ S.: Real-Time Simulation and Rendering of 3D Fluids, GPU Gems 3, first ed. Addison-Wesley Professional,2007.
*国家自然科学基金项目(No. 60903118)基于图形处理器的高性能计算(High Performance computing based on GPU);
*国家自然科学基金项目(No. 60832011)先进塔台视景模拟系统基础理论与关键技术(Basic theory and key technology of advanced visual simulation system for Tower)。
[作者简介]
郑娜(1987-),女,山东潍坊人,硕士研究生,主要研究方向:计算机图形学,虚拟现实;段茗(1986-),男,四川省广安市人,硕士研究生,主要研究方向:计算机图形学,虚拟现实;姜宏(1986-),男,四川宜宾人,硕士研究生,主要研究方向:图形学,人机交互;孙青云(1987-),女,安徽宣城人,主要研究方向:信息安全,图形图像。