CN102096948B - 一种适用图形硬件的分格化方法 - Google Patents
一种适用图形硬件的分格化方法 Download PDFInfo
- Publication number
- CN102096948B CN102096948B CN 201110048014 CN201110048014A CN102096948B CN 102096948 B CN102096948 B CN 102096948B CN 201110048014 CN201110048014 CN 201110048014 CN 201110048014 A CN201110048014 A CN 201110048014A CN 102096948 B CN102096948 B CN 102096948B
- Authority
- CN
- China
- Prior art keywords
- lod
- branch
- rectangular
- dough sheet
- border
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Image Generation (AREA)
Abstract
“一种适用图形硬件的分格化方法”发明,属于适用于图形硬件的曲面细分设计方法领域。为了解决图形曲面细分加速处理中将图形表面细分为更小的多边形时,硬件实现的效率问题,提出了此方法。方法将曲面面片分格化分解为面片的内部矩形分格化和边界区域分格化两部分,减少了硬件实现中消耗时间较长的乘除法操作,采用定点整数的加法与比较操作实现。该方法主要用于图形处理器中曲面细分的分格化处理单元。该方法的提出可以有效提高硬件实现的效率。
Description
1技术领域
本发明主要是提出一种适用图形硬件实现的分格化(Tessellator)方法,可以高效地实现曲面细分的功能。本发明提出的分格化方法,尽量避免占用硬件资源较多地乘除法操作,适合采用图形硬件电路来实现,属于适用于图形硬件的曲面细分设计方法领域。
图形处理需要巨大的计算能力,来实现图形的实时产生。一个三维应用或游戏场景中,为了获得细腻,真实的显示效果,通常将物体表面分格化后,产生数万到数百万个多边形,通常为三角形,再进行染色,贴图等处理。要实现这样数量巨大的多边形进行实时处理,其性能要求是较高的,需要各种图形加速器硬件的支持,其中包括对曲线和曲面计算的硬件支持。
图形硬件所绘制的是最基本的图元,即点、直线和多边形(通常是三角形),一个平滑的曲面是通过使用大量微小的多边形来模拟的。曲面细分(Tessellation)就是把一个曲面进行分格化以产生一系列多边形的技术。在较早的图形处理系统中,曲面细分是靠软件来实现的,而最新的图形处理器则包含了完成曲面细分的硬件,从而提高了曲面渲染的速度。
2背景技术
曲面细分的思想可以追溯到20世纪50年代G.Rham提出的多边形割角算法,1974年,Chaikin提出的曲线细分方法。1978年Catmull与Clark,Doo与Sabin分别将三次和二次均匀B样条曲面推广到任意拓扑,提出了著名的Catmull-Clark细分和Doo-Sabin细分算法。1987年美国华盛顿大学的Loop发明了著名的Loop细分模式,该方法至今仍是最常用的细分模式之一;1990年,Dyn等提出了插值三角网格顶点的蝶式(Butterfly)细分;同年,Kobbelt提出了插值四边形顶点的Kobbelt细分;1997年,Peters与Reif给出了基于四边形网格的中边细分;2000年,Kobbelt又给出了对偶的三角网格细分模式细分,Labsik与Greiner在此基础上提出了插值细分;2002年,Loop给出了基于三角网格的三分细分格式;2003年Stam与Loop提出了基于三角网格和四边形网格的混合细分。
在Direct11和OpenGL 4.0中最显著的变化就是增加曲面细分(Tessellation)功能,也就是这个功能将由图形处理器(GPU)来实现。这样由图形硬件来实现LOD(Level Of Detail)的表面细化,既能达到非常真实细腻的画面效果,同时又尽可能地发挥硬件的性能。
在DirectX 11中曲面细分(Tessellation)功能是由三个功能模块实现的,即:Hull Shader(外壳着色器),Tessellator(分格化处理单元)和Domain Shader(域着色器)。在DirectX 11中,Hull Shader和Domain Shader都是可编程的着色器,而Tessellator则完全是由固定硬件算法实现的加速器。
图1.Direct3D 11流水线结构示意图
如图1所示,Hull Shader负责收集图形曲面的参数信息,如控制点等用来定义曲面的参数变量。HS根据由控制点生成的曲面表达式产生一系列的面片(surface patches)以及与之相对应的LOD信息。
Tessellator是一个固定功能模块,它并不需要曲面的控制点信息,它的输入是面片和对应的LOD信息。Tessellator根据LOD信息将面片细分成若干个四边形或三角形。如果是四边形还会进一步分解成两个三角形。这些三角形的顶点伴随着它们在面片中参数坐标等分格化信息送入下一级处理。
Domain Shader根据面片中的参数坐标对每一个三角形的顶点进行单独处理,并从其附带的分格化信息中进行计算。Domain Shader会计算出每个顶点所对应的信息,包括:坐标数据、纹理坐标等,并将该顶点和对应的顶点信息向下一级传送。
后面的DirectX 11中各模块根据顶点信息进行各种图形操作,包括:投影变换、三维剪裁、视口变换、图元装配、光栅化、像素染色和颜色混合等操作,最终在屏幕上呈现出所要求的曲面表面。
曲面细分的方法虽然很多,因为有很多的乘除法操作,硬件实现效率较低,我们提出的方法,主要采用定点整数的加法和比较运算,尽量避免乘除法操作,适用于硬件实现。
3发明内容
本发明的目的在于提出一种在图形处理器中适用于硬件实现的高效曲面细分的方法。本发明针对Direct 11流水线结构中的Tessellator,提出该模块的核心实现方法。
Tessellator的输入是曲面的面片(surface patches),以及与之相对应的LOD信息。每一个面片都是由内部的规则矩形和外部的不规则边界构成,如图2所示。
图2面片结构示意图
面片的内部规则矩形可以根据LOD信息划分成很多小的矩形网格。如图2所示,面片中规则矩形的高度LOD值LODH=5,宽度LOD值LODW=10,因此面片中规则矩形可以划分成50个矩形网格。面片的四个边界构成了四边形,且每边的LOD值可以各不相同。如图2所示,左边界的LOD值LODF=8,右边界的LOD值LODR=7,上边界的LOD值LODT=8,下边界的LOD值LODB=5。
在本发明方法中,对面片中规则矩形的网格顶点是按从左向右,从下到上的顺序进行编号。对面片边界上的顶点是从按左下角开始,沿顺时针方向进行编号。分格化方法的具体实现方法可以分为两个分支:面片中规则矩形的分格化和面片边界区域的分格化。以下是两个分支方法的具体说明。
3.1面片中规则矩形的分格化
面片中规则矩形的分格化分为两个步骤。首先是要将面片的内部规则矩形分成若干个矩形块(rectangle),每个矩形块中包含若干个矩形网格(mesh)。这一步骤要求尽量减少向下一级传送的矩形块数量,同时又能保证下一步处理的运算量适当。
图3面片内部规则矩形分成矩形块示意图
如图3所示,每个矩形块是由两行三列共6个矩形网格构成,因此每个矩形块包括12个网格顶点。为了使划分方法简便,规定划分的顺序为从底向上,从左向右,依次进行。在最顶上的矩形块和最右边的矩形块可能会与其他矩形块不同,如图3所示。该步骤的伪代码如下所示:
在上面的伪代码描述中,LODW和LODH分别是面片内部规则矩形的宽度和高度LOD值。而bw和bh分别是矩形块的宽度值和高度值。在上面的方法描述中,都是整数操作,且只有加法和比较操作,没有乘法和除法,使得硬件实现设计简单。
其次要对每个矩形块进行处理。即从矩形块中分离出矩形网格,并将每个矩形网格分成两个三角形。具体实现方法的伪代码如下所示:
在上面的伪代码描述中,虽然使用了乘法运算,但可以使用n*(LODH+1)和(n+1)*(LODH+1)这样两个简单的计数器来实现累加运算。因此,也可以在硬件实现中不使用乘法器。接下来Build_Triangle步骤将三角形的顶点坐标,从原来在内部规则矩形的节点编号转换为在面片中的参数坐标{u,v,w},并计算相应的分格化数据信息。
在Tessellate Mesh步骤中,每次循环都能得到一个矩形块。而在Generate_Rectangle步骤中,每次循环都能把一个矩形网格分成两个三角形。在内部规则矩形细分中,这两个步骤总共循环LODW*LODH次,每次都只有定点数加法和比较操作,因此总的算法复杂度为O(LODw*LODH)。又因为面片中的规则矩形中矩形网格的数量是LODw*LODH个,所以该方法性能是最优的。
3.2面片边界区域分格化
面片边界区域分格化方法稍显复杂一些,目的是要将面片的边界与内部规则矩形之间的空白区域用三角形“缝合”起来,如图2所示。在本方法中绝大多数情况下只需要定点数加法运算和比较操作,乘法运算只需要在初始时使用一次即可。面片边界区域分格化需要两个步骤。首先对四个边界区域进行分别处理,包括初始化一些参数信息等,该步骤的具体实现的伪代码如下所示:
在上面的伪代码描述中,分别对面片的四个边,从左边起,按顺时针方向,依次进行边界区域的分格化处理。其中,Ns是面片边界上的节点索引值,Ne是面片中规则矩形边界的节点索引值,如图2所示。
其次要对面片的边界和与之相对的规则矩形的边界进行分格化处理,即三角形“缝合”处理。该步骤具体实现的伪代码如下所示:
在上面的伪代码描述中,大多数情况下只有定点数加法和比较运算。在该步骤初始的时候需要用到一次定点数乘法,由于是给定参数的乘法运算,因此,也可以将乘法结果由HullShader传过来,这样可在此省去乘法器设计。接下来在Make_Triangle步骤中,将三角形的顶点坐标,从原来在内外边界中的节点索引值转换为在面片中的参数坐标{u,v,w},并计算相应的分格化数据信息。
在Tessellate_External步骤中,依次对四个边界区域进行初始化处理。而在Border_Stitching步骤中,每循环一次,都可得到一个三角形,总共循环LODE+LODI次,因此该方法的计算复杂度为O(LODE+LODI)。又因为每条边界对应的三角形数为LODE+LODI个,所以该方法的性能是最优的。
4附图说明
图1.Direct3D 11流水线结构示意图
图2.面片结构示意图
图3.面片内部规则矩形分成矩形块示意图
图4.分格化方法硬件实现示意图
5具体实施方式
5.1硬件结构设计
采用本方明提出的分格化处理方法所设计的硬件结构如图4所示。在该硬件结构中,Tessellator内部首先用Branch模块接收从Hull Shader送过来的面片信息,包括面片的内部规则矩形的宽度和高度LOD值,以及面片的4个边界的LOD值等信息。在Branch模块内部处理这些数据信息,然后将数据信息打包分为两条支路传送。这两条支路分别进行面片的内部规则矩形的分格化和面片边界区域的分格化处理。
图4分格化方法硬件实现示意图
在面片的内部规则矩形的分格化这一分支中,Tessellate_Mesh模块接收从Branch模块传来的面片的内部规则矩形的宽度和高度的LOD值(LODW和LODH),以及矩形块的宽度和高度值(bw和bh)。在Tessellat_Mesh模块内部处理中,将面片的内部规则矩形划分为若干个矩形块。在Tessellat_Mesh模块内部状态机中,每一个节拍都能得到一个矩形块,然后将该矩形块向下一级传送。
Generate_Rectangle模块接收从Tessellate_Mesh模块传来的矩形块的起始点信息(i,j)和宽度高度信息(w,h)。在Generate_Rectangle模块内部处理中,首先将矩形块分解为若干个矩形网格(mesh),紧接着将单个矩形网格划分为两个三角形。在Generate_Rectangle模块内部状态机中,每个节拍都能得到两个三角形,然后将这两个三角形的顶点信息向下一级传送。
Build_Triangle模块接收从Generate_Rectangle模块传送来的三角形的顶点数据信息(V0、V1、V2)。因为一个节拍会有两个三角形传送过来,因此设计两个Build_Triangle模块接收信息。Build_Triangle模块内部处理中,将三角形的顶点坐标,从原来在内部规则矩形的节点编号转换为在面片中的参数坐标{u,v,w},并计算相应的分格化数据信息。在Generate_Rectangle模块内部状态机中,每个节拍都能计算出三角形三个顶点的参数坐标,然后将包含该信息的分格化数据向下一级Domain Shader传送。
在面片边界的分格化这一分支中,Tessellate_External模块接收从Branch模块传来的面片的边界信息,包括面片的内部规则矩形的宽度和高度LOD值,以及面片的4个边界的LOD值等信息。在Tessellate_External模块内部处理中,计算出4个边界分格化所需要的参数,如内外边界起始节点索引值和步长等信息。在Tessellate_External模块的内部状态机中,每个节拍能计算出一条边界区域分格化所需要的初始数据信息,然后向下一级传送。
Border_Stitching模块接收从Tessellate_External模块传送来的内部和外部边界LOD值(LODI和LODE),以及步长(stride)、内部和外部边界起始节点索引值(Ne和Ns)。在Border_Stitching模块中,将内部和外部边界区域用三角形逐个“缝合”。在Border_Stitching模块状态机中,每个节拍都能得到一个三角形,以及三个顶点在内部和外部边界中的索引值,然后将该信息向下一级传送。
Make_Triangle模块接收从Border_Stitching模块传来的三角形的三个顶点在内外边界中的索引值等数据信息(Ne,Ns,Ne/Ns+1)。在Make_Triangle模块内部处理中,将三角形的顶点坐标,从原来在内外边界中的节点索引值转换为在面片中的参数坐标{u,v,w},并计算相应的分格化数据信息。在Make_Triangle模块内部状态机中,每个节拍都能计算出三角形三个顶点的参数坐标,然后将包含该信息的分格化数据向下一级Domain Shader传送。
根据本方明方法所设计Tessellator的硬件结构采用流水线工作方式。在流水线满负荷情况下,每个节拍可以输出3个三角形。在具体实现中,绝大多数运算都是定点数加法和比较操作。在本方法中只有少数运算需要用到乘法操作,可以通过一些方式避免,如前所述。本方法在设计时充分考虑了硬件的实现,比较容易提高运算并行性。
5.2仿真结果验证
依据本发明方法编写了相应的C语言仿真程序,分别对面片的内部规则矩形和面片边界区域进行了分格化。设定面片的内部规则矩形的面片中规则矩形的高度LOD值LODH=5,宽度LOD值LODW=10。每个矩形块初始设为高度为2,宽度为3。对面片的内部规则矩形分格化所结果如表1所示:
表1面片内部规则矩形的分格化结果
如表1所示,面片中规则矩形首先被划分为矩形块,然后进一步将矩形块划分为矩形网格,每个矩形网格又被划分为两个三角形。图5中显示出划分处的矩形块和其包含的三角形。
设定面片的四个边界的LOD值,左边界的LOD值LODF=8,右边界的LOD值LODR=7,上边界的LOD值LODT=8,下边界的LOD值LODB=5。对面片边界区域进行分格化所得结果如表2所示:
表2面片边界区域分格化结果
如表2所示,面片的边界区域从左边界开始,沿顺时针方向,依次进行分格化。每个边界区域都是用三角形“缝合”而成。每个三角形的三个顶点分别由外部边界和内部边界的节点索引值给出。
通过软件仿真验证,进一步说明了本发明方法的正确性和有效性。曲面细分是衡量图形处理器设计性能优劣的一项重要指标。本方明方法针对曲面细分中的分格化问题提出了有效的实现方法,非常适用硬件实现,可以有效提高图形处理器性能。
Claims (1)
1.一种适用图形硬件的分格化方法,该方法包含四边形面片的边界区域和内部矩形分格化两部分,输入信息包括4个边界LOD值和内部矩形的2个LOD值,输出结果为三角形网格节点的索引值和相应的参数坐标{u,v},本方法支持2个inner tessellation factor轴的方式,即内部矩形的高度LODH和宽度LODW值可以相同或不同,内部矩形的分格化方法为:在算法Tessellate_Mesh中设定矩形块的高度值bh和宽度值bw,将内部矩形划分为矩形块,然后调用过程Generate_Rectangle将矩形块划分成矩形网格,再将每个矩形网格划分为两个三角形网格,通过对矩形块大小的设置,可以实现粗略分块和精细划分之间计算量的平衡;边界区域的分格化方法为:在算法Tessellate_External中对四个边界区域进行初始化,使得每个边界区域分格化相互独立,然后调用过程Border_Stitching对每个边界区域进行分格化,其中LODE和LODI分别表示该区域的面片边界和内部矩形边界的LOD值,面片边界上节点索引Ns和内部矩形边界上节点索引Ne按各自步长依次交替增长,步长均为定点整数,采用LODE×LODI值作为判断节点索引值是否停止增长的条件,四边形面片分格化的算法复杂度为O(N),其中N为三角形网格的数量,除了初始化时需要少量的乘法操作,在分格化过程中仅使用了定点整数的加法和比较运算,本方法可采用流水线方式实现,且内部矩形和边界区域分格化模块之间,Build_Triangle子模块之间,Border_Stitching子模块之间均满足空间并行,因此在流水线满负荷的情况下,一个节拍至少可以生成1个三角形网格,至多可以生成6个三角形网格,本方法适合硬件的设计,可以有效提高硬件实现效率。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110048014 CN102096948B (zh) | 2011-03-01 | 2011-03-01 | 一种适用图形硬件的分格化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110048014 CN102096948B (zh) | 2011-03-01 | 2011-03-01 | 一种适用图形硬件的分格化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102096948A CN102096948A (zh) | 2011-06-15 |
CN102096948B true CN102096948B (zh) | 2012-10-31 |
Family
ID=44130024
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201110048014 Active CN102096948B (zh) | 2011-03-01 | 2011-03-01 | 一种适用图形硬件的分格化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102096948B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102999945B (zh) * | 2011-09-15 | 2016-01-06 | 北京进取者软件技术有限公司 | 一种用于浮雕模型建模的网格曲面区域划分方法 |
CN104933225B (zh) * | 2015-05-25 | 2018-01-09 | 中国科学院过程工程研究所 | 实现计算流体力学大规模实时模拟的方法 |
CN108597590A (zh) * | 2018-05-08 | 2018-09-28 | 上海嘉奥信息科技发展有限公司 | 基于gpu运算的体数据任意断层数据显示方法及系统 |
CN114494651B (zh) * | 2022-04-18 | 2022-09-02 | 龙芯中科(合肥)技术有限公司 | 曲面细分处理方法、装置、电子设备及存储介质 |
CN116597109B (zh) * | 2023-01-13 | 2023-12-22 | 东莘电磁科技(成都)有限公司 | 一种复杂三维曲面共型网格生成方法 |
CN115861512B (zh) * | 2023-01-31 | 2023-07-25 | 南京砺算科技有限公司 | 用于曲面细分的输出点序列确定方法及装置、存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1975787A (zh) * | 2006-12-01 | 2007-06-06 | 中山大学 | 一种基于高阶三角形插值曲面细分的几何数据细分方法 |
CN101872488A (zh) * | 2009-04-27 | 2010-10-27 | 鸿富锦精密工业(深圳)有限公司 | 曲面渲染系统及方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8482560B2 (en) * | 2008-12-31 | 2013-07-09 | Intel Corporation | Image forming techniques |
US20100164954A1 (en) * | 2008-12-31 | 2010-07-01 | Sathe Rahul P | Tessellator Whose Tessellation Time Grows Linearly with the Amount of Tessellation |
-
2011
- 2011-03-01 CN CN 201110048014 patent/CN102096948B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1975787A (zh) * | 2006-12-01 | 2007-06-06 | 中山大学 | 一种基于高阶三角形插值曲面细分的几何数据细分方法 |
CN101872488A (zh) * | 2009-04-27 | 2010-10-27 | 鸿富锦精密工业(深圳)有限公司 | 曲面渲染系统及方法 |
Non-Patent Citations (2)
Title |
---|
李继 等.曲面细分模式的分类研究.《沈阳师范大学学报(自然科学版)》.2009,第27卷(第1期),全文. * |
韩俊刚 等.一种图形加速器和着色器的体系结构.《计算机辅助设计与图形学学报》.2010,第22卷(第3期),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN102096948A (zh) | 2011-06-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102096948B (zh) | 一种适用图形硬件的分格化方法 | |
CN102272798B (zh) | 曲面细分时间随曲面细分量线性增长的镶嵌器 | |
CN102930594B (zh) | 基于保持边界的计算机三维地形网格的绘制方法 | |
CN103761770A (zh) | 图像形成技术 | |
CN106251400B (zh) | 一种基于多四边形网格构建地形图的方法及装置 | |
CN101593361A (zh) | 一种基于双层嵌套网格的大规模地形绘制系统 | |
CN115495938B (zh) | 海面波浪的三维动态模拟和可视化方法 | |
CN109934893B (zh) | 几何体任意截面的显示方法、装置及电子设备 | |
CN116977598B (zh) | 三角网格数值仿真平滑化的方法 | |
Krishnamurthy et al. | Optimized GPU evaluation of arbitrary degree NURBS curves and surfaces | |
CN106887042B (zh) | 基于gpu的自适应曲面细分方法 | |
CN113591208B (zh) | 一种基于舰船特征提取的超大模型轻量化方法及电子设备 | |
CN110197530A (zh) | 透光浮雕灯罩实体模型构建方法及系统 | |
CN111127589B (zh) | 顾及线宽一致性的矢量地图圆形虚线符号绘制方法 | |
CN101493941B (zh) | 基于GPU硬件加速的Graph Cuts三维图像分割方法 | |
CN110689616B (zh) | 基于三维数字地球的输水渠道参数化建模方法 | |
Tatarinov | Instanced tessellation in DirectX10 | |
CN105957142A (zh) | 一种面向TIN构建的Hilbert排序方法 | |
CN116630486B (zh) | 一种基于Unity3D渲染的半自动化动画制作方法 | |
Zhang et al. | Construction and optimization of simulation environment based on virtual reality | |
CN104143204A (zh) | 考虑拓扑结构的移动最小二乘二维角色变形方法 | |
CN114937110B (zh) | 一种gpu加速的引流线建模方法、系统、设备及介质 | |
Lin et al. | Fusion of disconnected mesh components with branching shapes | |
CN117456074B (zh) | 基于数字孪生仿真的海上风电冲刷坑三维渲染方法和设备 | |
CN112365599A (zh) | 一种变电运检仿真系统中交互场景内草坪制作方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |