基于双向半影图的软阴影实时绘制方法

文档序号:6603009阅读:192来源:国知局
专利名称:基于双向半影图的软阴影实时绘制方法
技术领域
本发明涉及一种基于双向半影图的软阴影实时绘制方法。
背景技术
阴影对于场景中物体位置提供了重要的视觉线索,阴影的大小和位置等暗示了几 何场景的信息,如物体的形状、物体间的位置关系及光源的位置等信息。阴影绘制分为硬阴 影和软阴影两种。软阴影能够使绘制的场景更加真实,但同硬阴影相比,软阴影绘制的计算 量更大,计算过程更加复杂。因此实时绘制软阴影是真实感图形绘制研究领域的一个热点, 也是研究的一个难点。针对实时软阴影绘制人们已经做了许多研究,近年来提出的阴影算法主要集中在 对阴影图算法和阴影体算法的改进及混合方法的研究上。这些方法大都首先以光源的中心 作为一个点光源对场景进行绘制得到硬阴影,然后利用各种方法对硬阴影的边缘进行扩展 以及平滑处理,最后得到软阴影效果。Chan等提出的方法就是这一类方法,吕伟伟等对这一 方法进行了改进,但是并没有改变算法不能对半影区内部进行处理的问题。近几年发表了许多关于实时软阴影的成果,实时软阴影的绘制方法大致可以分为 两类基于物体空间的算法和基于图像空间的算法,这两类算法分别在阴影体算法和阴影 图算法的基础上进行扩展。1)基于物体空间的方法Akenine-Moller和Assarsson等提出了一种“半影楔子”的软阴影算法,在多边形 轮廓边的基础上建立一种新的像素——半影楔子(penumbra wedge),根据阴影接收表面上 的半影楔子中的位置进行插值,从而得到该点的阴影级别,在本影外边模拟出柔和的过渡。 但该方法需要进行预计算,并且不能够处理非多边形物体的阴影。Chan等提出了一种通过 构造光滑翼来生成软阴影的方法,首先创建一张阴影映像表,然后将光滑翼的alpha和深 度值绘制到光滑翼缓冲中,最后进行深度比较和过滤生成阴影。该方法也只计算了外半影, 因此遮挡物的阴影始终会有全影区域。此外,相邻边之间的连接也存在问题,如果光源较大 连接处会出现明显走样。Wyman等提出了与相似的基于阴影图的半影图方法,只是在提取的 轮廓边上构建的辅助像素不相同。首先以光源为视点绘制一张阴影图,然后使用CPU在光 源视点下对物体的轮廓边进行提取,将阴影图产生的阴影作为本影区,根据轮廓边由本影 区向外扩展生成半影区并计算半影区的光照强度生成半影图,最后根据阴影图和半影图对 场景进行绘制。该方法同样忽略了半影区的内部,当光源较大或者遮挡物与阴影接收体的 距离较大时会产生明显的走样问题。吕伟伟等在的基础上进行了改进,将物体的轮廓边提 取放到的GPU中来执行,加速了该方法的绘制速度,但是并由于依然是在物体空间对半影 图进行绘制,而半影区的内部在光源中心是不可见的,所以绘制得到的半影图只能是从半 影区的中心向半影区的外部扩展,没有解决不能对半影区内部进行软阴影绘制的问题。2)基于图像空间的方法由于阴影图算法的绘制速度非常快,所以基于图像空间的软阴影绘制方法一直是
3一个研究热点。Reeves等于1987年提出了一种基于阴影图的PCF(Percentage Closer Filtering)方法,该方法在进行绘制时读取每一个屏幕像素点在深度纹理中的对应点及 它周围的坐标点的深度值,将该点深度与周围坐标点的深度值进行深度测试的通过率作为 该屏幕像素的阴影标志。但是该方法不能够自适应的确定阴影图中的采样范围,所以半影 区的大小是固定的。Fernando针对这一问题提出了一种PCSS(Percentage Closer Soft Shadows)方法,该方法能够根据光源、遮挡物和阴影接收体的位置关系自适应的计算在过 滤时阴影图的采样范围。Atty等和Guermebaud等在2006年提出了软阴影映射的概念,把 阴影图看作是对场景的离散化表示,每个采样点视为一个很小的遮挡物,采用这种简化的 场景表示来计算场景中每一个采样点的光照强度。该方法的问题在于当深度变化较大时 这种方法会出现漏光和投影重叠问题,并且当半影区比较大时会对算法的效果和效率产生 比较大的影响。Guermebaud等在2007年利用构建遮挡轮廓边的方法解决了漏光和投影重 叠问题,但是并没有解决光源单采样导致的阴影错误问题。Louis等利用深度剔除的方法对 解决了投影重叠和光源单采样问题,但是并没有完全解决算法的漏光问题。

