一种在图形处理器上拾取三维几何图元的方法
技术领域
本发明是关于海量图元的快速选择和拾取方法,具体涉及一种图形处理器GPU上的三维几何图元的拾取方法。
背景技术
图形拾取是实现一个图形编辑系统的关键技术之一,所谓图形拾取就是从纷繁的图中选择某一图形的过程,其目的是只对该选中的图形进行平移、修改、放缩、旋转和删除等交互操作。图形拾取方式包括:单体拾取和块拾取两种方式。单体拾取是用鼠标直接点取单个图形的过程,而块拾取则是用矩形框把要拾取的图形对象包围起来的方式,是一种范围拾取。块选取方法往往通过判断框内各图形的矩形边界包围盒(Bounding box)是否包含在矩形框中,如包含在其中,则被拾取;否则便不被拾取,属于一种粗糙的拾取方式。图形的拾取现有的方法有两类,一类是三维图形绘制标准OpenGL提供的拾取机制,另一类是基于屏幕射线求交的拾取方法。
1、OpenGL选择机制
OpenGL为了解决拾取问题,提供了一种基于名称堆栈的命中记录的选择机制。主要步骤为:定义选择物体和清空名字堆栈,定义记录存储数组,进入选择模式,进行选择。在OpenGL中,拾取物体是利用拾取矩阵和投影变换,将拾取的范围限制在鼠标热点的有效区中,一旦触发鼠标事件就进入选择模式并将有效区初始化,最后利用拾取矩阵拾取有效区内的物体。有效区的定义由glPickMatrix()函数来完成。一旦拾取成功,就以记录的形式返回与拾取物体相关的信息,并生成一个记录表示一个物体被命中。
但是这种机制使用限制较多,尤其是对于图元数据量较大的几何形体或者场景,往往会因为名字堆栈的溢出而无法成功实现。而频繁的名称堆栈的压入与弹出操作会严重影响拾取的效率。此外,OpenGL的选择拾取机制使用较为麻烦,需要在正常绘制模式和选择绘制模式之间进行切换。
2、屏幕射线求交拾取法
射线求交拾取法是通过获取鼠标在屏幕上的点击点,经屏幕坐标转换得到投影点,以视点为起点,经投影点构造一条垂直指向屏幕的射线。由于所有显示在屏幕上的三维物体都位于视域体之内,因而只需要判断这条射线与场景中的哪个物体相交。经过相交检测算法即可选择得到与该射线相交的几何图元。
屏幕射线拾取算法的过程如下:得到鼠标点击处的屏幕坐标,并将其转换为客户区坐标,实现视区反变换;然后,通过投影矩阵和观察矩阵把该坐标转换为通过视点和鼠标点击点的一条射入场景的射线,该射线如果与三维场景模型的图元相交,则获取该相交图元的信息。因此从数学角度来看,只要得到射线的方向矢量和射线的出射点就确定了射线方程,最后就可以利用射线判断其与空间一个图元是否相交,从而实现图元的选取。
这种方法应用于几何体的块拾取时,则需要将屏幕上的n个点击点所对应的n条射线构成一个选择体。然后通过算法来对每个点进行判断处理,在选择体内部的点为所要拾取的几何图元。该方法对于复杂的待选择几何图元,判断三维空间中图元是否位于三维的选择体内部的算法极其复杂,需耗费大量的计算资源,耗时也非常巨大,其块拾取算法在实际系统中几乎没有应用价值。
随着2000年以后可编程图形硬件的引入,基于GPU(Graphics Process Unit)的通用计算已经成为当前许多研究人员关注的热点。可编程性使得人们可以充分利用GPU上提供的顶点处理器、片元处理器或者几何处理器,设计一些算法通过整个图形流水线来完成特定的任务。基于GPU的通用计算已经广泛应用在代数计算、流体模拟、数据库操作、图像处理和几何计算中。当前主流的显卡芯片制造厂商nVIDIA和AMD(ATI)也不断推出新的图形硬件架构,为GPU通用计算提供有力的支持。2006年底,AMD(ATI)公司发布了新一代图形硬件流处理器(Stream Processor),专门针对金融分析、地质分析、生命科学等应用领域。nVIDIA则在G80芯片上使用了CUDA(Compute Unified Device Architecture,统一计算设备构架),以胜任复杂的通用计算的要求。
当前图形硬件设计的趋势是在图形处理器中提供更多的可编程性。在传统的图形流水线中,几何光照处理和像素渲染过程仅仅能完成非常有限的一些渲染效果,而且一旦完成后如果需要改变效果,需要在CPU端计算好改变后的状态,再次将图元和像素调入流水线进行处理。当图形硬件有了可编程结构,可以随时改变顶点的坐标,重量,法线,颜色,纹理坐标,雾和点大小等数据,而且不需要CPU介入,完全由图形芯片执行。可编程性最大的好处是灵活性,设计人员可以根据需求制定不同的指令操作,将各种特效组合使用,从而产生千变万化的逼真效果。
因此,针对目前大量包含几何图元的网格实时交互需求,如何基于现代图形处理器GPU实现快速拾取图元,是当前研究的难点和热点。
发明内容
本发明针对现有技术中的问题,提供了一种可快速在大量几何图元中精确拾取目标图元或图元集合的方法。
本发明的技术方案是:
1、一种在图形处理器上拾取三维几何图元的方法,其步骤包括:
1)将附带几何图元ID编码的三维图形绘制到图形处理器GPU上的离屏缓冲区FBO中,具体方法是,将所有图元的ID编码转换为色彩信息,并将该色彩信息附着在待绘制的几何图元之上,在FBO中像素位置与三维图形经正常模式绘制得到图像结果中的像素位置一一对应,将上述色彩信息保存在FBO内,经过解码可得到对应几何图元的真实ID值;
2)将FBO与可读取的RBO(Render Buffer Object)建立关联,通过读取鼠标光标指定位置RBO内保存的几何图元ID,拾取到命中的单个图元;
3)按照正常模式绘制三维图形,区分显示被选中和未被选中的几何图元,被选中图元以突出方式显示。
上述步骤1)中图形处理器GPU进行如下处理:
1)在绘制流程中,几何图元经过顶点处理器,进行透视或者投影变换;
2)随后,通过光栅化和片元处理器处理,生成图像,输出目标到上述FBO中。
上述绘制分别采用GPU提供的VBO图元技术,将几何图元组织成易于GPU高速访问的数组形式,保存在GPU一端的显存中。
一种在图形处理器上拾取三维几何图元的方法,其步骤包括:
1)将附带几何图元ID编码的三维图形绘制到图形处理器GPU上的离屏缓冲区FBO中,具体方法是,将所有图元的ID编码转换为色彩信息,并将该色彩信息附着在待绘制的几何图元之上,在FBO中像素位置与三维图形经正常模式绘制得到图像结果中的像素位置一一对应;
2)上述色彩信息保存在FBO内,将FBO中的图像绑定为一幅纹理,当FBO中的图像被绑定为一幅纹理后,纹理中的色彩值,经过解码可得到对应几何图元的真实ID值;
3)按照正常模式绘制真实图形,在GPU的几何处理器和片元处理器中对每个几何图元进行处理,根据当前用户鼠标框选的范围,通过纹理查找的方式获得当前框选区域的命中几何图元,并区分显示被选中和未被选中的几何图元,被选中图元以突出方式显示。
上述图形处理器GPU进行如下处理:
1)在绘制流程中,几何图元经过顶点处理器,进行透视或者投影变换;
2)随后,通过光栅化和片元处理器处理,生成图像,输出目标到上述FBO中。
上述片元处理器中对每个几何图元进行处理的具体步骤为:
1)输入每个几何图元光栅化之后的片元和当前框选区域;
2)比较当前片元是否位于框选区域之内,若在区域之内,则表示当前片元所对应的几何图元被命中。以片元所处的二维坐标作为纹理参数查找ID纹理的值,并将得到的ID纹理值进行解码得到真正被选中图元的ID值;
3)当前被选中图元的片元突出显示,并返回图元的ID值。
上述色彩信息采用RGBA色彩表示模型。
与现有技术相比,本发明的有益效果是:
本发明借助GPU提供的FBO技术支持的缓冲数据保存方式,拾取的命中通过RBO关联FBO读取几何图元ID或者FBO绑定为纹理并进行纹理查询两种方式获得。完全在绘制模式下实现,不需要为绘制的图元命名,避免在绘图模式和选择模式之间进行切换。整个拾取过程在GPU之中实现,满足了几何模型产生的大量包含几何图元的网格实时交互需求。
附图说明
图1是本发明拾取方法的流程示意图;
(a)采用RBO关联FBO读取几何图元ID方式拾取图元的流程示意图;
(b)采用FBO绑定为纹理并进行纹理查询方式拾取图元的流程示意图;
图2是GPU可编程绘制图形流水示意图;
图3是本发明几何图元ID及其属性编码示意图;
图4是硬件加速的拾取框架FBO示意图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步详细描述:
首先,参考图1,将附带几何图元ID编码的三维图形绘制到图形处理器GPU上的离屏缓冲区FBO中,在FBO中像素位置与三维图形经正常模式绘制得到图像结果中的像素位置一一对应,具体由以下器件完成(如图2所示):
可编程顶点处理器(Vertex Processor)主要完成顶点的坐标变换,处理几何变形,以及产生一些特殊的雾化效果或镜头效果,设计人员可以通过编写代码设计自己需要的坐标系变换和光照效果。
可编程片元处理器(Fragment Processor)功能相对更加强大。每个片元是光栅化后具有屏幕坐标的元素,并且包含插值后的颜色值、深度值、一个或多个纹理坐标。片元处理器在光栅化以后进行纹理采样、颜色混合、光照明计算等一系列操作。经过一系列的设置和变换,每个片元将修改帧缓存中对应位置的像素值。
可编程几何处理器(Geometry Processor)就是专门用来处理场景中的几何图形。在过去Vertex Shader每一次运行只能处理一个顶点的数据,并且每次只能输出一个顶点的结果。在整个游戏场景中,绘制的几何图形的任务量是非常庞大的,如果仅仅依靠VertexShader来完成,处理场景的效率会很低下。并且如大爆炸,粒子效果,瀑布流水等复杂的场景都很难逼真的表现出来。现在DX10的设计师们在顶点与像素的处理过程中又加入了几何着色器(Geometry shader)。它可以根据顶点的信息来批量处理几何图形。几何着色器可以将点、线、三角形等基本的构图元素连接起来,创造出新的多边形。快速的将这些处理结果传递给其他着色器或显存,并且这个过程无需处理器参与。在显卡的工作流水线中几何着色器工作在顶点与像素着色器之间。当显卡中的顶点着色单元生成顶点信息之后,就会将这些结果交给几何着色器来构成更为复杂的几何图形,最后交由像素着色器来为这些几何图形添加各种材质。
该步骤中,图形的绘制不需要附带几何顶点的法向,纹理坐标,材质属性等多余信息,唯一需要的是色彩信息。而色彩信息只是一种载体,色彩信息包含的是所需绘制的几何图元的唯一表示性ID。几何图元多种多样,可以分为物体实体,体,面,线,点五类属性。对图元ID需要表示成图形绘制时图形系统的标准输入信息,因此采用通用的RGBA色彩表示模型非常方便,图元ID的RGBA编码如图3所示。采用RGBA的图元ID编码方式,A的低字节的k位作为几何图元属性的编码(标识实体、点、线、面、体等,一般取2-3位),对几何图元属性的编码作为一级编码,而几何图元ID的编码占据了32-k位,因此可以标识的几何图元的数目是2(32-k)。当k取2时,所能表示的图元数目就达到了百万级,对单个几何图元的编码作为二级编码。在编码方式中,R字节保存ID的最低位字节,G字节保存ID的次低位,而B字节保存ID的高位,A字节的空余高位则保存ID的最高位。解码时则依次按字节运算解出图元的ID来。
GPU提供的FBO(Frame Buffer Object)技术在opengl1.5版本的扩展上实现(EXT_framebuffer_object),它允许将一个离屏缓冲区作为渲染运算的目标。即将帧缓冲区中将要绘制的几何元素(点,线,面或实体)的索引信息绘制到一个与屏幕一一对应的离屏缓冲区中(Frame Buffer Object),当需要获得当前鼠标热点所选择的几何元素时,只需要获得FBO中保存的该像素所对应的色彩信息并解码转换为ID索引信息,就可以快速地得到当前鼠标所选择的几何元素。本发明避免了OpenGL的选择与拾取机制中繁杂的命名堆栈操作,提高了应用程序的交互效率。FBO的示意图如图4所示。
上述绘制为虚拟绘图,绘制目标为GPU上的FBO。FBO对于使用者是不可见的,绘制的结果为与真实图形元素位置一一对应的图元的唯一标识ID。在FBO中保存的绘制结果与三维图形经正常模式绘制得到图像结果中的像素位置一一对应,但其色彩信息蕴含的是图元的ID信息。
图形拾取方式包括:单体拾取和块拾取两种方式。读取鼠标指定位置的FBO内保存的几何图元ID,拾取到命中的图元后,通过RBO关联FBO读取几何图元ID或者FBO绑定为纹理并进行纹理查询两种方式,就可以快速地得到当前鼠标热点所选择的几何图元,或者鼠标选择框内的几何图元集合。
接下来进行第二次绘制,该绘制采用正常绘制模式,绘制目标为帧缓存,所绘图形为系统给使用者看到的真实图形。由于本发明采用了两种方式拾取几何图元ID,故绘制真实图形的方法也有两种:一、如通过FBO与可读取的RBO建立关联,读取鼠标光标指定位置RBO内保存的几何图元ID,拾取到命中的单个图元,则按照正常模式绘制三维图形,区分显示被选中和未被选中的几何图元,被选中图元以突出方式显示;二、如FBO中的图像被绑定为一幅纹理,则按照正常模式绘制真实图形,在GPU的几何处理器和片元处理器中对每个几何图元进行处理,其中,片元处理器中对输入每个几何图元光栅化之后的片元和当前框选区域;比较当前片元是否位于框选区域之内,若在区域之内,则表示当前片元所对应的几何图元被命中,以片元所处的二维坐标作为纹理参数查找ID纹理,并将得到的ID纹理值进行解码得到真正被选中图元的ID值;当前被选中图元的片元突出显示,并返回图元的ID值。即通过纹理查找的方式获得当前框选区域的命中几何图元,并区分显示被选中和未被选中的几何图元,被选中图元以突出方式显示。从而实现了利用GPU(图形处理芯片)提供的高级特性FBO,通过有效的几何图元的ID多级编码,在GPU上进行海量图元的快速选择和拾取。
在本发明中,渲染速度是交互式3D应用程序关注的主要问题之一。当面对大量的需要拾取的几何图元时,需要采取一种快速的绘制策略,以便将快速拾取物体并将物体快速地绘制到帧缓存和屏幕上。同时考虑到将来对模型交互形变的过程中,模型的几何信息会不断改变,因此需要不断的重新组织模型绘制到帧缓存中。
为了加速重绘拾取方法的绘制过程,对于几何图元数据,采用GPU提供的VBO技术(Vertex Buffer Object),VBO将几何图元组织成易于GPU高速访问的数组形式,保存在GPU一端的显存中,数据保存成VBO后能较为显著地减少由CPU到GPU的数据传输时间。而色彩信息作为几何相关的属性信息,也可以保存为VBO形式,因此我们将几何图元ID编码之后的作为色彩属性保存在VBO之中也提高了拾取的效率。绘制时采用的是图元数组批处理的绘制方式。在绘制网格模型时,需要针对用户的要求绘制模型的点模式、线框模式、面模式、体模式或者实体模式进行选择。
另外,本发明几何图元的ID编码既可以表示成RGBA的色彩信息形式,也可以编码为法向或者纹理坐标等多种形式。
此外,三维几何图元的拾取方法也同样适用于二维几何图元。
本发明可应用到需要交互操作的各种几何模型造型系统中,尤其适合基于GPU的细分曲面特征构造方法,能够帮助用户在曲面上快速交互构造精细特征。方便的几何图元的拾取和交互控制可以辅助用户进行三维模型的交互设计和修改,提高交互的效率。能够处理海量几何图元的GPU拾取方法在包含大量精细表面特征的几何特征造型系统中可以节省交互的时间。整套方法在CAD特征造型,以及动画造型,复杂虚拟环境的人机交互等方面有很好的应用前景。
以上通过详细实施例描述了本发明所提供的方法,本领域的技术人员应当理解,在不脱离本发明实质的范围内,可以对本发明做一定的变形或修改。