本发明属于数字医学、精准医疗、计算机图形学领域,尤其涉及一种基于opengl的病灶区域的可视化方法和系统。
背景技术:
“微创化”是骨科手术发展的必然趋势,如何使微创手术“精准化”是目前亟待解决的问题。随着虚拟现实技术的不断发展,将其应用至医学领域,尤其是骨科微创领域,越来越受到人们的广泛关注。利用虚拟现实技术可以突破空间的束缚,将患者的病灶区域全方位无死角地展现给术者,从根本上解决骨科微创手术非直观、定位不准确等问题。
骨科微创手术中,病灶区域的模型复杂,比如周围存在大量神经的腰椎模型、需多个不同角度照射x光才可观察到全貌的股骨头模型等,但术者受限于狭窄的视野范围,无法全面地掌握病灶周围情况,给手术带来困难和风险。
骨科微创手术相较于其他手术,病灶区域附近形变较小,可近似为刚体,模型渲染结果更具有真实性和可靠性。
opengl能够实现数据模型的变换、纹理、交互操作等,因此,将三维建模软件输出的模型文件或其他模型文件或数据,在opengl中进行“加工”,可以更好地解决实际问题,例如渲染、实时显示等。
通常,模型数据包括一系列的树节点,每个树节点包含了场景对象中所储存数据的索引,每个树节点都可以有任意数量的子树节点。一个网格对象本身包含了渲染所需要的所有相关数据,如顶点、法向量、纹理坐标、面和材质等。一个网格包含了多个面,一个面包含了组成图元的顶点索引。由于顶点数据和顶点索引是分开的,使用一个索引缓冲来渲染是非常方便的。之后,可以根据场景的结构,读取场景对象中的数据并绘制模型。
我们绘制的实体对象由很多三角形组成的,图形绘制管线分为三个主要阶段:应用程序阶段、几何阶段、光栅阶段。
(1)应用程序阶段:
主要和cpu、内存进行交互,在此阶段有碰撞检测、场景图建立、空间八叉树更新、视锥剪裁等。几何体数据(顶点坐标、法向量、纹理坐标、纹理等)这些信息会通过数据总线传送到图形硬件数据总线规范了一个大的集成应用系统中同构系统、异构系统等方面进行数据共享和交换实现方法。
(2)几何阶段:
顶点坐标变换、光照、剪裁、投影、屏幕映射均在gpu进行运算(顶点着色器就在此阶段执行)
该阶段的末端会得到经过变换和投影之后的顶点坐标、颜色、纹理坐标,这些数据将作为光栅化阶段的输入进一步处理。
(3)光栅阶段:
光栅化:决定哪些像素被集合图元覆盖的过程(其实就是将图元拆分成多个片段的过程,图元是由几个点组成的点、线、面)
例如:面形状的图元最少3个点(a、b、c三个点)即可组成,那么屏幕是由众多个像素点组成的,那abc三个点围成的三角形中有多少个像素点呢?那么其实光栅化就是用来分解图元得到这些像素点的过程,当然这其中还有一个重要的过程就是插值,插值出那个图形区域的像素(纹理坐标v_texcoord、颜色等信息)。注意,此时的像素并不是屏幕上的像素,是不带有颜色的。接下来,片段着色器完成上色的工作。
现有的多边形模型细分及表示方法,如:bsp树、k-d树、八叉树等,在表示患者病灶区域时会产生诸多问题:当患者病灶区域模型中的多边形位于细分平面的细分边界上时,需要将多边形拆分成多个细小的三角形,以产生不相交的边界体积对象,这会导致产生数值问题和渲染负荷增加,实时显示延迟较大。
技术实现要素:
针对现有技术的不足,本发明提出一种利用opengl的病灶区域的可视化方法和系统,以实现病患部位的实时渲染和显示。
为实现上述目的,本发明通过以下技术方案予以实现。
一种基于opengl的病灶区域的可视化方法,该方法包括以下步骤:
s1、接收病灶区域的模型数据,构建n元空间细分树,其中,树的叶子节点记录所述多边形模型数据的几何信息,树的树节点记录所述树节点包含的叶子节点对应的边界体积对象;并标记叶子节点和树的树节点的属性为不可见;
s2、遍历所述n元空间细分树,将位于视图视锥内的所述n元空间细分树的树节点和叶子节点标记为潜在可见;
s3、将步骤s2中得到的标记为潜在可见的树节点和叶子节点映射到opengl帧缓冲区,判断被遮挡的树节点,并将所述被遮挡的树节点标记为不可见。
s4、计算步骤s3中标记为潜在可见的树节点的自适应遮挡系数,将所述自适应遮挡系数小于预设的阈值的树节点标记为不可见,并对剩余的树节点进行渲染,并显示在显示装置中。
较佳地,所述病灶区域的模型数据为ct扫描病灶区域后形成的obj格式的多边形模型数据。
较佳地,构建n元空间细分树包括以下步骤:
s11、设置最大递归深度、细分因子和细分份数;
s12、获取模型数据的最大尺寸,并以此尺寸建立初始边界体积对象,作为n元空间细分树的根节点(相当于第一层树节点);
s13、将模型数据中的顶点放入能被包含且没有子节点的边界体积对象中,即该边界体积对象包含该节点,“没有子节点”相当于该边界体积对象还没有被细分为子边界体积对象)
s14、若没有达到最大递归深度,则将所述边界体积对象按细分份数拆分为多个子边界体积对象,用边界体积对象对应的树节点的子节点表示子边界体积对象,并将所述边界体积对象中的模型顶点分配给所述多个子边界体积对象;
s15、若子边界体积对象所分配到的模型顶点数量不为零且跟父边界体积对象是一样的,则该子边界体积对象停止拆分,用叶子节点表示模型的各个顶点;若相邻的子边界体积对象中的模型顶点最远距离小于子边界体积对象边长乘以细分因子之积,则将相邻的子边界体积对象合并,并将对应的树节点及叶子节点分别合并;
s16、重复步骤s13-s15,直到达到最大递归深度。
较佳地,所述步骤s2包括以下步骤:
s21、根据显示装置的屏幕边界,计算视图视锥的方向和深度;
s22、对n元空间细分树自顶向下遍历,利用opengl选择模式判断树节点对应的边界体积对象是否进入视锥;如果所述边界体积对象完全位于视图视锥中,则将边界体积对象的所有子树节点标记为潜在可见。
较佳地,所述步骤s3包括以下步骤:
s31、将n元空间细分树中的标记为潜在可见的树节点对应的边界体积对象送入opengl渲染管线,并在扫描时将所述边界体积对象转换为三角形;
s32、使用opengl的z缓冲区对所述三角形进行测试,然后将输出重定向到opengl的虚拟遮挡缓冲区;
s33、在虚拟遮挡缓冲区中采样读取像素点,判断三角形是否被遮挡,从而判定树节点是否被遮挡,并将被遮挡的树节点标记为不可见。
较佳地,所述步骤4中自适应遮挡系数的计算方法为:
其中sizeof2dboundingbox(obj)表示边界体积对象投影在屏幕上的像素数,sizeofviewplane表示视图平面像素数,dist(eye)表示视图平面与视点之间的距离,dist(obj)表示边界体积对象与视图平面之间的最小距离。
一种基于opengl的病灶区域的可视化系统,该系统包括:
预处理模块,用于接收病灶区域的模型数据,构建n元空间细分树,其中,树的叶子节点记录所述多边形模型数据的几何信息,树的树节点记录所述树节点包含的叶子节点对应的边界体积对象;并标记叶子节点和树的树节点的属性为不可见;
视锥剔除模块,用于接收所述预处理模块传送的n元空间细分树,然后遍历所述n元空间细分树,将位于视图视锥内的所述n元空间细分树的树节点和叶子节点标记为潜在可见;
遮挡剔除模块,用于接收所述视锥剔除模块传送的标记为潜在可见的树节点和叶子节点,并将所述标记为潜在可见的树节点和叶子节点映射到opengl帧缓冲区,然后判断树节点是否被遮挡,并将被遮挡的树节点标记为不可见;
自适应剔除模块,用于接收所述遮挡剔除模块传送的标记为潜在可见的树节点,并计算所述标记为潜在可见的树节点的自适应遮挡系数,将所述自适应遮挡系数小于预设的阈值的树节点标记为不可见;并对所述标记为潜在可见的树节点进行渲染,并显示在显示装置中。
较佳地,所述预处理模块中所述病灶区域的模型数据为ct扫描病灶区域后形成的obj格式的多边形模型数据。
较佳地,所述预处理模块中构建n元空间细分树包括以下步骤:
s11、设置最大递归深度、细分因子和细分份数;
s12、获取模型数据的最大尺寸,并以此尺寸建立初始边界体积对象,作为n元空间细分树的根节点(相当于第一层树节点);
s13、将模型数据中的顶点放入能被包含且没有子节点的边界体积对象中,即该边界体积对象包含该节点,“没有子节点”相当于该边界体积对象还没有被细分为子边界体积对象;
s14、若没有达到最大递归深度,则将所述边界体积对象按细分份数拆分为多个子边界体积对象,用边界体积对象对应的树节点的子节点表示子边界体积对象,并将所述边界体积对象中的模型顶点分配给所述多个子边界体积对象;
s15、若子边界体积对象所分配到的模型顶点数量不为零且跟父边界体积对象是一样的,则该子边界体积对象停止拆分,用叶子节点表示模型的各个顶点;若相邻的子边界体积对象中的模型顶点最远距离小于子边界体积对象边长乘以细分因子之积,则将相邻的子边界体积对象合并,并将对应的树节点及叶子节点分别合并;
s16、重复步骤s13-s15,直到达到最大递归深度。
较佳地,所述视锥剔除模块包括:视锥获取单元,用于根据显示装置的屏幕边界,计算视图视锥的方向和深度;遍历单元,用于对n元空间细分树自顶向下遍历,利用opengl选择模式判断树节点对应的边界体积对象是否进入视锥;如果所述边界体积对象完全位于视图视锥中,则将边界体积对象的所有子树节点标记为潜在可见。
较佳地,所述遮挡剔除模块包括:管线扫描单元,用于将n元空间细分树中的标记为潜在可见的树节点对应的边界体积对象送入opengl渲染管线,并在扫描时将所述边界体积对象转换为三角形面片;测试单元,用于使用opengl的z缓冲区对管线扫描单元传送的三角形面片进行测试,然后将输出的像素点重定向到opengl的虚拟遮挡缓冲区;剔除单元,用于在虚拟遮挡缓冲区中对所述测试单元传送的像素点进行采样,判断三角形面片是否被遮挡,从而判定树节点是否被遮挡,并将被遮挡的树节点标记为不可见。
较佳地,所述自适应剔除模块中自适应遮挡系数的计算方法为:
其中sizeof2dboundingbox(obj)表示边界体积对象投影在屏幕上的像素数,sizeofviewplane表示视图平面像素数,dist(eye)表示视图平面与视点之间的距离,dist(obj)表示边界体积对象与视图平面之间的最小距离。
本发明与现有技术相比的优点在于:
1、可移植性:基于基本的opengl功能实现核心算法,不需要如纹理映射或特殊的遮挡查找等硬件支持;
2、自适应性:针对不同的计算机cpu性能和渲染需求,为剔除和渲染方法提供一种自适应的平衡方案。
3.利用基于opengl的病灶区域模型可视化方法和系统,在nvidiageforcertx2060显卡上可以达到实时渲染每秒83帧,相较于其他方法渲染帧率提高40%以上,可以在手术中实时完成病灶区域模型的渲染,将患者病灶区域情况实时展现出来。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1:根据本发明的一个实施例的基于opengl的病灶区域的可视化方法的流程图;
图2:根据本发明的一个实施例的n元空间细分树的状态变化示意图;
图3:根据本发明的一个实施例的n元空间细分树构建流程图;
图4:根据本发明的一个实施例的虚拟遮挡缓冲区采样读取示意图;
图5:根据本发明的一个实施例的患者腰椎模型实时渲染效果图;
图6:根据本发明的一个实施例的患者足部模型实时渲染效果图;
图7:根据本发明的一个实施例的基于opengl的病灶区域的可视化系统的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清查、完整的描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明提供的基于opengl的病灶区域的可视化方法,包括如下步骤:
s1、数据预处理。首先接收病灶区域的模型数据,构建n元空间细分树,其中,树的叶子节点记录所述多边形模型数据的几何信息,树的树节点记录所述树节点包含的叶子节点对应的边界体积对象;并标记叶子节点和树的树节点的属性为不可见。
病灶区域ct扫描重建可以得到obj格式的多边形模型数据,包括顶点坐标和顶点的连接关系。通过这些数据可以构建三维模型并显示。
n元空间细分树是本发明创造性之一,其叶子节点的数量与模型数据的点对应,树的叶子节点包含病灶区域模型中各顶点的位置及顶点间连接关系等几何信息,树节点包含该树节点下所有子树的边界体积对象,边界体积对象包含子树的所有顶点及顶点间连接关系,用来表示模型中顶点所占空间。树的节点自顶向下递归细分所得,树中节点含有其子树所有节点所占空间之和的信息。n元空间细分树的结构与八叉树等边界体积对象表示方法类似,但不同的是,n元空间细分树没有固定的子节点个数限制,树中同级节点无需强制限制其不相连。因此,延伸到另一个细分节点的边界体积对象中的多边形连接关系,无需被拆分成两个或多个较小的三角形连接关系;取而代之的是,此类具有多边形连接关系的边界体积对象与另一个树中节点代表的边界体积对象重叠,从而形成相交的区域细分。与大多数标准的细分树(如bsp树等)相比,它的细分不是精确的细分,n元空间细分树的同级树节点可能相交,防止产生大量细小的多边形碎片,避免导致产生数值问题和渲染负荷增加,也正是基于此,本发明的可视化方法具有运行速度快,实时显示延迟小的特点。
如图2所示,为n元空间细分树在不同步骤中的变化状态图。
在将模型数据转化为n元空间细分树后,将所有树节点和叶子节点都设置为不可见。
如图3所示,建立n元空间细分树包括如下步骤:
s11、设置最大递归深度、细分因子和细分份数;
s12、获取模型数据的最大尺寸,并以此尺寸建立初始边界体积对象,作为n元空间细分树的根节点(相当于第一层树节点);
s13、将模型数据中的顶点放入能被包含且没有子节点的边界体积对象中,即该边界体积对象包含该节点,“没有子节点”相当于该边界体积对象还没有被细分为子边界体积对象)
s14、若没有达到最大递归深度,则将所述边界体积对象按细分份数拆分为多个子边界体积对象,用边界体积对象对应的树节点的子节点表示子边界体积对象,并将所述边界体积对象中的模型顶点分配给所述多个子边界体积对象;
s15、若子边界体积对象所分配到的模型顶点数量不为零且跟父边界体积对象是一样的,则该子边界体积对象停止拆分,用叶子节点表示模型的各个顶点;若相邻的子边界体积对象中的模型顶点最远距离小于子边界体积对象边长乘以细分因子之积,则将相邻的子边界体积对象合并,并将对应的树节点及叶子节点分别合并;
s16、重复步骤s13-s15,直到达到最大递归深度。
使用n元空间细分树作为细分表现形式,以将任何给定的模型数据存储在树中,而无需重新构造重叠的多边形。对于在某一方向上有大范围延伸的模型,构造的树可能偏向一方,这时可以用常规的方法将边界体积对象细分为较小的多边形以保证树的平衡性。
s2、视锥剔除,即遍历n元空间细分树,将位于视图视锥内的n元空间细分树的树节点和叶子节点标记为潜在可见。
具体包括如下步骤:
(1)根据当前用于显示病灶区域的屏幕的边界,计算视图视锥的方向和深度。
(2)自顶向下对n元空间细分树的每个标记为潜在可见的树节点进行递归检测和筛选,即利用opengl选择模式检测树节点,也就是检测树节点对应的边界体积对象是否在视锥当中(即用opengl的选择模式来检测边界体积对象是否进入视锥),如果边界体积对象与视图视锥相交,利用opengl选择模式对边界体积对象进行测试,判断其是否完全位于视图视锥当中。若位于视图视锥中,则将边界体积对象所代表的所有子树标记为潜在可见;否则,则继续递归测试边界体积对象层次结构的所有子节点。这一步骤,也就是根据视锥对边界体积对象进行剪裁,即裁剪边界体积对象中的顶点和顶点间的连接关系,在不影响帧缓冲区的情况下得到潜在可见树节点。
s3、遮挡剔除,即将步骤s2中得到的标记为潜在可见的树节点和叶子节点映射到opengl帧缓冲区,判断被遮挡的树节点,并将所述被遮挡的树节点标记为不可见。这一步骤检测边界体积对象对帧缓冲区的可能影响(渲染的话,就会影响,否则不影响),最终确定被遮挡的边界体积对象。
具体步骤如下:
(1)将n元空间细分树中的标记为潜在可见的树节点对应的边界体积对象送入opengl渲染管线,并在扫描时将所述边界体积对象转换为三角形面片;
(2)使用opengl的z缓冲区对三角形面片进行测试。被遮挡的边界体积对象不会对z缓冲区造成影响,因此不会在虚拟遮挡缓冲区中留下任何痕迹。通过z缓冲区测试,可以得知哪些三角形面片被遮挡,并标记出来。
(3)将z缓冲区输出的像素点重定向到opengl的虚拟遮挡缓冲区。
(4)在虚拟遮挡缓冲区中采样读取重定向过来的像素点,如图4所示,即每隔固定距离抽样读取像素点,判断边界体积对象是否对虚拟遮挡缓冲区造成影响(即虚拟遮挡缓冲区的图像是否变化),若未造成任何影响,则该边界体积对象可判定为被遮挡,标记对应的树节点为不可见。
在视角移动期间,选取适当的采样率进行采样操作可以降低遮挡剔除的时间空间消耗。当视角移动停止的时候,将逐步读取虚拟遮挡缓冲区,直到虚拟遮挡缓冲区上所有重定向过来的像素点数据测试完成,此时模型中所有边界体积对象遮挡标记完成。
s4、自适应遮挡剔除,即计算步骤s3中标记为潜在可见的树节点的自适应遮挡系数,将所述自适应遮挡系数小于预设的阈值的树节点标记为不可见,并对剩余的(也就是标记为潜在可见的)树节点进行渲染,并显示在显示装置中。
对于有深度可见性的复杂模型,许多几乎完全被遮挡的边界体积对象对最终屏幕呈现的图像仅仅贡献了几个像素点,这样的边界体积对象需要剔除,以优化渲染速率。例如,只有1%内容显示,如果将其剔除,可以加快渲染速率,而且不影响渲染显示效果。
具体方法为:计算每个边界体积对象在虚拟遮挡缓冲区上的覆盖区域个数。考察边界体积对象所在视锥里的深度、视锥中的视图平面所占据的二维边界大小以及缓冲区覆盖区数量,即计算覆盖区相对对象深度和大小的百分比。
其中sizeof2dboundingbox(obj)表示边界体积对象投影在显示屏幕上的像素数,sizeofviewplane表示视图平面像素数,dist(eye)表示视图平面与视点之间的距离,dist(obj)表示边界体积对象与视图平面之间的最小距离。
对于每个潜在可见的边界体积对象,评估其自适应遮挡系数adapcull(obj)的大小,若adapcull(obj)小于用户定义的阈值,例如将阈值设定为0.5,则所有adapcull(obj)小于0.5的边界体积对象标记为不可见。
通过上述的4个步骤,最后对n元空间细分树标记为潜在可见的树节点和叶子节点进行渲染,并显示在显示装置中。例如,图5所示为患者腰椎的实时渲染效果图,图6所示为患者足部的实时渲染效果图。从图5和图6可以看出,患者模型依照上述步骤所得最终渲染效果具有较高的真实性。而且,在nvidiageforcertx2060显卡上可以达到实时渲染每秒83帧,相较于其他方法渲染帧率提高40%以上,实时显示的速度、效果都非常理想。
根据本发明的另一方面,提出一种基于opengl的病灶区域的可视化系统,如图7所示,包括:预处理模块,用于接收病灶区域的模型数据,构建n元空间细分树,其中,树的叶子节点记录所述多边形模型数据的几何信息,树的树节点记录所述树节点包含的叶子节点对应的边界体积对象;并标记叶子节点和树的树节点的属性为不可见;视锥剔除模块,用于接收所述预处理模块传送的n元空间细分树,然后遍历所述n元空间细分树,将位于视图视锥内的所述n元空间细分树的树节点和叶子节点标记为潜在可见;遮挡剔除模块,用于接收所述视锥剔除模块传送的标记为潜在可见的树节点和叶子节点,并将所述标记为潜在可见的树节点和叶子节点映射到opengl帧缓冲区,然后判断树节点是否被遮挡,并将被遮挡的树节点标记为不可见;自适应剔除模块,用于接收所述遮挡剔除模块传送的标记为潜在可见的树节点,并计算所述标记为潜在可见的树节点的自适应遮挡系数,将所述自适应遮挡系数小于预设的阈值的树节点标记为不可见;并对所述标记为潜在可见的树节点进行渲染,并显示在显示装置中。
预处理模块中所述病灶区域的模型数据为ct扫描病灶区域后形成的obj格式的多边形模型数据。
预处理模块中构建n元空间细分树包括以下步骤:
s11、设置最大递归深度、细分因子和细分份数;
s12、获取模型数据的最大尺寸,并以此尺寸建立初始边界体积对象,作为n元空间细分树的根节点(相当于第一层树节点);
s13、将模型数据中的顶点放入能被包含且没有子节点的边界体积对象中,即该边界体积对象包含该节点,“没有子节点”相当于该边界体积对象还没有被细分为子边界体积对象)
s14、若没有达到最大递归深度,则将所述边界体积对象按细分份数拆分为多个子边界体积对象,用边界体积对象对应的树节点的子节点表示子边界体积对象,并将所述边界体积对象中的模型顶点分配给所述多个子边界体积对象;
s15、若子边界体积对象所分配到的模型顶点数量不为零且跟父边界体积对象是一样的,则该子边界体积对象停止拆分,用叶子节点表示模型的各个顶点;若相邻的子边界体积对象中的模型顶点最远距离小于子边界体积对象边长乘以细分因子之积,则将相邻的子边界体积对象合并,并将对应的树节点及叶子节点分别合并;
s16、重复步骤s13-s15,直到达到最大递归深度。
视锥剔除模块包括:视锥获取单元,用于根据显示装置的屏幕边界,计算视图视锥的方向和深度;
遍历单元,用于自顶向下对n元空间细分树的每个标记为潜在可见的树节点进行递归检测和筛选,即利用opengl选择模式检测树节点,也就是检测树节点对应的边界体积对象是否在视锥当中(即用opengl的选择模式来检测边界体积对象是否进入视锥),如果边界体积对象与视图视锥相交,利用opengl选择模式对边界体积对象进行测试,判断其是否完全位于视图视锥当中。若位于视图视锥中,则将边界体积对象所代表的所有子树标记为潜在可见;否则,则继续递归测试边界体积对象层次结构的所有子节点。如果所述边界体积对象完全位于视图视锥中,则将边界体积对象的所有子树节点标记为潜在可见。遍历单元的作用是根据视图视锥对边界体积对象进行剪裁,获得潜在可见的树节点,即根据视锥对边界体积对象,裁剪边界体积对象中的顶点和顶点间的连接关系,在不影响帧缓冲区的情况下得到潜在可见树节点。
遮挡剔除模块包括:管线扫描单元,用于将n元空间细分树中的标记为潜在可见的树节点对应的边界体积对象送入opengl渲染管线,并在扫描时将所述边界体积对象转换为三角形面片;
测试单元,用于使用opengl的z缓冲区对管线扫描单元传送的三角形面片进行测试,然后将输出的像素点重定向到opengl的虚拟遮挡缓冲区;使用opengl的z缓冲区对三角形面片进行测试时,被遮挡的边界体积对象不会对z缓冲区造成影响,因此不会在虚拟遮挡缓冲区中留下任何痕迹。通过z缓冲区测试,可以得知哪些三角形面片被遮挡,并标记出来。
剔除单元,用于在虚拟遮挡缓冲区中对所述测试单元传送的像素点进行采样,判断三角形面片是否被遮挡,从而判定树节点是否被遮挡,并将被遮挡的树节点标记为不可见。具体说,每隔固定距离抽样读取像素点,判断边界体积对象是否对虚拟遮挡缓冲区造成影响(即虚拟遮挡缓冲区的图像是否变化),若未造成任何影响,则该边界体积对象可判定为被遮挡,标记对应的树节点为不可见。
在视角移动期间,选取适当的采样率进行采样操作可以降低遮挡剔除的时间空间消耗。当视角移动停止的时候,将逐步读取虚拟遮挡缓冲区,直到虚拟遮挡缓冲区上所有重定向过来的像素点数据测试完成,此时模型中所有边界体积对象遮挡标记完成。
自适应剔除模块,用于计算剔除单元传送的标记为潜在可见的树节点的自适应遮挡系数,将所述自适应遮挡系数小于预设的阈值的树节点标记为不可见;并对标记为潜在可见的树节点进行渲染,并显示在显示装置中。
对于有深度可见性的复杂模型,许多几乎完全被遮挡的边界体积对象对最终屏幕呈现的图像仅仅贡献了几个像素点,这样的边界体积对象需要剔除,以优化渲染速率。例如,只有1%内容显示,如果将其剔除,可以加快渲染速率,而且不影响渲染显示效果。
自适应遮挡系数的计算方法为:
其中sizeof2dboundingbox(obj)表示边界体积对象投影在屏幕上的像素数,sizeofviewplane表示视图平面像素数,dist(eye)表示视图平面与视点之间的距离,dist(obj)表示边界体积对象与视图平面之间的最小距离。
本发明未详细阐述的技术内容属于本领域技术人员的公知技术。
尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。