发明内容
本发明要解决的技术问题是与传统的半影图相比,双向半影图从阴影图中的阴 影边缘向半影区内部和外部两个方向进行扩展,解决了传统半影图不能对半影区内部进行 处理的问题。本发明采用的技术方案为(1)从光源中心对整个场景进行绘制得到阴影图。(2)从阴影图中对阴影边缘点进行识别和提取,根据所提取到的边缘点和场景中 的相关信息计算半影区的大小和处于半影区中顶点的光照变化强度,生成双向半影图。(3)依据阴影图和双向半影图对场景阴影进行绘制。本发明采用的拉普拉斯操作数是3X3操作数,如公式(1)、(2)所示 其中公式(2)忽略了区域中处于对角线位置的四个像素点。利用两个操作数我们 都可以对阴影图中的边缘点进行很好地识别,并且以公式(2)作为操作数所提取的边缘点 相对于以(1)作为操作数所提取的边缘点差别很小。本发明以公式(2)作为操作数对阴影 图的边缘点进行提取,在提取过程中减少了近一半的计算量,且提取效果令人满意。本方法生成双向半影图无需对场景进行绘制,首先创建一张纹理,然后对纹理中 的每一个像素点进行着色生成双向半影图,所有的计算都在GPU中进行。设阴影图中对应 双向半影图当前绘制像素点纹理坐标的像素点为Ri,每一个像素点的着色步骤如下1)如果对应的阴影图中Ri为边缘点,该像素点是双向半影图中半影区的中心,直 接将该像素点赋值为黑色并返回;2)在一定范围内查找阴影图中距离Ri最近的阴影边缘点Ei,如果没有找到Ei或者 Glistance(RijEi) >巧,则Ri不在半影区,直接将该像素点绘制为白色并返回(Ti表示Ei所对应的扩展半径),查找的范围依据场景的大小以及双向半影图和阴影图的分辨率而定;3)如果在指定的范围内找到Ei并且distanced^,Ei) <巧,则Ri在半影区,记录
从半影区中心点到该点的光照强度变化幅度/ =到双向半影图,同时记录Ei所
对应的d印th。和Cbpthu分别为Cbpthei和d印thui。总之与与原有方法相比,本方法的主要贡献体现在以下两点第一,直接利用阴影 图对阴影边缘进行提取,不需要专为阴影边缘提取而对整个场景进行一遍绘制;第二,得到 的双向半影图从阴影边缘向半影区内部和半影区外部两个方向进行扩展,能够对场景中的 半影区内部进行处理。本发明的方法涉及到的所有计算都在GPU中进行,能够达到实时性 能。


