本发明属于室内实时光照渲染领域,尤其涉及一种基于空间预探索的真实过渡阴影实现方法。
背景技术:
实时光照渲染的阴影渲染方法:
以光源位置作为视点,基于深度缓冲算法,将每个像素点的深度值也就是距离光源最近的对象距离记录在深度缓冲,输出到帧缓冲关联的深度纹理中,生成深度贴图;
以正常摄像机作为视点,将每个像素到光源的距离和阴影贴图中保存的深度值进行比较,如果大于后者则说明被其他物体遮挡处于阴影之中;
该类方法的主要缺陷:
深度偏移问题,通常称为自阴影问题,原因是阴影贴图的精度是离散的,多个像素会对应到同一个纹素
走样问题,阴影边缘的锯齿状痕迹,边缘过渡不真实。
技术实现要素:
本发明所要解决的技术问题是针对背景技术的不足提供一种基于空间预探索的真实过渡阴影算法,其提升了网格物体渲染过程中阴影边缘过渡的真实感,可作为室内渲染领域阴影渲染的可行优化方案。
本发明为解决上述技术问题采用以下技术方案:
一种基于空间预探索的真实过渡阴影实现方法,具体包括以下步骤:
步骤1,将网格物体的三角形存入kdoptree,其中,kdoptree是一种基于方差分割的树结构;
步骤2,将网格物体的空间均匀分割成空间块,进而对每个空间块进行空间的预探索获得场景物体的位置信息;
步骤3,在空间块内生成采样射线,对于步骤2得到的每一个空间块box,其边界分别为块最小值box.min,块最大值box.max,空间块的中心位置box.center=(box.min box.max)/2,从中心位置均匀发射出m条射线,射线的方向记为ray.dir,每条射线和步骤1中的kdoptree中的三角形求交点p,得到块中心到网格物体的最小长度;计算每个块到网格物体的最小长度;
其中,p=intersect(ray.dir,mesh.triangles),p为交点,ray.dir为射线的方向,mesh.triangles是网格物体内的三角形;
步骤4,获取空间块内射线探索和网格三角形的交点,得到最小长度,逐级判断射线和树子节点范围的位置关系;
步骤5,将空间块的最小距离存入3d纹理;
步骤6,建立网格物体和3d纹理内数据的对应关系,根据步骤2中得到的空间块,创建3d纹理,且每一个纹理的像素对应一个空间块,像素值对应空间块到网格物体的最小距离;
步骤7,步进像素并读取3d纹理数据计算阴影。
作为本发明一种基于空间预探索的真实过渡阴影实现方法的进一步优选方案,在步骤2中,将网格物体的空间均匀分割成空间块,具体如下:网格物体内一个三角形的顶点位置坐标记为vertex(x,y,z),循环网格物体的所有三角形的顶点比较得到最大值max、最小值min,网格物体的空间范围即max-min,把这个范围在x,y,z方向均分为n等分,得到n的3次方个空间块。
作为本发明一种基于空间预探索的真实过渡阴影实现方法的进一步优选方案,所述步骤4具体如下:根据步骤3中产生的各个射线方向,计算出各个空间块和网格物体的最小长度的交点,计算交点需要通过步骤1中的kdoptree对遍历射线和三角形相交加速,从树的根节点开始,判断射线ray和根节点的box是否相交,依次计算ray和box六个面的交点坐标并判断交点是否在box内,如果有一个交点在box内,退出循环,进入下一级子节点的相同判断,如果子节点也相交并且为叶子节点,射线ray依次判断和叶子节点内三角形的交点方法同步骤3,计算出长度后保存,开始下一个射线ray的相同计算过程,比较前后交点的长度,最后得到最小长度,逐级判断射线和树子节点范围的位置关系。
作为本发明一种基于空间预探索的真实过渡阴影实现方法的进一步优选方案,所述步骤5具体如下:根据步骤4计算完成得到每个空间块到网格物体最小长度的射线方向和长度,将长度信息写入3d纹理,用于步进像素射线ray计算像素的阴影shadow,具体如下:
其中,ray.stepvolume为步进过程中第i步的阴影体积,根据当前位置从3d纹理中双线性采样得到;conevolume为像素步进圆锥体的总体积等于底面积乘以高除以3。
作为本发明一种基于空间预探索的真实过渡阴影实现方法的进一步优选方案,
所述步骤6具体如下:在得到单个网格物体的空间预探索信息写入3d纹理之后,把网格物体和3d纹理中的长度信息进行对应,创建网格对象的空间范围信息objectboundsbuffer和对象空间里的位置信息objectstransformdata,建立网格对象的信息和3d纹理数据信息的对应关系:
objectstransformdata=objectboundsbuffer/n,n为步骤3中的n。
作为本发明一种基于空间预探索的真实过渡阴影实现方法的进一步优选方案,所述步骤7具体如下:
步骤7.1,根据步骤6建立的3d纹理数据,在像素位置发出沿着光线方向的射线,从像素的世界位置开始迭代步进出新的世界位置;
步骤7.2,步进每次迭代沿着光线方向逐级增加,在步进位置创建球体和场景空间预计算的范围信息进行相交判断,步进位置记为stepposition,采样3d纹理判断是否在与探索范围内,如果在预探索范围内,记录位置为minposition,计算得到球体的最小半径为minradius=minposition-stepposition,累加到步进长度后,继续下次迭代读取网格对象的空间范围和位置信息;
步骤7.3,根据步进位置stepposition和网格对象空间范围objectboundsbuffer,判断步进位置位于哪个网格对象的范围内,根据网格对象从3d纹理读取空间预探索信息计算对应位置的球体体积,根据步骤7.2中得到的最小半径radius,
球体体积
shadow=(∑volume)/totalvolume
其中,totalvolume等同于上述的conevolume。
本发明采用以上技术方案与现有技术相比,具有以下技术效果:
本发明大幅改善了传统阴影渲染算法的边缘真实过渡问题和深度偏移问题,通过基于射线的空间步进累加遮挡体积的数学模型从根本上改良了单纯基于阴影贴图的数学模型,计算得到的阴影更加物理正确,同时基于射线步进的数学模型可以在程序实际运行之前做预先计算得到中间结果并存入3d纹理,极大降低实时阶段的计算开销,在实时阶段只需要读取中间结果即可根据射线空间步进的数学模型快速得到阴影结果。
附图说明
图1是本发明的方法流程图;
图2是本发明网格物体kdoptree的示意图;
图3是本发明空间块分割示意图;
图4是本发明空间块采样射线示意图;
图5是本发明空间块内射线探索和网格物体交点示意图;
图6是本发明实现真实过渡阴影效果示意图。
具体实施方式
下面结合附图对本发明的技术方案做进一步的详细说明:
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围
一种基于空间预探索的真实过渡阴影实现方法,如图1所示,具体包括以下步骤:
步骤1,将网格物体的三角形存入kdoptree,其中,kdoptree是一种基于方差分割的树结构;网格物体的大量三角形需要通过一种高效的数据结构进行管理,这个数据结构选择为kdoptree,kdoptree是一种基于方差分割的树结构,非常有利于加速空间预探索的过程,如图2所示。
步骤2,将网格物体的空间均匀分割成空间块,且每个空间块进行空间的预探索获得场景物体的位置信息;为了实现自然过渡效果的阴影,需要对网格物体的空间进行适度放大,并均匀分割为空间块,每个空间块进行空间的预探索获得场景其它物体的位置信息,如图3所示。将网格物体的空间均匀分割成空间块,具体如下:网格物体内一个三角形的顶点位置坐标记为vertex(x,y,z),循环网格物体的所有三角形的顶点比较得到最大值max、最小值min,网格物体的空间范围即max-min,把这个范围在x,y,z方向均分为n等分,得到n的3次方个空间块。
步骤3,在空间块内生成采样射线,计算每个块到网格物体的最小长度;空间块执行空间预探索需要先在块内生成大量采样射线,用来计算每个块到网格物体的最小长度,如图4所示。在空间块内生成采样射线,对于步骤2得到的每一个空间块box,其边界分别为块最小值box.min,块最大值box.max,空间块的中心位置box.center=(box.min box.max)/2,从中心位置均匀发射出m条射线,射线的方向记为ray.dir,每条射线和步骤1中的kdoptree中的三角形求交点p,得到块中心到网格物体的最小长度;计算每个块到网格物体的最小长度;
其中,p=intersect(ray.dir,mesh.triangles),p为交点,ray.dir为射线的方向,mesh.triangles是网格物体内的三角形。
步骤4,获取空间块内射线探索和网格三角形的交点,根据步骤3中产生的各个射线方向,计算出各个空间块和网格物体的最小长度的交点,计算交点需要通过步骤1中的kdoptree对遍历射线和三角形相交加速,从树的根节点开始,判断射线ray和根节点的box是否相交,依次计算ray和box六个面的交点坐标并判断交点是否在box内,如果有一个交点在box内,退出循环,进入下一级子节点的相同判断,如果子节点也相交并且为叶子节点,射线ray依次判断和叶子节点内三角形的交点方法同步骤3,计算出长度后保存,开始下一个射线ray的相同计算过程,比较前后交点的长度,最后得到最小长度,逐级判断射线和树子节点范围的位置关系
步骤5,将空间块的最小距离存入3d纹理;如图5所示,根据步骤4计算完成得到每个空间块到网格物体最小长度的射线方向和长度,将长度信息写入3d纹理,用于步进像素射线ray计算像素的阴影shadow,具体如下:
其中,ray.stepvolume为步进过程中第i步的阴影体积,根据当前位置从3d纹理中双线性采样得到;conevolume为像素步进圆锥体的总体积等于底面积乘以高除以3。
步骤6,建立网格物体和3d纹理内数据的对应;在得到单个网格物体的空间预探索信息写入3d纹理之后,把网格物体和3d纹理中的长度信息进行对应,创建网格对象的空间范围信息objectboundsbuffer和对象空间里的位置信息objectstransformdata,建立网格对象的信息和3d纹理数据信息的对应关系:
objectstransformdata=objectboundsbuffer/n,n为步骤3中的n。
如图6所示,步骤7.1,根据步骤6建立的3d纹理数据,在像素位置发出沿着光线方向的射线,从像素的世界位置开始迭代步进出新的世界位置;
步骤7.2,步进每次迭代沿着光线方向逐级增加,在步进位置创建球体和场景空间预计算的范围信息进行相交判断,步进位置记为stepposition,采样3d纹理判断是否在与探索范围内,如果在预探索范围内,记录位置为minposition,计算得到球体的最小半径为minradius=minposition-stepposition,累加到步进长度后,继续下次迭代读取网格对象的空间范围和位置信息;
步骤7.3,根据步进位置stepposition和网格对象空间范围objectboundsbuffer,判断步进位置位于哪个网格对象的范围内,根据网格对象从3d纹理读取空间预探索信息计算对应位置的球体体积,
根据步骤7.2中得到的最小半径radius,
球体体积
shadow=(∑volume)/totalvolume
其中,totalvolume等同于上述的conevolume。
本技术领域技术人员可以理解的是,除非另外定义,这里使用的所有术语(包括技术术语和科学术语)具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样定义,不会用理想化或过于正式的含义来解释。
以上实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。上面对本发明的实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。
1.一种基于空间预探索的真实过渡阴影实现方法,其特征在于,具体包括以下步骤:
步骤1,将网格物体的三角形存入kdoptree,其中,kdoptree是一种基于方差分割的树结构;
步骤2,将网格物体的空间均匀分割成空间块,进而对每个空间块进行空间的预探索获得场景物体的位置信息;
步骤3,在空间块内生成采样射线,对于步骤2得到的每一个空间块box,其边界分别为块最小值box.min,块最大值box.max,空间块的中心位置box.center=(box.min box.max)/2,从中心位置均匀发射出m条射线,射线的方向记为ray.dir,每条射线和步骤1中的kdoptree中的三角形求交点p,得到块中心到网格物体的最小长度;计算每个块到网格物体的最小长度;
其中,p=intersect(ray.dir,mesh.triangles),p为交点,ray.dir为射线的方向,mesh.triangles是网格物体内的三角形;
步骤4,获取空间块内射线探索和网格三角形的交点,得到最小长度,逐级判断射线和树子节点范围的位置关系;
步骤5,将空间块的最小距离存入3d纹理;
步骤6,建立网格物体和3d纹理内数据的对应关系,根据步骤2中得到的空间块,创建3d纹理,且每一个纹理的像素对应一个空间块,像素值对应空间块到网格物体的最小距离;
步骤7,步进像素并读取3d纹理数据计算阴影。
2.根据权利要求1所述的一种基于空间预探索的真实过渡阴影实现方法,其特征在于:在一个实施方式中,在步骤2中,将网格物体的空间均匀分割成空间块,具体如下:网格物体内一个三角形的顶点位置坐标记为vertex(x,y,z),循环网格物体的所有三角形的顶点比较得到最大值max、最小值min,网格物体的空间范围即max-min,把这个范围在x,y,z方向均分为n等分,得到n的3次方个空间块。
3.根据权利要求1所述的一种基于空间预探索的真实过渡阴影实现方法,其特征在于:在一个实施方式中,所述步骤4具体如下:根据步骤3中产生的各个射线方向,计算出各个空间块和网格物体的最小长度的交点,计算交点需要通过步骤1中的kdoptree对遍历射线和三角形相交加速,从树的根节点开始,判断射线ray和根节点的box是否相交,依次计算ray和box六个面的交点坐标并判断交点是否在box内,如果有一个交点在box内,退出循环,进入下一级子节点的相同判断,如果子节点也相交并且为叶子节点,射线ray依次判断和叶子节点内三角形的交点方法同步骤3,计算出长度后保存,开始下一个射线ray的相同计算过程,比较前后交点的长度,最后得到最小长度,逐级判断射线和树子节点范围的位置关系。
4.根据权利要求1所述的一种基于空间预探索的真实过渡阴影实现方法,其特征在于:
在一个实施方式中,所述步骤5具体如下:根据步骤4计算完成得到每个空间块到网格物体最小长度的射线方向和长度,将长度信息写入3d纹理,用于步进像素射线ray计算像素的阴影shadow,具体如下:
其中,ray.stepvolume为步进过程中第i步的阴影体积,根据当前位置从3d纹理中双线性采样得到;conevolume为像素步进圆锥体的总体积等于底面积乘以高除以3。
5.根据权利要求1所述的一种基于空间预探索的真实过渡阴影实现方法,其特征在于:在一个实施方式中,所述步骤6具体如下:在得到单个网格物体的空间预探索信息写入3d纹理之后,把网格物体和3d纹理中的长度信息进行对应,创建网格对象的空间范围信息objectboundsbuffer和对象空间里的位置信息objectstransformdata,建立网格对象的信息和3d纹理数据信息的对应关系:
objectstransformdata=objectboundsbuffer/n,n为步骤3中的n。
6.根据权利要求1所述的一种基于空间预探索的真实过渡阴影实现方法,其特征在于:在一个实施方式中,所述步骤7具体如下:
步骤7.1,根据步骤6建立的3d纹理数据,在像素位置发出沿着光线方向的射线,从像素的世界位置开始迭代步进出新的世界位置;
步骤7.2,步进每次迭代沿着光线方向逐级增加,在步进位置创建球体和场景空间预计算的范围信息进行相交判断,步进位置记为stepposition,采样3d纹理判断是否在与探索范围内,如果在预探索范围内,记录位置为minposition,计算得到球体的最小半径为minradius=minposition-stepposition,累加到步进长度后,继续下次迭代读取网格对象的空间范围和位置信息;
步骤7.3,根据步进位置stepposition和网格对象空间范围objectboundsbuffer,判断步进位置位于哪个网格对象的范围内,根据网格对象从3d纹理读取空间预探索信息计算对应位置的球体体积,根据步骤7.2中得到的最小半径radius,
球体体积
累计遮挡体积,除以总的像素射线空间体积得到真实过渡阴影;
shadow=(∑volume)/totalvolume;
其中,totalvolume等同于上述的conevolume。
技术总结