一种基于聚光灯实时动态阴影的实现方法

文档序号:6621162阅读:319来源:国知局
一种基于聚光灯实时动态阴影的实现方法
【专利摘要】本发明公开了一种基于聚光灯实时动态阴影的实现方法,主要包括:遍历场景中可见对象列表,只对场景中的可见或者部分可见的对象进行渲染;在灯光空间下渲染场景时,获取离光源最近所有像素投射的深度图;正常渲染场景时,将相机空间转化到灯光空间下得到的像素的新位置的深度值进行比较,当像素的新位置深度值大于深度图时,该像素处于阴影中;然后将阴影与场景颜色混合,投射到屏幕上。本发明所述基于聚光灯实时动态阴影的实现方法,可以克服现有技术中使用范围窄、易出错、占用内存大和计算速度慢等缺陷,以实现使用范围宽、不易出错、占用内存小和计算速度快的优点。
【专利说明】一种基于聚光灯实时动态阴影的实现方法

【技术领域】
[0001] 本发明涉及图像处理【技术领域】,具体地,涉及一种基于聚光灯实时动态阴影的实 现方法。

【背景技术】
[0002] 随着计算机图形学的发展和可编程的不断普及,虚拟的三维世界模拟现实真实 性,游戏中更多是实现视觉化的表现,近年来对阴影的研究越来越多,这种效果的实现增加 了图像的立体感和层次感,而实时阴影计算是计算机图形学领域的一个高级课题。
[0003] 目前游戏中是利用Z-buffer消隐算法来实现的,它是以新坐标系的Z轴上的一 点为圆心建立的坐标系,将物体在空间所有的点以光源为中心向新坐标系XY面投影,并进 行点的取整处理,然后利用Z-buffer消隐处理办法,判断改点的受光特点。这个算法使用 范围窄,易出错,占有大量的内存,算法速度慢。基于上述问题需要提供了一种基于屏幕空 间聚光灯生成阴影效果。
[0004] 在实现本发明的过程中,发明人发现现有技术中至少存在使用范围窄、易出错、占 用内存大和计算速度慢等缺陷。


【发明内容】

