一种高效精确的通用软阴影生成方法

文档序号:6375277阅读:246来源:国知局
专利名称:一种高效精确的通用软阴影生成方法
技术领域
本发明属于精确软阴影的技术领域,具体涉及一种高效精确的通用软阴影生成方法。
背景技术
在现实世界中,阴影无处不在。对于三维虚拟场景,阴影有利于人们判断场景中物体的空间相对位置关系,有利于增强场景的真实感,有利于增强场景的沉浸感。虽然许多成熟的阴影生成算法已成功地应用在游戏,动画以及虚拟现实系统中,然而各个算法都有其优缺点和适用情况。要生成适用性好、鲁棒性强、高质量、像素级别精确的动态阴影仍然是一个巨大的挑战。Eisemann 等人于 2003 年在 “Casting Shadows in Real Time,,以及 Hasenfratz等人于 2009 年在调研类文章“A Survey of Real-time Soft Shadows Algorithms” 中全面和深入地罗列了现有的软阴影绘制方法。这些方法大致可分成两类基于图像空间的方法与基于几何空间的方法。基于图像空间的方法主要有阴影图方法,将3-D场景投影到光源处,保存场景的深度信息到Z缓存中,以此来判断像素的可见性。Guennbaud等人于2006年在 “Real-time Soft Shadow Mapping by Backpro jection” 和 Yang 等人于 2010 年在“Variance Soft Shadow Mapping”以及 Shen 等人于 2011 年在“Predicted Virtual SoftShadow Maps with High Quality Filtering”中提出的方法均属于此类方法范涛。基于几何空间的方法主要包括半影楔方法和基于阴影体的方法等,这类方法则是直接判断出3-D空间的可见性来判定全影和半影区域。Moller、Assarsson于2002年在“Approximate SoftShadows on Arbitrary Surfaces using Penumbra Wedges,,和 Johnson 等人于 2009 年在“Soft irregular shadow mapping: fast, high-quality, and robust soft shadow s,,中以及Forest等人于2009年在“Soft Textured Shadow Volume”中提出的方法均属于此类方法范涛。本发明使用了三角形阴影体方法,因此是一种基于几何空间的方法。基于准确性,软阴影方法又可以分成以下三类阴影模拟方法,阴影近似方法,以及精确阴影方法。阴影模拟方法的半影区域通常是从硬阴影经过过滤得到的。比如,Fernando 等人于 2005 年在 “Percentage-closer soft shadows” 以及 MohammadBagher 等人于 2010 年在 “Screen-space Percentage-Closer Soft Shadows” 所提出的方法对硬阴影的边缘进行了模糊后得到模拟的软阴影。阴影模拟此类方法的特点是快速,因此这类方法主要应用在对性能要求较高的应用中。但是,此类方法生成的软阴影不是基于可见度估计的,并且相当多情况下会生成错误的结果。阴影近似方法近似地估计出遮挡几何体以加速可见性查询。例如,背向投影的方法使用阴影图来近似地估计遮挡体。Guennebaud等人于2006年在“Real-time Soft ShadowMapping by Backprojection”中使用背向投影到光源成像面的阴影图样本来估算采样像素对面光源的可见度。在使用了光滑轮廓检测和径向区域积分的方法后背向投影所生成的软阴影被改进得更精确和更快速。Schwarz和Stamminger于2008年在“Microquad SoftShadow Mapping Revisited”中近似地将阴影图中的像素建模成小四边形和小三角形,提高了生成的阴影质量。以上的这些方法均是依赖单张的阴影图来近似地建模遮挡体。启发式的算法也被引入用以解决生成的阴影中存在的缝隙,这将生成更加准确的遮挡体轮廓。Yang 等人于 2009 年在 “Packet-based Hierarchal Soft Shadow Mapping” 中引入了多张阴影图来减少单一视点下存在的对于遮挡体的采样误差。但由于需要对每张阴影图中的像素连贯性进行分组并且计算每张阴影图的单一可见性因子,因此绘制的效率成了一个大问题。阴影近似这类方法生成的阴影是基于真实的可见度来计算的而且可以在近似地估计遮挡体的情况达到可交互的绘制帧率。本发明中所使用的方法不是采用近似的遮挡体估算,而是使用了位图掩码的方式来计算采样像素对面光源的可见度。精确的软阴影方法依赖于对采样像素对面光源可见度的精确计算。Whitted于 1979 年在 “An improved illumination model for shaded display” 中提出的光线跟踪算法跟踪了采样像素点与光源采样点之间的光线,此方法天然地支持精确的软阴影,但是在算法的效率上存在很大的问题。Laine和Aila于2005年在“Hierarchical Penumbra Casting”中提出了一种基于三角形的分层遮掩体结构来加速判断是否一个三角遮挡了采样像素和光源采样点之间光线。但是若增加面光源的尺寸,此方法的效率很将锐减。Sintorn 等人于 2008 年在 “Sample-based Visibility for Soft Shadows UsingAlias-free Shadow Maps”中提出了一种无走样的阴影图方法,之后该方法也被拓展用于生成软阴影。此方法在几何着色器中应用了保守的遮掩体计算和光栅化算法,因此性能不高。Forest 等人于 2008 年在“Accurate Shadows by Depth Complexity Sampling” 中提出了深度复杂性采样的方法来确定遮掩体的数量,提高了此算法的效率。Johnson 等人于 2009 年在 “Soft irregular shadowmapping: fast, high-quality, and robust soft shadows” 中使用点光源和遮掩体边缘来估算半影区,然后再根据实际的面光源做额外的可见性测试来修正半影像素强度。此方法的挑战在于如何稳定并高效地做边缘检测。与本发明的方法类似,Benthin和Wald于2009在“Efficient ray traced soft shadows using multi-fusta tracing,,中也构建了米样像素对面光源的视景体。然而他们在计算光源可见度时是发射若干阴影测试光线,而本发明的方法则是判断并光栅化潜在的遮掩三角形集合。以上涉及的所有精确阴影方法都可以生成高质量的软阴影,但是方法效率上还有待改进。本发明的方法属于精确软阴影的范畴,是一种通用高效的阴影绘制方法。

