首页> 中国专利> 一种将球谐光照技术应用于面绘制的方法

一种将球谐光照技术应用于面绘制的方法

摘要

一种将球谐光照技术应用于面绘制的方法,其使用纹理回填的方法使球谐光照技术可以应用到面绘制中。为此,首先对面模型中的每个面片进行离散采样将其转换为点模型;然后通过球谐光照方法得到每个点的球谐系数组;根据每个面离散出来的点及其对应的球谐系数组,通过纹理回填的方法为每个面生成一组球谐系数纹理;最后使用面绘制的方法对面模型进行绘制,通过GPU渲染管线进行编程完成球谐光照模拟。本发明在不牺牲绘制效率的前提下显著提高绘制质量。同时,本发明能在一程度上提高绘制效率,又可以克服点绘制时由于点与点之间重叠或覆盖范围不够产生的各种走样问题。

著录项

  • 公开/公告号CN103440684A

    专利类型发明专利

  • 公开/公告日2013-12-11

    原文格式PDF

  • 申请/专利权人 电子科技大学;

    申请/专利号CN201310396822.1

  • 申请日2013-09-04

  • 分类号G06T17/30;G06F17/50;

  • 代理机构成都中亚专利代理有限公司;

  • 代理人陈亚石

  • 地址 611731 四川省成都市高新西区西源大道2006号

  • 入库时间 2024-02-19 21:23:12

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-06-22

    授权

    授权

  • 2014-01-15

    实质审查的生效 IPC(主分类):G06T17/30 申请日:20130904

    实质审查的生效

  • 2013-12-11

    公开

    公开

说明书

技术领域

本发明涉及一种将球谐光照技术应用于面绘制的方法。

背景技术

球谐函数是一种与傅立叶变换类似的信号处理工具,2002年,Kautz等将其应用到了图形学体绘制的光照模拟中,并得到了良好的效果与较高的绘制速度。此外,球谐函数在图形学中的应用还包括表面重构,识别等领域。

对球谐光照理论的研究与应用多集中在光照模型建模以及求解方面,Kautz等在能量传输模型的基础上建立了一个光照模型并使用球谐函数求解,以达到高效光照计算的目的;Alexander等对生物体中的光照进行模拟,并使用球谐函数高效求解;Zhong等人为了模拟场景中的动态阴影效果,在建立相应光照模型的基础上进行求解。

由于球谐光照所考虑的光照模型是基于点的能量传输公式(Light Transport),其在预计算过程中需要对单个点元进行采样计算处理,故上述研究者都是使用基于点模型的体绘制进行最后的图像渲染。然而,体绘制绘制的光栅化阶段常常需要解决走样,点元缩放以及GPU绘制支持等问题,在某种程度上影响了绘制效率。

相反,面绘制中并不需要考虑体绘制中存在的上述问题,但是却无法直接使用球谐光照技术。

发明内容

鉴于上述不足之处,本发明的目的在于提供一种将球谐光照技术应用于面绘制的方法,其使用纹理回填的方法使球谐光照技术可以应用到面绘制中。为此,首先对面模型中的每个面片进行离散采样将其转换为点模型;然后通过球谐光照方法得到每个点的球谐系数组;根据每个面离散出来的点及其对应的球谐系数组,通过纹理回填的方法为每个面生成一组球谐系数纹理;最后使用面绘制的方法对面模型进行绘制,通过GPU渲染管线进行编程完成球谐光照模拟。

该方法主要包括三个阶段:数据准备,纹理回填以及GPU编程绘制。

数据准备阶段主要完成面模型的每个三角面片的离散采样以及球谐光照预计算工作,完成这一阶段后,离散的模型数据使用链表表示。

纹理回填阶段根据每个面片的采样点对应的球谐系数生成相应面的系数纹理,该纹理是一张正方形的纹理,其中包含了与每个三角面片相同大小的纹理区域,存放球谐系数组。

GPU编程绘制阶段主要通过GPU编程读出每个片元对应的球谐系数组,并进行光照计算。由于该方法得到的球谐系数组通过对系数纹理进行最近点插值得到,其流程适用于面绘制。

具体为:

(1)数据准备:对面模型中的每个三角面片进行离散采样将其转换为点模型;然后通过球谐光照方法得到每个点的球谐系数组;

数据准备包括将面模型转换为点模型即面模型采样,三角面片排序与球谐光照预计算三个部分;具体为:

①面模型采样    

生成采样点:

为了将面模型采样为一个点模型,需要对三角面片进行离散化处理,我们使用等距离采样的方法,将面模型中的每个三角面片进行采样处理;假设所需采样的三角面片三个顶点的坐标为                                                ,以及 ,则等距采样的基本思想是设置一条扫描线从三角形的一个底边开始,通过在扫描线上每次移动相同距离采样数据,然后将扫描线上移进行下轮扫描;

为了设置扫描线,必需要得到扫描线的两个端点,由于需要对三角面片内部进行采样,不能直接对为起始扫描线。为此,我们使用如下方法进行扫描线的设置与采样:

a)以点为起点,为方向向点移动个固定距离,得到点:

                        (1-1)

b)以同样的方法,以点为起点,为方向向点移动个固定距离,得到点;

c)将作为扫描线进行等距采样,采样方法与之前类似,即以点为起点,为方向向点移动个固定距离,得到采样点,重复这一过程直到到达;

d)重新进行步骤a),b);如果扫描线到达三角形的顶点,则结束,保存所有采样点;否则,进行c)。

数据结构的组织:

将三角形面片的三个顶点与采样点在同一链表中进行存储;每个链表结点的数据结构包括采样点的位置,球谐系数组,纹理坐标属性,对于存放顶点的结点,其对应的属性仅为顶点的空间坐标,其它属性值为空,为区别顶点与采样点,在数据结构中加入一个bool值来区分顶点与采样点:

//采样点与顶点共同使用的数据结构

Struct sample

{  

Position; //采样点&顶点的三维空间坐标

Coef; //采样点的球谐系数组,若为顶点该项为空

       Bool isVertex;//判断是否为三角形顶点的bool值

}

该数据结构构成了模型链表中的一个结点,对于一个面片,其对应链表段中的结点组织按照三角形三个顶点以及面片采样点的顺序进行链表存储:顶点1→顶点2→顶点3→采样点1→采样点2……采样点N。

       模型采样完成后对采样点进行球谐光照预计算处理,其中顶点将不参与预计算,为此,只需要在预计算时根据isVertex布尔值进行判断即可,isVertex  是数据结构sample中的一个分量, 当其为true的时候,表示其为顶点,将不参与预计算;球谐光照预计算完成后,链表中每个采样点都对应了一组球谐系数,为保证一定的精度,取16个球谐系数。

②三角面片排序

在对三角面片采样完成后,对其面积进行排序;首先根据三角面片的三个顶点坐标计算其面积,

                          (1-2)

其中,是顶点组成的线段的距离,是顶点到线段的距离。对所有三角形面片的面积进行由小到大的排序,得到一个按面积大小递增的面模型离散化链表;

③球谐光照预计算

对整个点模型进行球谐光照处理,完成该步后每个点元得到一组球谐系数;

球谐光照中使用的光照模型为模拟漫反射积分公式:

    (1-3)

其中是一个表征粒子属性的参数,该模型使用积分式中的表达式来模拟方向的直接入射光对点的影响,使用可见性函数标识方向的遮挡信息,模型的积分域是法线向量所处的半球区域,整个光照模型所表征的物理过程是在当前考虑点的法线向量所处的半球区域,接收从各个方向反射过来的光能后,通过漫反射向视线方向出射光强;

为了计算该模型,需要对模型中积分式的两个函数与进行球谐分解,对一个函数使用球谐分解的方法如式1-4所示:

                       (1-4)

其中叫做球谐基函数,其形式如式1-5所示,可见球谐其函数是一组函数集合,其函数的阶数由决定,是待分解的函数,球谐分解的实质是提取原函数在球谐空间中不同的信号成分,每一种成分对应了一个阶的球谐基函数,分解后的球谐系数就是该阶球谐基函数的振幅,通过使用球谐系数对球谐基函数进行调制解调便可还原原来的信号;

   (1-5)

       球谐光照的预计算过程就是对式2-4中的两个函数与进行球谐分解的过程,模型中的每个点都要完成一次该过程。

(2)纹理回填:根据每个面离散出来的点及其对应的球谐系数组,通过纹理回填的方法为每个面生成一组球谐系数纹理;所述纹理回填过程包含三个步骤:即生成纹理空间,定位纹素,计算纹理坐标,具体为:

①生成纹理空间

所有三角面片的系数纹理将被整合到一张正方形的纹理中,以便于面绘制的纹理读取,为此,在生成每个三角面片的系数纹理时,都需要在正方形纹理中划分出一个与三角面片形状相同的区域,用以存放该面片的对应的纹理;

计算三角形三条边中最长的一条边,设其长为,对应的两个顶点为及,则第三个顶点为,以及以该边为底边对应的三角形的高,求解边长可使用公式2-1;

             (2-1)

为求得点到边的距离,假设线段可表示为:

      (2-2)

由方程解得:

      (2-3)

       将其代入式2-2得到点在线段上的投影点;根据可以得到:

                (2-4)

       以及划分线段的比例:

            (2-5)

以该底边与高为矩形的长和宽,在正方形纹理中分配一个相同大小的矩形空间,该矩形空间紧邻前一个三角面片的矩形空间,其左上角与前一个三角面片的矩形空间的右上角对齐,在正方形纹理一行排满后,取该行三角形高的值最大值作为该行的行高,并从其后开始下一行的三角面片的分配。

②定位纹素

       在面片对应的三角系数纹理区域划分出来后,将相应三角区域的系数存入该区域即可得到三角成片的一个系数纹理,完成这一步骤需要进行纹理回填操作,其主要操作是定位一个链表结点在三角纹理中相应纹素的位置;

根据结点包含的点的位置信息,以及该采样点所属三角形的三个顶点在正方形纹理中的坐标,,定位纹理的方法如下:

a)在前一步生成纹理空间过程中得到三角形的三条边中最长的一条边,如,以及以该边为底边对应的三角形的高;

b)根据式2-4计算点到边的距离,根据式2-5计算点到边的投影点对的分割比例;

c)定位纹素,得到该采样点在正方形纹理中对应的纹素的坐标:

                 (2-6)。

③纹理坐标的计算

在所有三角面片的系数纹理回填完成后,需要对三角面片的系数纹理坐标进行更新;由于三角面片的纹理坐标只需要计算三角形三个顶点的纹理坐标,因此,在进行完正方形大纹理的三角面片纹理分配后,计算每个三角面片对应的纹理在正方形纹理中的三个顶点的纹理坐标,其计算过程如下:

假设正方形纹理的长,宽分别为,三角面片在正方形纹理中顶点坐标为,则此顶点对应的纹理坐标可通过如下公式计算:

                           (2-7)

通过以上三个步骤完成纹理回填后,在原来的面模型上额外增加了存储球谐系数的纹理,每个面片在该纹理上都对应了一块唯一的纹理空间,通过纹理坐标标识。

(3)GPU编程绘制:使用面绘制的方法对面模型进行绘制,通过GPU渲染管线进行编程完成球谐光照模拟。具体为:

在绘制阶段,按照面绘制的流程,将面模型的每个三角面片的三个顶点以及颜色纹理,系数纹理及其相应纹理坐标传入GPU,通过对GPU渲染管线进行编程读取球谐系数坐标,并进行光照计算,为实现这一目的,只需对fragment shader进行编程即可,其伪代码如下:

使用最近点插值得到当前片元的球谐系数组

使用线性插值得到当前片元的颜色值

使用从CPU中传入的旋转后的光源函数的球谐系数组(即将旋转后的光源函数的球谐系数组从CPU传入shader)

计算最终颜色值color。

本发明在不牺牲绘制效率的前提下显著提高绘制质量,由于基于点绘制的球谐光照技术可以以较小的计算代价实现诸如动态阴影等重要的光照效果,从而显著提高绘制质量。同时,本发明方法由于在最后绘制时使用纹理,面绘制等绘制方法,GPU对其有很好的硬件支持,因此在一程度上提高的绘制效率,同时又可以克服点绘制时由于点与点之间重叠或覆盖范围不够产生的各种走样问题。

附图说明

图1为本发明的流程图。

图2为本发明中面模型采样模型的离散化处理示意图。

图3为三角面片的等距采样示意图。

图4为三角面片的系数纹理的管理示意图。

图5为三角面片的系数纹理空间分配示意图。

具体实施方式

下面我们将结合具体实施例对本发明作进一步的说明。

如图1所示,本发明的目的在于提供一种将球谐光照技术应用于面绘制的方法,其采用纹理回填的方法使球谐光照技术可以应用到面绘制中。为此,首先对面模型中的每个面片进行离散采样将其转换为点模型;然后通过球谐光照方法得到每个点的球谐系数组;根据每个面离散出来的点及其对应的球谐系数组,通过纹理回填的方法为每个面生成一组球谐系数纹理;最后使用面绘制的方法对面模型进行绘制,通过GPU渲染管线进行编程完成球谐光照模拟。

该方法主要包括三个阶段:数据准备,纹理回填以及GPU编程绘制。

数据准备阶段主要完成面模型的每个三角面片的离散采样以及球谐光照预计算工作,完成这一阶段后,离散的模型数据使用链表表示。