图1方法整体流程图;图2阴影图的局部放大效果图;图3使用两种算子进行阴影边缘提取的效果对比图;图4半影区信息计算示意图;图5场景阴影绘制示意图;图eSphere模型在不同双向半影图分辨率下绘制效果对比图,图6a双向半影图分 辨率为256*256时的绘制效果、图6b双向半影图分辨率为512*512时的绘制效果、图6c双 向半影图分辨率为1024*1024时的绘制效果;图7不同方法绘制效果对比图,图7a阴影图方法绘制效果、图7b传统半影图方法 绘制效果、图7c该专利的方法绘制效果;图SDwarf模型在不同光源大小情况下绘制效果对比图,图8a光源半径为0时的 绘制效果(点光源)、图8b光源半径为4时的绘制效果、图8c光源半径为8时的绘制效果、 图8d光源半径为12时的绘制效果;图9不同双向半影图分辨率情况下不同复杂度模型绘制效率对比图。
具体实施例方式本发明的双向半影图的场景绘制实现方法具体如下在进行场景绘制的时候根据阴影图和双向半影图中的信息对场景中的阴影进行 绘制,我们把要绘制的顶点分为如图5所示的几种情况在图5中我们假设一个由光源、物体A、物体B和物体C组成的简单场景,阴影图中 的绿色实线是双向半影图中所保存的半影区域。我们把场景中的顶点分成下面4中情况分 别进行绘制1)三个物体的红色实线部分所对应的半影信息为空,只需根据阴影图对这些点进 行绘制;2)物体A的蓝色实线部分所对应的半影信息不为空,但是由于这些顶点的深度值 与它们所对应的Cbpthei只有很小的差别并且与Cbpthui的差别较大,据此判断这些点是遮 挡物上面的顶点,能够看到整个光源;3)物体B中的红色虚线部分所对应的半影信息不为空,并且这些点的深度值与它们所对应的Cbpthui只有很小的差别而与Cbpthei的差别较大,据此判断这些点是处于半影 区中的顶点,结合阴影图和双向半影图信息对这些点的阴影强度进行计算;4)虽然物体C中的绿色虚线部分所对应的半影信息不为空,但是由于其深度值比 它们所对应的Cbpthui要大,并且这个差值有一个明显的不连续性,所以这一部分完全处于 阴影之中。本发明主要针对传统半影图只能对半影区外部进行处理而导致本影区较小时绘 制结果出现失真这一问题,提出了一种基于双向半影图的软阴影实时绘制方法。以光源位 置为视点绘制场景得到阴影图后,在图像空间直接根据阴影图利用拉普拉斯操作数对阴影 边缘点进行识别和提取,加快了提取阴影边缘的速度,有助于提高阴影绘制的效率。本发明 方法的优点还在于得到的双向半影图是从提取的阴影边缘向半影区内部和半影区外部两 个方向进行扩展,能够对场景中的半影区内部进行处理,解决了在光源较大导致本影区较 小时的走样问题,可以得到令人满意的软阴影效果。本方法的实验环境为Intel酷睿2四核2. 4GHz CPU、2G内存、双NVIDIA GeForce GTS8800显卡、运行Windows xp操作系统的PC机。实验程序基于DirectX 9.0,Shader程 序使用Shader Model 3. 0方式编译,开发环境为Visual Studio 2008Team Suite。本发明 所有实验所采用的场景分辨率均为1024*1024。表1是对于不同复杂度的模型在不同的阴影图和双向半影图分辨率情况下,本发 明方法和阴影图方法的绘制效率对比。由表1可以看出对于100万三角形数量的复杂模 型,在阴影图和双向半影图分辨率为512*512时,本发明方法的绘制帧率可达到60帧/秒 以上,即使是在1024*1024分辨率下,其绘制帧率仍能达到28帧/秒,能够保证实时绘制的 需要。此外,由图9可以看出随着纹理分辨率的增大,方法受模型复杂度的影响越来越小, 双向半影图分辨率对最终的图像绘制质量有较大的影响。表1不同阴影图/双向半影图分辨率情况下不同复杂度模型绘制效率对比。
权利要求
双向半影图的软阴影实时绘制方法,具体可分为以下四个步骤(1)以光源位置为视点绘制场景得到阴影图;(2)根据阴影图利用拉普拉斯操作数进行阴影边缘提取,然后根据光源大小以及光源、遮挡物和阴影接收体三者之间的位置关系计算阴影图中提取到的阴影边缘点所对应的半影区宽度,边缘点的灰度强度表示其所对应半影区的宽度大小;(3)根据阴影边缘点所记录的半影区宽度,从阴影边缘点向内半影区和外半影区两个方向进行扩展,计算光照强度沿两个方向的变化幅度,生成双向半影图;(4)从视点对场景进行绘制,结合阴影图和双向半影图中所存储的信息对场景的阴影进行处理,生成软阴影效果。
2.根据权利要求1所述的方法,进一步包括所述拉普拉斯操作数是对二维函数进行运算的二阶运算的二阶导数的操作数,在离散 情况下处理时,对以f(i,j)为中心的3X3区域施以3X3加权屏蔽窗口,计算出此窗口的 相关值,得到拉普拉斯操作数图像g(i,j)。
3.根据权利要求1所述的方法,进一步包括所述边缘点所对应的半影区宽度的计算具体为,根据光源半径R、以光源中心 为视点时遮挡物深度d印th。和阴影边缘点深度值d印thu,求出实际半影区的宽度 求出半影应阴影图中的宽度为 唭中,°为阴影图的法线与光源中心点到场景中阴影边缘点线段的夹角;为阴影图中的每一个边缘点存储 一个扩展半径 ,作为双向半影图中从阴影边缘点向内半影区和外半影区的扩展宽度。
4.根据权利要求1所述的方法,进一步包括所述生成双向半影图具体为,首先创建一张纹理,然后对纹理中的每一个像素点进行 着色生成双向半影图,而无需对场景进行绘制。
全文摘要
针对传统半影图阴影边缘提取速度慢,并且只能对半影区外部进行绘制而导致光源较大时绘制结果出现失真的问题,本发明提出一种基于双向半影图的软阴影实时绘制方法。在阴影绘制阶段,直接利用阴影图在图像空间对阴影边缘进行提取,提升提取阴影边缘的速度。并根据提取的阴影边缘向半影区内部和半影区外部两个方向进行扩展,计算光照强度沿两个方向的变化幅度,解决传统半影图方法在光源较大导致本影区较小时的绘制结果失真问题。整个算法在图像空间完成,充分利用了GPU的并行特性,可实时绘制较为逼真的软阴影效果。
文档编号G06T15/50GK101882324SQ20101018208
公开日2010年11月10日 申请日期2010年5月19日 优先权日2010年5月19日
发明者王莉莉, 甄敬超, 章二林, 郝爱民 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1