[0005] 本发明的目的在于,针对上述问题,提出一种基于聚光灯实时动态阴影的实现方 法,以实现使用范围宽、不易出错、占用内存小和计算速度快的优点。
[0006] 为实现上述目的,本发明采用的技术方案是:一种基于聚光灯实时动态阴影的实 现方法,主要包括: a、 遍历场景中可见对象列表,只对场景中的可见或者部分可见的对象进行渲染; b、 在灯光空间下渲染场景时,获取离光源最近所有像素投射的深度图; c、 正常渲染场景时,将相机空间转化到灯光空间下得到的像素的新位置的深度值进行 比较,当像素的新位置深度值大于深度图时,该像素处于阴影中;然后将阴影与场景颜色混 合,投射到屏幕上。
[0007] 进一步地,所述步骤b,具体包括: bl、把相机放到光源位置渲染场景时,构建一个灯光空间; b2、在灯光空间下,把灯光空间下的世界位置转化为视锥体投影空间,并对其进行归一 化,得到在投影空间下的深度图; b3、正常渲染场景时,把基于屏幕空间的像素 U、V,转化为世界坐标,再转化为灯光空 间,得到该空间下的像素的新位置的深度值。
[0008] 进一步地,所述步骤bl,具体包括: 首先把模型空间转化到世界坐标空间,这个是在Direct3D中实现的,经过硬件坐标转 换的世界空间矩阵记作:WorldMatrix ; 对任何一个场景中的相机都是基于世界空间的,当相机放到光源位置进行渲染场景 时,首先构建一个光源空间,将相机朝向和光源方向朝向一致,相机的方向规定为z轴,通 过摄像机位置和朝向确定一个灯光空间。
[0009] 进一步地,所述通过摄像机位置和朝向确定一个灯光空间的操作,具体是: 米用DirectX下的接口中实现LightViewMatrix : D3DXMATRIX * D3DXMatrixLookAtLH( _inout D3DXMATRIX *p0ut, -in const D3DXVECT0R3 *pEye, _in const D3DXVECT0R3 *pAt, -in const D3DXVECT0R3 *pUp ); 通过以上的代码生成一个灯光空间的矩阵LightViewMatrix,这个矩阵只能表示相机 的局部位置。
[0010] 进一步地,所述步骤b2,具体包括: 基于步骤bl,为了确定相机所看到的精确位置即在图形学中称作为灯光空间的投影矩 阵; 基于上述的灯光空间下,根据可见视锥体的预设数个点并根据其包围盒构建一个投影 矩阵 LightProjMatrix ; 把该灯光空间位置转换到视锥体投影空间,把转化后的矩阵记作ViewMatrix,具体是 通过 ViewMatrix = LightViewMatrix *LightProjMatrix ; 把ViewMatrix传入GPU中,计算每个点的投影坐标,投影坐标的Z值即为深度值 shadow map,这个深度值记录着离光源最近的所有像素投射的深度; 把这些深度值保存到一张二维的渲染目标上,然后将深度值进行归一化处理,即把坐 标缩放在 Μ [-ι,αγ1 [ι,-ι],ζ? [0,1]之间。
[0011] 进一步地,所述步骤b3,具体包括: 当正常渲染场景时,基于相机空间渲染了一张纹理图,包含物体的纹理以及深度值,然 后先转化为世界空间位置; 灯光空间也是基于世界空间位置来说,如果做深度比较,必须把世界空间位置转化到 灯光空间才能够做比较。
[0012] 进一步地,在步骤a中,场景中对象列表的可见性包括:⑴完全可见;⑵完全不可 见;⑶部分可见。
[0013] 本发明各实施例的基于聚光灯实时动态阴影的实现方法,由于主要包括:遍历场 景中可见对象列表,只对场景中的可见或者部分可见的对象进行渲染;在灯光空间下渲染 场景时,获取离光源最近所有像素投射的深度图;正常渲染场景时,将相机空间转化到灯光 空间下得到的像素的新位置深度值进行比较,当像素的新位置的深度值大于深度图时,该 像素处于阴影中;然后将阴影与场景颜色混合,投射到屏幕上;从而可以克服现有技术中 使用范围窄、易出错、占用内存大和计算速度慢的缺陷,以实现使用范围宽、不易出错、占用 内存小和计算速度快的优点。
[0014] 本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变 得显而易见,或者通过实施本发明而了解。
[0015] 下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。

【专利附图】

【附图说明】
[0016] 附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实 施例一起用于解释本发明,并不构成对本发明的限制。在附图中: 图1 (a)为本发明基于聚光灯实时动态阴影的实现方法的场景中一个模型的包围盒的 俯视图,图1 (b)本发明基于聚光灯实时动态阴影的实现方法的相机内各个模型包围盒可 见情况的侧视图; 图2为本发明基于聚光灯实时动态阴影的实现方法中摄像机空间转化为投影空间的 示意图; 图3为本发明基于聚光灯实时动态阴影的实现方法中摄像机空间转化为灯光空间的 示意图; 图4为本发明基于聚光灯实时动态阴影的实现方法的流程图。

【具体实施方式】
[0017] 以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实 施例仅用于说明和解释本发明,并不用于限定本发明。
[0018] 根据本发明实施例,如图1、图2、图3和图4所不,提供了一种基于聚光灯实时动 态阴影的实现方法。
[0019] 在游戏中,GPU往往对绘制大量的光影效果,现在的游戏阴影效果越来越复杂,由 于过于复杂的阴影使显卡不能够支持,在现实中阴影效果因光线被物体遮挡而产生,在3D 环境中通过图形模拟也能达到这一效果,当场景中几何体或者灯光位置变动的时候,能实 现动态阴影技术,这是一个高级的技术同时也是计算机图形学研究的一个重点。
[0020] 首先分析一下,聚光灯是使用聚光镜头或者反射镜等聚成的光,可以调节光斑大 小,旁边的漫射光线比较小,与其他的光源相比,聚光灯的照射方向是单一的方向,而且光 的照射方向是锥状体。
[0021] 第一:我们先遍历场景中所有对象,检测对象在相机内是否可见。这里有三种情 况:⑴完全可见;⑵完全不可见;⑶部分可见。如图1 (a)是场景中一个模型的包围盒的俯 视图,图1 (b)是相机内各个模型包围盒可见情况。只对相机中的可见和部分可见进行渲 染。
[0022] 第二:首先把模型空间转化到世界坐标空间,这个转化是在Direct3D中实现的, 经过硬件坐标转换的世界空间矩阵记作:WorldMatrix,这个对任何一个场景中的相机都 是基于世界空间的,当相机放到光源位置进行渲染场景时,首先构建一个光源空间,将相 机朝向和光源方向朝向一致,相机的方向规定为Z轴,有了摄像机位置和朝向可以确定一 个灯光空间,本发明是采用DirectX下的接口中实现LightViewMatrix : D3DXMATRIX * D3DXMatrixLookAtLH( _inout D3DXMATRIX *p0ut, _in const D3DXVECT0R3 *pEye, _in const D3DXVECT0R3 *pAt, _in const D3DXVECT0R3 *pUp ); 通过以上的代码生成一个灯光空间的矩阵LightViewMatrix,这个矩阵只能表示相机 的局部位置,对所看到的物体并不是一个精确的位置,为了能确定一个精确的位置我们还 要确定物体到相机的距离,我们可以说成是"焦距",他确定我们相机所看到周围物体的一 个范围的大小。
[0023] 第三:基于上述,为了确定相机所看到的精确位置,在图形学中我们可以称作为灯 光空间的投影矩阵;基于上述的灯光空间下,根据可见视锥体的8个点并根据其包围盒构 建一个投影矩阵LightProjMatrix,如图1所示。
[0024] 把该灯光空间位置转换到视锥体投影空间,把转化后的矩阵记作ViewMatrix,具 体是通过 ViewMatrix = LightViewMatrix ^LightProjMatrix 把ViewMatrix传入GPU中,计算每个点的投影坐标,投影坐标的Z值即为深度值 (shadow map),这个深度值记录着离光源最近的所有像素投射的深度。我们把这些深度 值保存到一张二维的渲染目标上。然后将深度值进行归一化处理,即把坐标缩放在X 1
[-Ι,αΥ1 [l,-l],zi [0,1]之间,如图 2 所示。
[0025] 第四:当正常渲染场景时,基于相机空间渲染了一张纹理图,包含物体的纹理以及 深度值,然后先转化为世界空间位置,灯光空间也是基于世界空间位置来说,如果做深度比 较,必须把世界空间位置转化到灯光空间才可以做比较。例如相机空间任意一点的像素 a 点,其深度值为s2,而在灯光空间,该点的深度值sl,如图3所示。
[0026] 第五:我们把相机空间转化到灯光空间的像素的新位置的深度值和深度图 (shadow map)做比较,当深度大于深度图中的深度时,即(s2>sl),所看到的像素是受阴影 的,然后将阴影与场景颜色叠加并投射到屏幕上,实现阴影的逼真效果。
[0027] 本发明的技术方案,只适合聚光等这种的光源,最大的利用GPU的可编程能力,绘 制高效率且绘制快速,占用内存少,这样的算法实现简单,适用性好。
[0028] 最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明, 尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可 以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。 凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的 保护范围之内。
【权利要求】
1. 一种基于聚光灯实时动态阴影的实现方法,其特征在于,主要包括: a、 遍历场景中可见对象列表,只对场景中的可见或者部分可见的对象进行渲染; b、 在灯光空间下渲染场景时,获取离光源最近所有像素投射的深度图; c、 正常渲染场景时,将相机空间转化到灯光空间下得到的像素的新深度值进行比较, 当像素的新位置深度值大于深度图时,该像素处于阴影中;然后将阴影与场景颜色混合,投 射到屏幕上。
2. 根据权利要求1所述的基于聚光灯实时动态阴影的实现方法,其特征在于,所述步 骤b,具体包括: bl、把相机放到光源位置渲染场景时,构建一个灯光空间; b2、在灯光空间下,把灯光空间下的世界位置转化为视锥体投影空间,并对其进行归一 化,得到在投影空间下的深度图; b3、正常渲染场景时,把基于屏幕空间的像素 U、V,转化为世界坐标,再转化为灯光空 间,得到该空间下的像素的新位置的深度值。
3. 根据权利要求2所述的基于聚光灯实时动态阴影的实现方法,其特征在于,所述步 骤bl,具体包括: 首先把模型空间转化到世界坐标空间,这个是在Direct3D中实现的,经过硬件坐标转 换的世界空间矩阵记作:WorldMatrix ; 对任何一个场景中的相机都是基于世界空间的,当相机放到光源位置进行渲染场景 时,首先构建一个光源空间,将相机朝向和光源方向朝向一致,相机的方向规定为Z轴,通 过摄像机位置和朝向确定一个灯光空间。
4. 根据权利要求3所述的基于聚光灯实时动态阴影的实现方法,其特征在于,所述通 过摄像机位置和朝向确定一个灯光空间的操作,具体是: 米用DirectX下的接口中实现LightViewMatrix : D3DXMATRIX * D3DXMatrixLookAtLH( _inout D3DXMATRIX *pOut, -in const D3DXVECT0R3 *pEye, _in const D3DXVECT0R3 *pAt, -in const D3DXVECT0R3 *pUp ); 通过以上的代码生成一个灯光空间的矩阵LightViewMatrix,这个矩阵只能表示相机 的局部位置。
5. 根据权利要求3所述的基于聚光灯实时动态阴影的实现方法,其特征在于,所述步 骤b2,具体包括: 基于步骤bl,为了确定相机所看到的精确位置即在图形学中称作为灯光空间的投影矩 阵; 基于上述的灯光空间下,根据可见视锥体的预设数个点并根据其包围盒构建一个投影 矩阵 LightProjMatrix ; 把该灯光空间位置转换到视锥体投影空间,把转化后的矩阵记作ViewMatrix,具体是 通过 ViewMatrix = LightViewMatrix ^LightProjMatrix ; 把ViewMatrix传入GPU中,计算每个点的投影坐标,投影坐标的Z值即为深度值 shadow map,这个深度值记录着离光源最近的所有像素投射的深度; 把这些深度值保存到一张二维的渲染目标上,然后将深度值进行归一化处理,即把坐 标缩放在 X_ [-1,1],Y_ [ι,-ι],ζ_ [0,1]之间。
6. 根据权利要求5所述的基于聚光灯实时动态阴影的实现方法,其特征在于,所述步 骤b3,具体包括: 当正常渲染场景时,基于相机空间渲染了一张纹理图,包含物体的纹理以及深度值,然 后先转化为世界空间位置; 灯光空间也是基于世界空间位置来说,如果做深度比较,必须把世界空间位置转化到 灯光空间才能够做比较。
7. 根据权利要求1-6中任一项所述的基于聚光灯实时动态阴影的实现方法,其特征在 于,在步骤a中,场景中对象列表的可见性包括:⑴完全可见;⑵完全不可见;⑶部分可见。
【文档编号】G06T17/00GK104103092SQ201410354846
【公开日】2014年10月15日 申请日期:2014年7月24日 优先权日:2014年7月24日
【发明者】张翼 申请人:无锡梵天信息技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1