发明内容
本发明要解决的技术问题是提供一种通用的软阴影绘制方法,在保证方法精确性的同时,提高了计算与绘制效率。方法本身完全支持动态场景、可移动可变形的阴影遮掩体及阴影接受体,同时支持可变的面光源属性。本发明解决上述技术问题的技术方案为一种高效精确的通用软阴影生成方法,包括如下步骤步骤(I)、从视点位置光栅化绘制整个场景,将每个像素点采样到的三维坐标信息绘制到浮点纹理(ItlI1)中;步骤(2)、使用基于CUDA (计算统一设备架构)的硬件加速方法计算所述的浮点纹理(ItlI1)中每个像素对应阴影值;具体分成以下三步(a)为所述的浮点纹理ItlI1中每个采样像素点P判断并且存储与之存在或者可能存在遮挡关系的场景三角形集合;(b)在每个被采样的像素点P处设置一个朝向面光源四边形的斜相机,再把与每个被采样的像素点P关联的三角形进光栅化绘制到斜相机的成像平面上,得到该采样点对光源的可见度的位图掩码表;(C)对步骤(b)中生成的位图掩码表进行归约计算,进而得出此采样点的阴影值;步骤(3)、应用步骤(2)生成的阴影值创建阴影纹理贴图,从视点位置再绘制一遍场景,使用Phong光照模型结合阴影纹理贴图计算场景的光照信息,将绘制结果输出到屏幕即可。进一步的,所述的对采样点可能存在遮挡关系的场景三角形的判断与存储方法为对于给定的场景,长方形面光源LtlL1L2L3,需要对所述的浮点纹理ItlI1中的每个采样像素进行计算从而生成一张2-D网格,该2-D网格数组中的每个格子坐标U,V)中保存了一个像素集Puv以及以此集合中所有像素对应的可能存在遮挡关系的场景三角形集合Tuv,该2-D网格的生成过程具体包括以下步骤
步骤①、在面光源的中心处放置相机,定义其成像平面为G ;步骤②、对于每个采样像素P,将其投影到相机C的成像平面G中;若投影后的像素位于成像面G的Puv里中,其中U,V)为成像面G里的像素坐标,则将P添加到集合Puv 中;步骤③、对于场景S里的每个三角形T,T中的点集Vi以及面光源中的点集Lj,计算出3-D点集Fij=Vi+ I Vi-Lj I Clij,将VJP Fij里的点都投影到相机C中,在成像面G中计算出投影后的点集的2-D包围盒AABB,再将位于G中的且被AABB覆盖到的格子U,V)处的Tuv集合中加入三角形T。总之,与之前的方法相比,本发明能够快速精确地绘制软阴影效果。本方法支持动态面光源、动态可变形场景且无须预计算,具有逼真高效通用等优点。


