基于GPU的自适应曲面细分方法与流程

文档序号:12722816阅读:426来源:国知局
基于GPU的自适应曲面细分方法与流程

本发明属于计算机图形学领域,涉及一种基于GPU的自适应曲面细分方法。



背景技术:

随着现代工业的发展,计算机辅助与制造发展迅速,其技术水平的发展已成为一个国家现代化水平的重要标志。其中计算机辅助几何设计(Computer Aided Geometric Design简称为CAGD)是对外形方面的几何信息的计算机表示,现在已经是计算机应用学科的一个重要分支。

由于计算机离散化表示数据,计算机不能直接生成曲线,当然更不能直接生成曲面。我们在计算机屏幕上看到的曲线、曲面实际上是由无数个多边形构成的。当然多边形越多,那么曲面就会展现的更为真实。要得到精细的效果,需要提供包含大量控制点的实体模型,称之为高模模型,但这给模型设计带来了大量的工作量,提高了人力成本。

曲面细分技术,是一种化繁为简的手段,在模型已有的表面上细分出顶点,逐步逼近理想曲面。1978年Edwin Catmull和Jim Clark提出经典的Catmull-Clark曲面细分算法,由于该算法的递归特性不适用于GPU编程,基于三角形的Loop细分算法也不适用GPU编程。近些年一大批适用于GPU编程的曲面细分算法被提出,比如:2008年CHARLES LOOP和SCOTT SCHAEFER两人于2008年提出了一种近似Catmull-Clark细分面的算法、同年Tamy Boubekeur提出的Phong细分算法。由于细分曲面的顶点和面数以指数速度增长,绘制速度会随细分深度增加而迅速降低,所以在GPU技术出现之前细分曲面技术难以实用,直到由ATI公司基于GPU开发应用了曲面细分之后,曲面细分技术得以在工业设计、计算机动画和雕塑曲面等的设计加工中被广泛应用和研究。

现存的细分方法,随着细分的进行,顶点和边的数量会急剧增加,所以对庞大复杂的网格模型进行细分时,将耗费大量的存储资源和运算资源。同时对后续的显示、传输或者数控加工编程增加负担。而实际情况是,在细分迭代数次后,某些区域(如较平坦部分或者初始控制网格较稠密的部分)其控制网格已较好地逼近极限细分曲面,而在另外一些区域(如曲率变化较大的部分)其控制网格还比较粗糙,需要继续细分。为了减少不必要的计算资源的浪费,自适应的曲面细分算法就很重要了。根据给定的局部细分准则,对整个控制网格上进行局部细分,力求以规模较小的网格来表示精度较高的细分曲面,这对于扩大细分曲面的应用具有重要的工程意义。

基于以上背景,基于GPU的自适应曲面细分方法提出了一种自适应策略,将有效的解决曲面光滑度和数据量之间的矛盾,使得在保证曲面细分显示效果的前提下提高渲染帧率。采取了两种基于三角形面片的细分模式:PN三角形和Phong细分进行验证,实验证明,基于GPU的自适应曲面细分方法具有很好的现实和理论意义。



技术实现要素:

发明目的:以有效的解决曲面光滑度和数据量之间的矛盾,使得在提高显示效果的前提下提高渲染帧率。

本发明包括:至少支持Directx11的GPU。

基于GPU的自适应曲面细分方法;其特征在于,在计算机中是依次按以下步骤实现的:

步骤(1),Directx11初始化

具体包括:

1、设置输入布局,添加POSITION和NORMAL两个顶点语义。

2、设置常量缓冲区,与GPU中HLSL常量缓冲区对应

步骤(2),读取网格模型数据与初始化顶点缓存:

在Directx11中集成了曲面细分管线,在GPU中实现PN三角形细分策略时,对于每一个三角形面片,由三个控制点生成一个有10个控制点的3阶贝塞尔三角形。在GPU中实现Phong细分算法时,对于每一个三角形面片,需要知道每个顶点的法向量。在自定义顶点结构中定义顶点的相关属性,PN三角形细分策略与Phong细分策略顶点格式相同,都包含一个坐标信息和法向量信息。

步骤(3),创建顶点布局:

在自定义顶点结构中定义顶点的相关属性,PN三角形细分策略与Phong细分策略顶点格式相同,都包含一个坐标信息和法向量信息。

步骤(4),网格渲染:

为了能启用Directx11的细分阶段,设置Input Assembler的图元拓扑类型,使其接收的是控制面片的结构,用IASetPrimitiveTopology设置D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST,使得GPU以面片的方式读取顶点缓存。

步骤(5),自适应曲面细分:

