一种基于阴影图的软阴影绘制方法与流程

文档序号:12787379阅读:307来源:国知局
一种基于阴影图的软阴影绘制方法与流程

本发明涉及一种软阴影绘制方法。更具体地,涉及一种基于阴影图的软阴影绘制方法。



背景技术:

随着基本的图形处理趋于完善,越来越多的人将注意力聚集在图形表现的真实性上,阴影在提升3D图形的真实感方面发挥着极大的作用,阴影不但可以帮助人们理解物体相对场景的位置,阴影接受者的表面特征和阴影投射者的几何特征,还可以反映出场景中光源所在的位置。相对于硬阴影而言,软阴影考虑了更为真实的情况,更加真实的模拟了光照中的阴影,它将影子分为本影和半影,通过改进计算半影所在的光照强度,实现半影到本影的渐变过程,达到真实感绘制的效果。传统的基于阴影图的软阴影算法在逼真显示及效率方面存在矛盾,若要保证高显示质量,则其效率有限,无法满足大型复杂场景的实时渲染需求,若保证效率,但阴影的精确性不高,因此,无法满足当今计算机图形应用的要求,急需对传统的基于阴影图的软阴影算法进行改进。

因此,需要提供一种基于阴影图的软阴影绘制方法。



技术实现要素:

本发明的目的在于提供一种基于阴影图的软阴影绘制方法。

为达到上述目的,本发明采用下述技术方案:

一种基于阴影图的软阴影绘制方法,包括如下步骤:

S1、选取并组合模型面向光源的轮廓边,得到模型面向光源的轮廓;

S2、扩充模型面向光源的轮廓,得到模型面向光源的轮廓的平滑面;

S3、在模型面向光源的轮廓的平滑面中绘制软阴影。

优选地,步骤S1进一步包括如下子步骤:

S1.1、遍历所有构成模型的三角形面,选取其中面向光源的三角形面;

S1.2、遍历选取的面向光源的三角形面的边,选取模型面向光源的轮廓边;

S1.3、组合模型面向光源的轮廓边,得到模型面向光源的轮廓。

优选地,步骤S1.1中选取面向光源的三角形面的方法为:计算光源方向的法向量与遍历的所有构成模型的三角形面法向量的点积,如果点积大于0,则这个三角形面面向光源,如果点积小于等于0,则这个三角形面背向光源。

优选地,步骤S1.2进一步包括如下子步骤:

S1.2.1、建立堆栈并把遍历的第一条面向光源的三角形面的边加入堆栈;

S1.2.2、依次把面向光源的三角形面的边压入堆栈并且比较堆栈中的边与当前遍历的边,如果堆栈中存在与当前遍历的边相同的边,则不把该边加入堆栈且把在堆栈中的与该边相同的边删除;如果堆栈中不存在与当前遍历的边相同的边,则把当前遍历的边加入堆栈;

S1.2.3、依次遍历完所有的面向光源的三角形面的边之后,堆栈中的边即为模型面向光源的轮廓边。

优选地,步骤S3中绘制软阴影的方法为:利用模型平滑面生成半影深度图和半影Alpha纹理图,完成模型的软阴影的绘制。

本发明的有益效果如下:

本发明所述技术方案提高了阴影渲染速度,为实时阴影绘制提供了新的途径,提高了三维场景绘制的逼真度。

附图说明

下面结合附图对本发明的具体实施方式作进一步详细的说明。

图1示出基于阴影图的软阴影绘制方法的流程图。

图2示出模型多边形轮廓边示意图。

图3示出以边V2-V3为例的模型多边形扩充示意图。

具体实施方式

为了更清楚地说明本发明,下面结合优选实施例和附图对本发明做进一步的说明。附图中相似的部件以相同的附图标记进行表示。本领域技术人员应当理解,下面所具体描述的内容是说明性的而非限制性的,不应以此限制本发明的保护范围。

如图1所示,本实施例提供的基于阴影图的软阴影绘制方法的具体步骤为:

S1、选取并组合模型面向光源的轮廓边,得到模型面向光源的轮廓:

选取并组合模型面向光源的轮廓边的方法为:选取模型的轮廓边即为选 取面向光源的构成模型面向光源的多边形的面的边,模型面向光源的轮廓边是在遍历构成模型面向光源的多边形面(此实施例中为三角形面)时出现且仅出现一次的边,因此两个面共享的边肯定不是轮廓边,如图2所示。面向光源的相邻的三角形面V1-V5-V4和V4-V5-V3有一条公共边,因方向不同,分别命名为边1和边2。在一个封闭的曲面中,任何两个三角形面共享的边肯定不是轮廓边,因此,在遍历完整个曲面之后,那些不是共享的边,即仅仅出现一次的边,就是轮廓边。把这些仅仅出现一次的边逆时针连接,就得到了轮廓边,然后组合面向光源的轮廓边,得到模型面向光源的轮廓。