图I为原理示意图;图2为本方法流程图;图3为本方法绘制效果图I ;图4为本方法绘制效果图2 ;图5为本文方法(每组的左图)与光线跟踪算法(每组右图)的效果对比;图6为本文方法(图6 Ca))与光线跟踪算法(图6 (b))的结果对比图。
具体实施例方式下面结合附图以及本发明的具体实施方式
进一步说明本发明。对于由三角形组成的给定3-D场景,一个四边形面光源(图I中的LtlL1X图中未示出“L2L3”),一个给定的视点处的相机E以及对应的成像面ItlI1,本方法绘制软阴影包括以下步骤步骤(I)、从相机E位置光栅化绘制整个场景S,将每个像素点采样到的三维坐标信息绘制到纹理ItlI1中。
步骤(2)、使用基于CUDA (计算统一设备架构)的硬件加速方法计算纹理ItlI1中每个像素P对应阴影值。具体分成以下三步(a)、为ItlI1中每个采样像素P判断并且存储与之存在或者可能存在遮挡关系的场景三角形集合;(b)、在每个被采样的像素点P设置一个朝向面光源四边形的斜相机,记为PLtlL1,其成像平面为LtlL1,再把与P关联的三角形进光栅化绘制到相机的成像平面上,得到该采样点对光源的可见度的位图掩码表Mp ;(C)、对b中生成的位图掩码表Mp进行归约计算,进而得出此采样点的对面光源可见度Vp=LLcZL1U,即该点的阴影值。步骤(3)、应用生成的阴影值Vp创建阴影纹理贴图。从视点位置再绘制一遍场景,使用Phong光照模型结合阴影纹理贴图计算场景的光照信息,将绘制结果输出到屏幕即 可。步骤(2)中的(a)计算了与每个采样像素关联三角形集合。此步骤可以被视为一种加速策略,因为它可以避免将场景里的每个三角形进行光栅化。接下来将对此三角形集合的生成进行描述。同样对于给定的场景S,长方形面光源LtlL1L2L3,需要对纹理I山中的每个采样像素进行计算从而生成一张2-D网格G,G数组中的每个格子坐标(U,V)中保存了一个像素集Puv以及以此集合中所有像素对应的可能存在遮挡关系的场景三角形集合Tuv,网格G的生成过程包括以下三步首先,在面光源的中心处放置相机C,定义其成像平面为G ;其次,对于每个采样像素P,将其投影到相机C的成像平面G中。若投影后的像素P丨位于成像面G的Puv里中,其中U,V)为成像面G里的像素坐标,则将P添加到集合Puv中。最后,对于场景S里的每个三角形T,T中的点集Vi以及面光源中的点集Lj,计算出3-D点集Fij=Vi+ I Vi-Lj I Clij,将VjPFij里的点都投影到相机C中,在成像面G中计算出投影后的点集的2-D包围盒AABB,再将位于G中的且被AABB覆盖到的格子(u,v)处的Tuv集合中加入三角形T。通过以上方法,我们为每个采样像素构建了一个保守的却紧密近似的遮挡三角形集合。本发明的实现方法具体可细分如下步骤(Al )、绘制一遍场景,将像素点的三维坐标保存在一张浮点纹理(positionimage)里;(A2)、对position image里的每个三维采样点分配一个线程,将三维点投影到以面光源中心为光源的裁剪空间下,计算出二维的坐标轴对齐的包围盒AABB,对此AABB进行细分为64*64 (32*32或者128*128)的网格;(A3)、对position image里的每个三维采样点分配一个线程,将三维点投影到以面光源中心为相机视点的裁剪空间下,根据步骤(A2)中计算得出的AABB,找到其对应的网格ID,再将三维点投影到以面光源中心为光源的视空间下,计算并保存下每个网格下可以看到的三维采样点的最大深度,生成max depth image高度图;(A4)、对每个三角形分配一个线程,连接面光源的四个顶点与三角形的三个顶点,并延长至与max depth image高度图相交(可以用线性查找法、二分查找法、线性加二分的混合方法等,进行保守求交),若没有交点,把延长长度设为初始值(一个比max depthimage中所有数都大的数)。将得到的12个交点与原来三角的3个顶点共15个点投影到光源下,并求出它们的aabb包围盒,将此aabb包围盒所覆盖的网格数保存到数组Arr中对应的元素里,即得出此三角形可能影响的网格数;(A5)、计算出步骤(A4)中网格数数组Arr的前缀和,即可得到总的三角ID——网格ID对的数量,从而得到应该在显存上分配对应空间的大小,以及每个三角形对应的偏移量;(A6)、对每个三角形分配一个线程,并行地将此三角形的aabb包围盒覆盖下的网格所形成的二元组(三角ID,网格ID)保存到三角ID—网格ID对数组里;(A7)、以网格ID为关键字,对三角ID——网格ID对数组进行基数排序;(AS)、为每个三角ID—网格ID对分配一个线程,找到同一个网格ID下的三角形ID在三角ID——网格ID对数组里的起始地址和终止地址,即得到了每个网格ID对应的三角形列表; (A9)Jfposition image里的每个三维采样点分配一个线程。首先,将三维点投影到以面光源中心为光源的裁剪空间下,根据步骤(A2)中计算得出的AABB,找到其对应的网格ID ;其次,在每个被采样的三维点P处设置一个朝向面光源四边形的斜相机,计算生成此斜相机的MVP (模型视点投影)矩阵;最后,将此网格ID对应的三角形列表里的所有三角形通过此MVP矩阵进行坐标变换到此相机的裁剪空间下,再进行光栅化(扫描线算法),将光栅化的结果保存在(32*32bit)Bit Mask里,最后对Mask时行归约,得到该采样点的可见度,即此点的阴影值。(A10)、应用生成的阴影值创建阴影纹理贴图。从视点位置再绘制一遍场景,使用Phong光照模型结合阴影纹理贴图计算场景的光照信息,将绘制结果输出到屏幕即可。其中,步骤(Al)与(AlO)是使用了 Cg着色语言实现的,而步骤(A2)到(A9)的计算均是用CUDA实现的。本文算法的实现使用的软件平台为Microsoft visual studio 2008与OpenGL,顶点与片元着色器程序由Cg语言编写,并使用了 CUDA来加速并行算法的计算效率。硬件平台为 3.4GHz Inter (R) Core (TM) 7-2600 CPU、4GB 内存以及 NVIDIA GeForce GTX580GPU。图3和图4是我们使用本文方法得到的软阴影绘制效果图。图5给出了我们的方法与光线跟踪方法绘制的同一场景同一视角下的效果对比图,其中每组图的左图为本文方法生成的效果,右图为光线跟踪算法生成的效果。图6 (a)和图6 (b)则提供了两种方法下生成的软阴影的绘制结果的差值,图6 (c)是将此差值结果放大80倍后的结果,可以看出非零像素点随机地分布于半影区域内,因此可以认为这是由两种方法实现时的数值精度造成的,而算法本身的理论结果应该是一致的。我们测试的模型与场景包括蜘蛛(41K三角形),鸟巢(165K三角形),教堂(74K三角形),牛阵(786K三角形),茶壶阵(823K三角形)以及龙(81K三角形)。表I中提供了这些模型或场景在不同输出分辨率下的绘制效率。表I不同分辨率下算法的效率单位帧/秒
权利要求
1.一种高效精确的通用软阴影生成方法,其特征在于包括如下步骤 步骤(I )、从视点位置光栅化绘制整个场景,将每个像素点采样到的三维坐标信息绘制到浮点纹理(ItlI1)中; 步骤(2)、使用基于CUDA的硬件加速方法计算所述的浮点纹理(ItlI1)中每个像素对应阴影值;具体分成以下三步(a)为所述的浮点纹理(ItlI1)中每个采样像素点(P)判断并且存储与之存在或者可能存在遮挡关系的场景三角形集合;(b)在每个被采样的像素点(P)处设置一个朝向面光源四边形的斜相机,再把与每个被采样的像素点(P)关联的三角形进光栅化绘制到斜相机的成像平面上,得到该采样点对光源的可见度的位图掩码表;(c)对步骤(b)中生成的位图掩码表进行归约计算,进而得出此采样点的阴影值; 步骤(3)、应用步骤(2)生成的阴影值创建阴影纹理贴图,从视点位置再绘制一遍场景,使用Phong光照模型结合阴影纹理贴图计算场景的光照信息,将绘制结果输出到屏幕即可。
2.根据权利要求I所述的一种高效精确的通用软阴影生成方法,其特征在于所述的对采样点可能存在遮挡关系的场景三角形的判断与存储方法为对于给定的场景,长方形面光源(LtlL1L2L3),需要对所述的浮点纹理(I山)中的每个采样像素进行计算从而生成一张2-D网格,该2-D网格数组中的每个格子坐标(u,v)中保存了一个像素集Puv以及以此集合中所有像素对应的可能存在遮挡关系的场景三角形集合Tuv,该2-D网格的生成过程具体包括以下步骤 步骤①、在面光源的中心处放置相机,定义其成像平面为G ; 步骤②、对于每个采样像素(P),将其投影到相机C的成像平面G中;若投影后的像素P ’位于成像面G的Puv里中,其中U,V)为成像面G里的像素坐标,则将P添加到集合Puv中; 步骤③、对于场景S里的每个三角形T,T中的点集乂1以及面光源中的点集Lj,计算出.3-D点集Fij=Vi+I Vi-Lj I Clij,将VjP Fij里的点都投影到相机C中,在成像面G中计算出投影后的点集的2-D包围盒AABB,再将位于G中的且被AABB覆盖到的格子(u,v)处的Tuv集合中加入三角形T。
全文摘要
本发明提出一种高效精确的通用软阴影生成方法,该方法的框架流程包括以下三个部分绘制视点下的场景,将每个采样像素的三维坐标信息绘制到一张浮点纹理中;在每个被采样的像素点处设置一个朝向面光源四边形的斜相机,把可能在此相机视景体内的场景三角形进光栅化,得到该采样点对光源的可见度信息,进而得出此采样点的阴影值;在视点下应用前一步骤生成的阴影值再绘制一遍场景,将绘制结果输出到屏幕即可。本方法支持动态面光源、动态可变形场景且无须预计算,具有逼真高效通用等优点。
文档编号G06T15/60GK102831634SQ20121029343
公开日2012年12月19日 申请日期2012年8月16日 优先权日2012年8月16日
发明者王莉莉, 王泽 , 石裕隆, 郝爱民 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1