准备好顶点缓冲后,在GPU中实现曲面细分算法,GPU以D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST组装方式对输入的顶点缓冲进行读取。在Directx11中,曲面细分阶段分为三个管线,分别为Hull着色阶段,Tessellator阶段以及Domain着色阶段。其中,Hull着色阶段由两部分构成,分别对应两个不同的hlsl程序,分别为Hull着色阶段和patch静态函数。在patch静态函数中决定了曲面片的细分程度,从而告知Tessellator阶段要细分出多少顶点。

第一步:在patch静态函数中,进行自适应曲面细分算法的实现。自适应策略包括:背部剔除、距离自适应、垂直面自适应及面片大小自适应。计算出面片的细分因子后,需要进行裂缝消除。

背部剔除:

在进行计算细分因子之前,先做背部剔除测试,对于没有通过背部剔除测试的面片,只需要把该面片的每一条边的曲面细分因子置为0,那么渲染管线将不再渲染该面片。对于一个给定的三角形面片,对于每一条边,计算公式如下:

其中edgedot为点积结果,Nj,Nk表示三角形面片中任意两个顶点的组合,V为视向量。对于左手坐标系,若该结果为负值,说明该面片的这条边为背向。当一个面片的三条边都为背向时说明该面片为背向。

距离自适应:

基于距离自适应的细分因子计算公式如下:

Factor1=1-(Dis-minDis)/disFrange

其中,Dis表示视点与面片边中点的距离,minDis表示使用最大细分因子的最小距离。disFrange表示近平面与远平面之间的距离,Factor1为使用距离自适应策略得到的调节因子这两个参数大小用户可以设定,对于不同的物体模型,取值不同。最终可以得到的Factor1的值位于[0,1]之间。

得到调节因子后,使用线性差值公式:

x1=1+Factor*(x-1)

其中,x1为使用距离自适应策略调解后的细分因子大小,x为初始细分因子大小。垂直面自适应:

一个面片如果与视线方向保持近似垂直时,由于3D场景在2D屏幕上显示时需要进行投影,对于这样的面片进行细分视觉效果变化不大,因此适当减小细分因子。对于每一个面片处理如下:

其中edgedot为点积结果,Nj,Nk表示三角形面片中任意两个顶点的组合,V为视向量。其中edgedot为归一化后的两个向量之间的乘积。

根据公式:

Factor2=1-|edgedot|

同样使用线性插值公式:

x2=1+Factor2*(x1-1)

其中,Factor2为使用垂直面自适应策略得到的调节因子。x2为经过垂直面自适应策略调解后得到的细分因子大小,x1使用距离自适应策略调解后的细分因子大小面片大小自适应:

对于模型中的面片首先根据面片的每一条边进行细分因子的动态计算。对于一个给定的面片,计算公式如下:

其中,P1,P2表示三角形面片的任意两点。D表示用户给定的距离大小。Factor3为求得的调节因子。

得到调节因子Factor3后,同样使用线性差值公式:

x3=1+Factor3*(x2-1)

其中,x3为面片大小自适应策略调解后的细分因子大小,x2为经过垂直面自适应策略调解后得到的细分因子大小

裂缝消除:

对于相邻三角形的相邻边,设置该边的细分因子为相邻三角形中最大的细分因子。

三角形ABC,与三角形ACD相邻,AC为共享边,XAC表示边AC的细分因子大小。为三角形ABC中AC边的细分因子大小,为三角形ACD边AC边的细分因子大小。

第二步:hull着色程序,对每个输出控制点执行一次,设置细分domain为三角形,输出控制点的数量为3,并指定patch函数为第二步中的patch函数。

第三步:domain着色程序,在该程序中分别实现了PN三角形细分策略及Phong细分策略。

使用PN三角形细分策略时,对于给定u,v,w,u+v+w=1,使用三阶贝塞尔三角形公式:

求出细分得到的顶点的三维坐标。

使用二阶贝塞尔三角形公式得到各个顶点的法向量。公式如下:

对于给定的uvw坐标,求出顶点的法向量。

使用Phong细分模式时,三角形面片的控制点为:pl,pm和pn,各个顶点对应的法向量分别为nl,nm和nn。对于给定的uvw坐标,使用以下公式:

其中,

p(u,v,w)=pl*u+pm*v+pn*w

令q=p(u,v,w),那么:

πl(p(u,v,w))=πl(q)=q-((q-pl)Tnl)nl

πm(p(u,v,w))=πm(q)=q-((q-pm)Tnm)nm

πn(p(u,v,w))=πn(q)=q-((q-pn)Tnn)nn

T表示转置;