S2、扩充模型面向光源的轮廓,得到模型面向光源的轮廓的平滑面:

多边形扩充是一种常用的几何处理方法,大量使用在工程实施和计算机图形学方面,如图3所示。开放图形库0penGL中,逆时针方向的三角形面为正面三角形面,即为面向光源的三角形面,以边V2-V3为例,延长点V2至点V6、点V3至点V7,就可以得到平滑面上的两个三角形面V2-V7-V3和V2-V6-V7,而且这两个三角形面也是面向光源的。为了得到平滑的具有渐变特点的平滑面,使用高洛德着色方式,把V2-V3上的点,即轮廓边上的点设置为黑色绘制为黑色,把V6-V7上的点,即平滑面外侧的边上的点绘制成白色,这样可以得到由内到外光照值依次增强的平滑面了。

S3、在模型面向光源的轮廓的平滑面中绘制软阴影:

利用模型平滑面生成半影深度图和半影Alpha纹理图,完成模型的软阴影的绘制。半影深度图是指由平滑面在光源下所生成的深度纹理图,其原理与本影纹理生成方法相同,半影Alpha纹理图是指直接渲染平滑面的颜色到纹理产生的纹理,其原理为平滑面运用高洛德着色模式生成的一张从内到外有渐变特点的纹理,这张纹理从内到外的光照强度渐次增强。半影深度图和半影Alpha纹理图都是在光源空间的坐标下生成的。

其中

步骤S1“选取并组合模型面向光源的轮廓边,得到模型面向光源的轮廓”具体包括如下子步骤:

S1.1、遍历所有构成模型的三角形面,选取其中面向光源的三角形面,具体方法为:计算光源方向的法向量与遍历的所有构成模型的三角形面法向量的点积,如果点积大于0,则这个三角形面面向光源,如果点积小于等于0,则这个三角形面背向光源;

S1.2、遍历选取的面向光源的三角形面的边,选取模型面向光源的轮廓边;

S1.3、组合模型面向光源的轮廓边,得到模型面向光源的轮廓。

步骤S1.2“遍历选取的面向光源的三角形面的边,选取模型面向光源的轮廓边”具体包括如下子步骤:

S1.2.1、建立堆栈并把遍历的第一条面向光源的三角形面的边加入堆栈;

S1.2.2、依次把面向光源的三角形面的边压入堆栈并且比较堆栈中的边与当前遍历的边,如果堆栈中存在与当前遍历的边相同的边,就可以证明当前遍历的边是共享的边,不把该边加入堆栈且把在堆栈中的与该边相同的边删除,如果堆栈中不存在与当前遍历的边相同的边,则把当前遍历的边加入堆栈;

S1.2.3、依次遍历完所有的面向光源的三角形面的边之后,堆栈中的边即为模型面向光源的轮廓边。

步骤S2“扩充模型面向光源的轮廓,得到模型面向光源的轮廓的平滑面”的具体过程为:

在给一个模型添加平滑面时,用模型的中心点向这个模型的轮廓边连线并延长,形成平滑面。延长连线时设定系数t来决定延长线的长短,系统t的取值范围为[0,1],系数t取值为0时只有硬阴影,而取值越大,其软阴影的范围越大,具体的数值根据实际需求而定,同时,延长线的长短决定了平滑面的大小,也就决定了生成的伪半影的大小。设轮廓边上的点为A(i),i=1,2,…,n,n构成轮廓边的点的个数,点A(i)在模型的坐标系中的位置为VA(i),c为模型的中心点位置;点A(i)经过延长后的点为B(i),点B(i)在模型的坐标系中的位置为VB(i),设定一标准化向量V0(i),用normal(V0(i))表示,其中V0(i)=VA(i)-c,则点B(i)在模型的坐标系中的位置为VB(i)的计算公式为:

VB(i)=normal(V0(i))*t+VA(i)

计算出轮廓边上所有点延长后在模型的坐标系中的位置,组成平滑面的边,再由轮廓边和平滑面的边构成模型面向光源的轮廓的平滑面。

显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定,对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动,这里无法对所有的实施方式予以穷举,凡是属于本发明的技术方案所引伸出的显而易见的变化或变动仍处于本发明的保护范围之列。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1