专利名称:一种视野驱动的实时阴影方法
技术领域:
本发明涉及一种三维虚拟环境中的实时阴影方法,特别一种视野驱动的实对阴影方法。
背景技术:
在当前研究的基于阴影图的实时阴影绘制方法中,针对经典阴影图方法阴影应用于场景 绘制中阴影走样问题的研究方法,主要分为两大类。第一大类是以Perspective Shadow Maps (PSM)为基础,这类方法都是通过对阴影图重新参数化来进行反走样。另外一类方法是以 Adaptive Shadow Maps (ASM)为基础,这类方法的基本思想是提高阴影图的分辨率,来达 到反走样的目的。
PSM方法把场景和光源都变换到后投影空间并生成阴影图。通过变换,距离视点近的物 体被放大,距离视点远的物体被縮小。阴影图的生成也是在后投影空间,距离视点近的物体 在阴影图上所占的比率也就更大,采样更精细。之后的Trapezoidal Shadow Maps (TSM)和 Light Space Perspective Shadow Maps (LiSPSM)对PSM又做出了进一步的改进。这类方法都 显著地减少了透视走样,却不能减少投影走样,而且反走样的效果,受到光源和视点位置的 影响很大,很难应用于大规模场景中的实时阴影生成。
ASM通过把阴影图组织成一种四叉树的层次结构来减少阴影的走样。对于场景中阴影容 易走样的区域,利用高分辨率的阴影图来映射,增加其采样率。该方法在当前的硬件条件下, 很难做到实时绘制。利用GPU实现了该方法,但仍然很难满足复杂场景下的实时阴影绘制的 需要。Resolution-Matched Shadow Maps (RMSM)是的一种改进实现方法,利用GPGPU技 术来实现阴影生成的并行计算,利用该方法绘制出阴影的效果较好,但速度依然不快。Queried Virtual Shadow Maps (QVSM)和Fitted Virtual Shadow Maps (FVSM)作为两种ASM最新的 改进方法,都是将原始的阴影图进行动态四叉树划分,对于场景中阴影容易走样的区域,利 用高分辨率的阴影图来映射。这两种方法都克服了 ASM中所需要复杂的数据结构的缺点, 在当前主流显卡下,能够实时绘制出反走样的阴影。但每绘制一帧图像,需要绘制多幅阴影 图,速度受到了影响。Practical Shadow Mapping (PrSM)同本发明的方法最接近,同本发明 的方法相比,PrSM获取整个视椎体的包围盒,再在该包围盒内生成阴影图并映射到场景中去。 阴影图的大小受到视椎体的参数的影响,当视椎体的范围超出了视野所能够看到的场景的范 围的时候,就会造成阴影图的无效渲染,影响阴影的质量。Parallel-Split Shadow Maps (PSSM)
可以看做PrSM的一种改进,该方法沿着视点的方向,将视椎体划分成若干个子视椎体,在 光源坐标系下分别为每个子视椎体计算包围盒并绘制一张独立的子阴影图映射到场景里,生 成实时阴影。这种方法和QVSM和FVSM—样,需要绘制多张阴影图,阴影的绘制速度受到 了影响
发明内容
.
本发明的技术解决问题克服现有技术的不足,提供一种视野驱动的实时阴影方法,该 方法同时具有绘制速度快,能够绘制出高质量的阴影。
本发明的技术解决方案 一种视野驱动的实时阴影方法,包括以下步骤
a. 把视野反投影到光源平面产生投影区域,为该投影区域生成一个二维的AABB包围 盒;所述的视野是指从视点位置出发,能够看到的阴影接收体的范围;
b. 在所述的AABB包围盒范围内生成阴影c. 将该阴影图映射到场景中生成阴影。
所述的步骤a中生成一个二维的AABB包围盒后,判断该AABB包围盒是否需要分裂 成为两个子AABB包围盒,若需要,则分裂该AABB包围盒,以使后续产生的阴影图反走样 效果质量高。
所述的需要分裂的过程分为判断是否需要分裂和进行分裂的两个过程;
其中判断过程为首先计算出阴影图利用率v,在光源平面上为视野投影所得到的投影 区域求得其AABB包围盒,分别求出投影区域的面积^和AABB包围盒的面积Sr两者的比 值Sp/Sr即为v,设定一个所需要的阈值q,当v〈 il的时候,需要把二维AABB包围盒分 裂成两个子AABB包围盒;
进行分裂的过程为求得投影区域的两条对角线的交点C,选取C作为AABB包围盒分 裂的基准点,从C点出发绘制两条分别平行于AABB包围盒的边,并且该两边相互垂直,然 后从其中的一条直线出发,把投影区域分成两个多边形,再分别对这两个多边形求出两个子 AABB包围盒,并求出两个子AABB包围盒的面积和S1,重复以上方法,对于另一条直线同 样也可以得到两个子AABB包围盒及二者的面积和S2,比较S1和S2的大小,选取两者中 的较小值所对应的边为最终的分裂边。
所述的步骤a把视野反投影到光源平面产生投影区域的过程为
(1) 从视点位置绘制出视野;
(2) 利用下述计算公式将视野反投影到光源平面产生投影区域
<formula>formula see original document page 6</formula>其中(X,y,Z)为视野范围中的某个任意片元尸的坐标,(X',少〕为视野范围中的某
、任意片元尸在光源平面上的投影P '的坐标, 和W£yeM^/WeW分别表示光源
坐标系下的模型视点矩阵和视点坐标系下的模型视点矩阵的逆阵。 本发明与经典的阴影图方法相比的优点在于-
(1) 能够绘制出高质量的阴影 本发明把视野反投影到光源平面产生投影区域,为该投影区域生成一个二维的包围盒,
这样有了包围盒,阴影图的绘制仅仅局限于包围盒内,避免了场景中不必要的阴影绘制,提 高了阴影图的利用率,'反走样的效果好,使绘制出的阴影的效果大大提高。
(2) 具有绘制速度快,实时性强 本发明的整个过程仅只需要绘制一到两幅阴影图,实时性强,可以满足一个上百万面片
的大规模场景中实时阴影绘制的需要。
图1为本发明的视野和视椎体的区别; 图2A为本发明生成视野并反投影的过程示意图; 图2B为本发明反投影区域生成AABB包围盒的示意图; 图3为本发明中阴影的生成过程; 图4A为本发明AABB包围盒垂直分裂过程示意图; 图4B为本发明AABB包围盒水平分裂过程示意图; 图5为本发明方法具体实现步骤。
具体实施例方式
如图5所示,本发明具体实现步骤如下
步骤S501,在步骤S501中,把视野201反投影到光源平面202,在光源平面202为视野 201生成一个二维的AABB包围盒204。
本发明的视野和视椎体不同,是指从视点位置出发,能够看到的朋影接收体的范围。图
1表示了视野和视椎体的区别,视椎体101是图形学上标准的视椎体概念,由投影变换矩阵 所决定,深度范围一直从前剪裁面1011延伸到后剪裁面1012。而本发明的视野103,指的是 视点102所能够f到的场景中最远的范围,在图1中用网格线标出。
由于是平行光源,可以认为在世界空间中,存在一个无限大的矩形光源平面。场景中的 每条光线,都是由该平面沿着垂直于该平面的方向发出的射线。
矩形光源平面的四条边的方向由光源坐标系下的模型视口矩阵和投影矩阵来决定。矩形 光源平面的四条边在世界坐标系中的方向,分别和利用标准阴影图方法,从光源位置绘制场 景的前剪裁面矩形的四条边在世界坐标系中的方向一致。
由图1可知,当前的视点102所能看到的区域,都在视野103中,只要在视野103中绘 制出正确的阴影即可。在视野103之外的场景中,绘制出的阴影也是无效的。在阴影图分辨 率固定的情况下,在视野103中增大阴影图的利用率,成为了本发明反走样的关键。
视野的求法
为了获取视野范围,需要得到当前视椎体范围内距离视点最远的片元的坐标信息。本发 明的求法是分别把深度缓存的初始值和深度测试的比较函数调整成glClearDepth(O.O)和 glDepthFunc(GL一GEQUAL),此时场景中的可见部分是都是距离视点最远的区域。这些区域 即为本发明的"视野"范預。
视野向光源平面投影的计算
对于视野范围中的某个任意片元尸,其在视点坐标系下的位置为o,少,z;)。其在光源
平面上的投影P加坐标0',y')的计算公式为
<formula>formula see original document page 7</formula>(1)
其中,^丄妙,M^e/v^和附fi^M^/vfew分别表示光源坐标系下的模型视点矩阵和视点坐 标系下的模型视点矩阵的逆阵。
图2A所示为视野范围向光源平面投影的过程。图2B所示为在光源平面上投影区域的 AABB包围盒的示意图。为了尽可能地增大阴影图的利用率,本发明将.视野区域201沿着光
源方向投影到光源平面上,在光源平面202上得到一块四边形的投影区域203。如图2B所示, 在光源平面202上,求得投影区域203的AABB包围盒(Axis Aligned Bounding Box) 204。 投影的AABB包围盒的计算
视野是以一张纹理存储在显存中的。然而现在的GPU是不能那么智能地通过这张纹理来 计算出视野的范围的,需要把本步转移到CPU中去计算。然而,如果把整张纹理数据从显存 上传输到内存上,会严重影响到实时计算的效率(例如图像窗口大小为1024*768,片元每个 位置用4*32位浮点数来表示,每绘制一帧就需要从显存向内存传输12MB的数据)。本发明 使用了一个小技巧,先通过RTT技术,把这张纹理的四个角渲染到一张2*2大小的纹理中, 再把这张2*2的纹理传输到0 11上,利用四个角组成视野的四边形。计算出它们在光源平面 上的投影,并计算二维AABB包围盒。
在步骤S501中生成一个二维的AABB包围盒后,还可以判断该AABB包围盒是否需要 分裂成为两个子AABB包围盒,若需要,则分裂该AABB包围盒,以使后续产生的阴影图反 走样效果质量高。分裂的过程分为判断是否需要分裂和如何进行分裂的两个过程。
图4所示为AABB包围盒分裂过程示意图。
当视线和阴影接收体夹角较小的时候,视野范围的跨度较大,向光源平面投影所得到的 四边形变得狭长,绘制所得到的AABB包围盒也较大,阴影图的利用率变得低下,造成了阴 影走样。受到PSSM方法的启发,本发明采用一种阴影图分裂的方法来解决上面所遇到的问 题。
判断是否需要分裂为首先计算出阴影图利用率v。在光源平面上为视野投影所得到的 投影区域203求得其AABB包围盒204,分别求出二者的面积&和&。其二者的比值Sp/& 即为v。很显然,v越小,阴影反走样的效果就越差。设定一个阈值n (11在50%到100%之 间,本发明选取阈值11为60%),当v〈 i]的时候,把AABB包围盒R分裂成两个子AABB 包围盒R1和R2。
具体进行分裂的过程如下求得投影区域203的两条对角线的交点C,选取C作为包围 盒204分裂的基准点。从C点出发可以做两条分别平行于AABB包围盒204的边,并且相互 垂直的直线。首先从其中的一条直线a出发,把投影区域203分成两个多边形2031和2032, 再分别对这两个多边形2031和2032求出AABB包围盒2041和2042,并求出AABB包围盒 2041和2042的面积和Sl。重复以上方法,对于另一条直线6同样也可以得到两个AABB包 围盒2043和2044及二者的面积和S2。比较Sl和S2的大小,选取两者中的较小值所对应的
边为最终的分裂边。这种做法的依据仍然是把包围盒做得更加紧致,增大阴影图的利用率。 AABB包围盒204分裂成两个子AABB包围盒2041和2042 (或2043和2044)之后,
再按照图2A和图2B的方法,分别在这两个子AABB包围盒2041和2042 (或2043和2044)
中绘制阴影图,并分别映射到场景中,生成实时阴影。
在步骤S502中,生成阴影图,阴影图所覆盖的范围仅仅在AABB包围盒204内。 绘制阴影图的过程如下,把视点位置调整到光源所在的位置,投影模式改为正交投影 (Ortho2D),正交投影的上下左右四条边和AABB包围盒的四条边重合。这样就可以保证绘
制的阴影图所覆盖的范围仅仅在AABB包围盒内。
在步骤S503中,将阴影图映射到场景中生成阴影。
在此步骤中,根据光源平面上的二维AABB包围盒,从光源位置绘制阴影图;最后利用 延时阴影的方法,绘制出最终的结果。
延时阴影方法是延时着色(Deferred Shading)方法的一种变种方法。其好处是在多幅阴 影图映射到场景中的时候,可以减少绘制场景的次数,以此来提高实时绘制速度。场景中的 片元通过了各种测试,最终形成了屏幕上的像素以后,再对这些像素进行阴影着色计算。
延时阴影方法的第一步利用多重渲染到纹理(Multiple Render To Texture)技术,从视点 位置绘制场景,把场景中片元的颜色值和相对于视点位置的坐标值分别保存在两张纹理中; 第二步和经典的阴影图方法一致,从光源位置出发绘制场景,并把相对于光源位置的片元的 深度值保存在一张阴影图中;第三步首先绘制一个满屏的四边形,讲从试点位置渲染的到的 颜色纹理映射到该四边形上。对于颜色纹理中的每个像素,从位置纹理中取出它的位置信息, 把位置信息通过矩阵坐标变换,变换到光源坐标系下,同阴影图中存储的深度值进行比较, 以确定该片元是否处于阴影中。对于处于阴影中的片元,进行阴影着色处理;对于处于阴影 外的片元,保持其颜色不变。
图3所示为阴影的生成过程。本发明中仅仅对得到的投影区域203的AABB包围盒204 的范围内绘制阴影图并映射到场景中生成阴影301 (如图3所示)。利用这种阴影图的绘制方 法,在视野范围内,最大程度地縮小了阴影图所覆盖的场景范围。在阴影图分辨率不变的条 件下,最大限度地减少了阴影图中每个纹元所映射的片元数,来获得反走样的效果。
利用阴影图绘制阴影的过程如下从视点位置绘制场景,对于场景中的每个片元,假设 其坐标为(x,^z)。利用矩阵变换,变换到光源坐标系下,得到坐标为(;c', , z')。与存储在阴 影图中的对应的值相比较。如果片元的深度值大于存储在阴影图中的深度值,说明该片元和
光源之间有遮挡物,该片元处于阴影中,对该片元进行阴影着色处理;否则,该片元处于阴 影外。
本发明方法的编写利用OpenGL图形库结合GLSL着色语言,在VC2005环境下实现的。 虽然本发明己以较佳实施例揭露如上,然其并非用以限定本发明。本发明所属技术领域
中具有通常知识者,在不脱离本发明的精神和范围内,当可作各种的更动与润饰。因此,本
发明的保护范围当视权利要求书所界定者为准。
权利要求
1、一种视野驱动的实时阴影方法,其特征在于步骤如下a. 把视野反投影到光源平面产生投影区域,为该投影区域生成一个二维的AABB包围盒;所述的视野是指从视点位置出发,能够看到的阴影接收体的范围;b. 在所述的AABB包围盒范围内生成阴影图;c. 将该阴影图映射到场景中生成阴影。
2、 根据权利要求1所述的视野驱动的实时阴影方法,其特征在于所述的步骤a中生 成一个二维的AABB包围盒后,判断该AABB包围盒是否需要分裂成为两个子AABB包围 盒,若需要,则分裂该AABB包围盒,以使后续产生的阴影图反走样效果质量高。
3、 根据权利要求2所述的视野驱动的实时阴影方法,其特征在于所述的需要分裂的过 程分为判断是否需要分裂和进行分裂的两个过程;其中判断过程为首先计算出阴影图利用率v,在光源平面上为视野投影所得到的投影 区域求得其AABB包围盒,分别求出投影区域的面积&和AABB包围盒的面积Sr两者的比 值Sp/Sr即为v,设定一个所需要的阈值n,当v〈 q的时候,需要把二维AABB包围盒分 裂成两个子AABB包围盒;进行分裂的过程为求得投影区域的两条对角线的交点C,选取C作为AABB包围盒分 裂的基准点,从C点出发绘制两条分别平行于AABB包围盒的边,并且该两边相互垂直,然 后从其中的一条直线出发,把投影区域分成两个多边形,再分别对这两个多边形求出两个子 AABB包围盒,并求出两个子AABB包围盒的面积和S1,重复以上方法,对于另一条直线同 样也可以得到两个子AABB包围盒及二者的面积和S2,比较S1和S2的大小,选取两者中 的较小值所对应的边为最终的分裂边。
4、 根据权利要求1或2所述的视野驱动的实时阴影方法,其特征在于所述的步骤a 把视野反投影到光源平面产生投影区域的过程为(1) 从视点位置绘制出视野;(2) 利用下述计算公式将视野反投影到光源平面产生投影区域 <formula>formula see original document page 3</formula>(1)其中(x,乂z)为视野范围中的某个任意片元户的坐标,0'j')为视野范围中的某个任意片元户在光源平面上的投影尸怖坐标,^h^Mo必v/ew和附^eM^ few分别表示光源 坐标系下的模型视点矩阵和视点坐标系下的模型视点矩阵的逆阵。
全文摘要
一种视野驱动的实时阴影方法,三维虚拟环境中包括以下步骤a)把视野反投影到光源平面产生投影区域,为该投影区域生成一个二维的AABB包围盒;b)生成阴影图,该阴影图所覆盖的范围仅仅在该AABB包围盒内;c)将该阴影图映射到场景中生成阴影。本发明避免了场景中不必要的阴影绘制,提高了阴影图的利用率,反走样的效果很好,而且只需要绘制一到两幅阴影图,方法的实时性很强,可以满足一个上百万面片的大规模场景中实时阴影绘制的需要。
文档编号G06T15/50GK101393651SQ20081022621
公开日2009年3月25日 申请日期2008年11月7日 优先权日2008年11月7日
发明者沈旭昆, 勋 胡, 越 齐 申请人:北京航空航天大学