即可求出细分得到的顶点的三维坐标。

本发明使用Directxll编程工具,基于距离自适应、垂直面自适应、面片大小自适应及背部剔除四种自适应策略,实现了曲面细分的自适应方法。对于每个面片,基于四种策略做细分因子的计算,因此可以动态的根据不同的三角形面片的特征调整每个三角形面片的细分因子大小。从而有效的解决了曲面光滑度与数据量之间的矛盾。

附图说明

图1为物体模型的网格图

图2为模型在细分因子为9是的网格图

图3为模型结果俯视图

图4为模型在细分因子为9时的渲染结果俯视图

图5为模型在细分因子为9时的使用面片大小自适应策略的渲染结果俯视图

图6为模型在细分因子为9时的使用距离自适应策略的渲染结果俯视图

图7为模型在细分因子为9时的使用垂直面自适应策略的渲染结果俯视图

图8为模型在细分因子为9时的使用面片大小自适应策略的渲染结果图

图9为模型在细分因子为9时的使用距离自适应策略的渲染结果图

图10为模型在细分因子为9时的使用垂直面自适应策略的渲染结果图

图11为模型在细分因子为9时的使用背部剔除测试的渲染结果图

图12为为模型在细分因子为9时,未使用自适应策略渲染结果图

图13为基于GPU的自适应曲面细分方法的总体流程图

图14为在计算细分因子时使用自适应策略流程图

图15为相同边由于不同大小的细分因子导致的裂缝的效果图

图16为使用裂缝消除策略后的效果图

具体实施方式

下面结合附图对本发明做进一步的说明。

图13,14是本发明的流程图,在计算机中按如下步骤进行:

1、基于GPU的自适应曲面细分方法;其特征在于,在计算机中是依次按以下步骤实现的:

步骤(1),Directx11初始化

具体包括:

3、设置输入布局,添加POSITION和NORMAL两个顶点语义。

4、设置常量缓冲区,与GPU中HLSL常量缓冲区对应

步骤(2),读取网格模型数据与初始化顶点缓存:

在Directx11中集成了曲面细分管线,在GPU中实现PN三角形细分策略时,对于每一个三角形面片,由三个控制点生成一个有10个控制点的3阶贝塞尔三角形。在GPU中实现Phong细分算法时,对于每一个三角形面片,需要知道每个顶点的法向量。在自定义顶点结构中定义顶点的相关属性,PN三角形细分策略与Phong细分策略顶点格式相同,都包含一个坐标信息和法向量信息。

步骤(3),创建顶点布局:

在自定义顶点结构中定义顶点的相关属性,PN三角形细分策略与Phong细分策略顶点格式相同,都包含一个坐标信息和法向量信息。

步骤(4),网格渲染:

为了能启用Directx11的细分阶段,设置Input Assembler的图元拓扑类型,使其接收的是控制面片的结构,用IASetPrimitiveTopology设置D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST,使得GPU以面片的方式读取顶点缓存。

步骤(5),自适应曲面细分:

准备好顶点缓冲后,在GPU中实现曲面细分算法,GPU以D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST组装方式对输入的顶点缓冲进行读取。在Directx11中,曲面细分阶段分为三个管线,分别为Hull着色阶段,Tessellator阶段以及Domain着色阶段。其中,Hull着色阶段由两部分构成,分别对应两个不同的hlsl程序,分别为Hull着色阶段和patch静态函数。在patch静态函数中决定了曲面片的细分程度,从而告知Tessellator阶段要细分出多少顶点。

第一步:在patch静态函数中,进行自适应曲面细分算法的实现。自适应策略包括:背部剔除、距离自适应、垂直面自适应及面片大小自适应。计算出面片的细分因子后,需要进行裂缝消除。

背部剔除:

在进行计算细分因子之前,先做背部剔除测试,对于没有通过背部剔除测试的面片,只需要把该面片的每一条边的曲面细分因子置为0,那么渲染管线将不再渲染该面片。对于一个给定的三角形面片,对于每一条边,计算公式如下:

其中edgedot为点积结果,Nj,Nk表示三角形面片中任意两个顶点的组合,V为视向量。对于左手坐标系,若该结果为负值,说明该面片的这条边为背向。当一个面片的三条边都为背向时说明该面片为背向。

距离自适应:

基于距离自适应的细分因子计算公式如下:

Factor1=1-(Dis-minDis)/disFrange

其中,Dis表示视点与面片边中点的距离,minDis表示使用最大细分因子的最小距离。disFrange表示近平面与远平面之间的距离,Factor1为使用距离自适应策略得到的调节因子这两个参数大小用户可以设定,对于不同的物体模型,取值不同。最终可以得到的Factor1的值位于[0,1]之间。