纹理回填阶段根据每个面片的采样点对应的球谐系数生成相应面的系数纹理,该纹理是一张正方形的纹理,其中包含了与每个三角面片相同大小的纹理区域,存放球谐系数组。

GPU编程绘制阶段主要通过GPU编程读出每个片元对应的球谐系数组,并进行光照计算。由于该方法得到的球谐系数组通过对系数纹理进行最近点插值得到,其流程适用于面绘制。

具体为:

1.数据准备:

数据准备包括将面模型转换为点模型(面模型采样),三角面片排序与球谐光照预计算三个部分。

1)面模型采样

为了将面模型采样为一个点模型,需要对三角面片进行离散化处理(如图2所示),我们使用等距离采样的方法,将面模型中的每个三角面片进行采样处理。

生成采样点:

为了保证纹理回填阶段的生成的纹理的完整性,我们使用等距离采样的方法三角面片进行离散化采样。如图3所示,假设所需采样的三角面片三个顶点的坐标为,以及 ,则等距采样的基本思想是设置一条扫描线从三角形的一个底边开始,通过在扫描线上每次移动相同距离采样数据,然后将扫描线上移进行下轮扫描。

为了设置扫描线,必需要得到扫描线的两个端点,由于需要对三角面片内部进行采样,不能直接对为起始扫描线。为此,我们使用如下方法进行扫描线的设置与采样:

a)以点为起点,为方向向点移动个固定距离,得到点:

                        (1-1)

b)以同样的方法,以点为起点,为方向向点移动个固定距离,得到点;

c)将作为扫描线进行等距采样,采样方法与之前类似,即以以点为起点,为方向向点移动个固定距离,得到采样点,重复这一过程直到到达;

d)重新进行步骤a),b)。如果扫描线到达三角形的顶点,则结束,保存所有采样点;否则,进行c)。

数据结构的组织:

为了方便后面的纹理回填,我们将三角形面片的三个顶点与采样点在同一链表中进行存储。每个链表结点的数据结构包括采样点的各种属性,如位置,球谐系数组,纹理坐标等,对于存放顶点的结点,其对应的属性仅为顶点的空间坐标,其它属性值为空。为区别顶点与采样点,在数据结构中加入一个bool值来区分顶点与采样点:

//采样点与顶点共同使用的数据结构

Struct sample

{  

Position; //采样点&顶点的三维空间坐标

Coef; //采样点的球谐系数组,若为顶点该项为空

       Bool isVertex;//判断是否为三角形顶点的bool值

}

该数据结构构成了模型链表中的一个结点,对于一个面片,其对应链表段中的结点组织按照三角形三个顶点以及面片采样点的顺序进行链表存储,如下所示:

顶点1→顶点2→顶点3→采样点1…………采样点N

模型采样完成后对采样点进行球谐光照预计算处理,其中顶点将不参与预计算,为此,只需要在预计算时根据isVertex布尔值进行判断即可,isVertex是数据结构sample中的一个分量, 当其为true的时候,表示其为顶点,将不参与预计算。球谐光照预计算完成后,链表中每个采样点都对应了一组球谐系数,为保证一定的精度,通常取16个球谐系数。

2)三角面片排序

为了方便纹理回填过程中纹理空间的分配管理,在对三角面片采样完成后,对其面积进行排序。首先根据三角面片的三个顶点坐标计算其面积,

                          (1-2)

其中,是顶点组成的线段的距离,是顶点到线段的距离。对所有三角形面片的面积进行由小到大的排序,得到一个按面积大小递增的面模型离散化链表。

3)球谐光照预计算

对整个点模型进行球谐光照处理,完成该步后每个点元得到一组球谐系数。

采用球谐光照的目的是为了高效求解光照模型,以较高的效率得到较好的绘制效果。球谐光照中使用的光照模型一般为模拟漫反射的积分公式:

    (1-3)

其中是一个表征粒子属性的参数,该模型使用积分式中的表达式来模拟方向的直接入射光对点的影响,使用可见性函数标识方向的遮挡信息,模型的积分域是法线向量所处的半球区域。整个光照模型所表征的物理过程是在当前考虑点的法线向量所处的半球区域,接收从各个方向反射过来的光能后,通过漫反射向视线方向出射光强。

为了计算该模型,需要对模型中积分式的两个函数与进行球谐分解,对一个函数使用球谐分解的方法如式1-4所示:

                       (1-4)

其中叫做球谐基函数,其形式如式1-5所示,可见球谐其函数是一组函数集合,其函数的阶数由决定,是待分解的函数。球谐分解的实质是提取原函数在球谐空间中不同的信号成分,每一种成分对应了一个阶的球谐基函数,分解后的球谐系数就是该阶球谐基函数的振幅。通过使用球谐系数对球谐基函数进行调制解调便可还原原来的信号。

   (1-5)

       球谐光照的预计算过程就是对式1-4中的两个函数与进行球谐分解的过程,模型中的每个点都要完成一次该过程,因此其花费时间较长。

2.纹理回填

所谓纹理回填,就是根据每个面片采样点经过球谐光照预计算后得到的球谐系数组,制作与面片大小相符合的系数纹理。纹理回填的过程包含三个步骤:即生成纹理空间,定位纹素,计算纹理坐标。

1)生成纹理空间

所有三角面片的系数纹理将被整合到一张正方形的纹理中,以便于面绘制的纹理读取。为此,在生成每个三角面片的系数纹理时,都需要在正方形纹理中划分出一个与三角面片形状相同的区域,用以存放该面片的对应的纹理,如图4所示。

为了将三角面片对应的纹理放入正方形纹理中合适的位置,需要根据三角形的三个顶点在正方形纹理中分配相应的三角形空间。由于在采样过程中完成了对三角面片的排序,我们可以在正方形纹理中顺序分配与三角面片相同大小的纹理区域而不用考虑空间安排。为此,我们采用如下策略进行三角面片的纹理分配:

a)计算三角形三条边中最长的一条边,设其长为,对应的两个顶点为及,则第三个顶点为,以及以该边为底边对应的三角形的高。求解边长可使用公式2-1。

             (2-1)

为求得点到边的距离,假设线段可表示为:

      (2-2)

由方程解得:

      (2-3)

       将其代入式2-2得到点在线段上的投影点。根据可以得到:

                (2-4)

       以及划分线段的比例:

            (2-5)

       该比例的计算方法将在纹理回填时使用,用于对纹素的定位。

b)以该底边与高为矩形的长和宽,在正方形纹理中分配一个相同大小的矩形空间。该矩形空间紧邻前一个三角面片的矩形空间,其左上角与前一个三角面片的矩形空间的右上角对齐,其空间安排如图5所示。在正方形纹理一行排满后,取该行三角形高的值最大值作为该行的行高,并从其后开始下一行的三角面片的分配。

2)定位纹素(纹理回填)

在面片对应的三角系数纹理区域划分出来后,将相应三角区域的系数存入该区域即可得到三角成片的一个系数纹理,完成这一步骤需要进行纹理回填操作,其主要操作是定位一个链表结点在三角纹理中相应纹素的位置。

根据结点包含的点的位置信息,以及该采样点所属三角形的三个顶点在正方形纹理中的坐标,,定位纹理的方法如下:

a)在前一步生成纹理空间过程中得到三角形的三条边中最长的一条边,如,以及以该边为底边对应的三角形的高。

b)根据式2-4计算点到边的距离,根据式2-5计算点到边的投影点对的分割比例。

c)定位纹素,得到该采样点在正方形纹理中对应的纹素的坐标:

                 (2-6)。

3)纹理坐标的计算

在所有三角面片的系数纹理回填完成后,需要对三角面片的系数纹理坐标进行更新。由于三角面片的纹理坐标只需要计算三角形三个顶点的纹理坐标,因此,在进行完正方形大纹理的三角面片纹理分配后,可以计算每个三角面片对应的纹理在正方形纹理中的三个顶点的纹理坐标。其计算过程如下:

假设正方形纹理的长,宽分别为,三角面片在正方形纹理中顶点坐标为,则此顶点对应的纹理坐标可通过如下公式计算:

                           (2-7)

通过以上三个步骤完成纹理回填后,在原来的面模型上额外增加了存储球谐系数的纹理,每个面片在该纹理上都对应了一块唯一的纹理空间,通过纹理坐标标识。

3.GPU编程绘制

       绘制阶段,按照面绘制的流程,将面模型的每个三角面片的三个顶点以及颜色纹理,系数纹理及其相应纹理坐标传入GPU,通过对GPU渲染管线进行编程读取球谐系数坐标,并进行光照计算。为实现这一目的,只需对fragment shader进行编程即可,其伪代码如下:

使用最近点插值得到当前片元的球谐系数组

使用线性插值得到当前片元的颜色值

使用从CPU中传入的旋转后的光源函数的球谐系数组

计算最终颜色值color

球谐光照技术以球谐函数理论为基础,对图形学中的光照效果进行高效模拟,使得绘制结果在达到良好的光影效果的同时,保持良好的绘制效率。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号