得到调节因子后,使用线性差值公式:

x1=1+Factor*(x-1)

其中,x1为使用距离自适应策略调解后的细分因子大小,x为初始细分因子大小。垂直面自适应:

一个面片如果与视线方向保持近似垂直时,由于3D场景在2D屏幕上显示时需要进行投影,对于这样的面片进行细分视觉效果变化不大,因此适当减小细分因子。对于每一个面片处理如下:

其中edgedot为点积结果,Nj,Nk表示三角形面片中任意两个顶点的组合,V为视向量。其中edgedot为归一化后的两个向量之间的乘积。

根据公式:

Factor2=1-|edgedot|

同样使用线性插值公式:

x2=1+Factor2*(x1-1)

其中,Factor2为使用垂直面自适应策略得到的调节因子。x2为经过垂直面自适应策略调解后得到的细分因子大小,x1使用距离自适应策略调解后的细分因子大小面片大小自适应:

对于模型中的面片首先根据面片的每一条边进行细分因子的动态计算。对于一个给定的面片,计算公式如下:

其中,P1,P2表示三角形面片的任意两点。D表示用户给定的距离大小。Factor3为求得的调节因子。

得到调节因子Factor3后,同样使用线性差值公式:

x3=1+Factor3*(x2-1)

其中,x3为面片大小自适应策略调解后的细分因子大小,x2为经过垂直面自适应策略调解后得到的细分因子大小

裂缝消除:

对于相邻三角形的相邻边,设置该边的细分因子为相邻三角形中最大的细分因子。

三角形ABC,与三角形ACD相邻,AC为共享边,XAC表示边AC的细分因子大小。为三角形ABC中AC边的细分因子大小,为三角形ACD边AC边的细分因子大小。

第二步:hull着色程序,对每个输出控制点执行一次,设置细分domain为三角形,输出控制点的数量为3,并指定patch函数为第二步中的patch函数。

第三步:domain着色程序,在该程序中分别实现了PN三角形细分策略及Phong细分策略。

使用PN三角形细分策略时,对于给定u,v,w,u+v+w=1,使用三阶贝塞尔三角形公式:

求出细分得到的顶点的三维坐标。

使用二阶贝塞尔三角形公式得到各个顶点的法向量。公式如下:

对于给定的uvw坐标,求出顶点的法向量。

使用Phong细分模式时,三角形面片的控制点为:pl,pm和pn,各个顶点对应的法向量分别为nl,nm和nn。对于给定的uvw坐标,使用以下公式:

其中,

p(u,v,w)=pl*u+pm*v+pn*w

令q=p(u,v,w),那么:

πl(p(u,v,w))=πl(q)=q-((q-pl)Tnl)nl

πm(p(u,v,w))=πm(q)=q-((q-pm)Tnm)nm

πn(p(u,v,w))=πn(q)=q-((q-pn)Tnn)nn

T表示转置;

即可求出细分得到的顶点的三维坐标。

经过以上步骤后,实现了基于GPU的自适应曲面细分方法,图2展示了物体模型在进行曲面细分后的显示效果,与图1相比,可以看出在原有的控制点的基础上,新生成了大量的新的控制点。图4与图3相比,细分后的结果面片更加光滑。图7中展示了使用垂直面自适应策略时的俯视图,因为是俯视图,所以该面近似与视线方向垂直,因此结果图与图4结果类似。图8,9及10分别展示了使用不同自适应策略后的渲染效果。图15为产生裂缝示意图,图16为消除裂缝示意图。如果所示,左侧三角形细分每个边的细分因子都为4,右侧三角形每条边的细分因子都为3,所以在共享边上产生了裂缝,使用裂缝消除算法解决该问题,右侧三角形的共享边细分因子取4,其他边保持不变,如图16 所示,消除了裂缝。为验证自适应算法的有效性,本文对各个自适应策略分别做了实验,并从客观指标帧率(FPS)对其验证,帧率越高表示绘制场景需要的资源更少,帧率的提升反映了自适应曲面细分的有效性(实验机器的配置:NVIDIA Quadro K600图形卡),结果如下:

背部消隐测试

表1

距离自适应测试

表2

表3

垂直面自适应

表4

面片大小自适应

表5

从表1-5可以看出,随着细分因子的增大,绘制的面片的增加,使用自适应策略后,能大幅度提升帧率。此外,结合图8,9,10,11及12可以看出,在渲染效果几乎相同的情况下,使用自适应曲面细分方法能大幅度提升帧率。

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