首页> 中国专利> 在高深度复杂性场景中绘制透明面的系统和方法

在高深度复杂性场景中绘制透明面的系统和方法

摘要

描述了用于绘制包括透明面的三维场景的系统、方法和计算机可读存储介质,包括用于利用场景几何体中的部分排序来有效绘制透明面的两种技术。第一技术(混合型层剥离)可以通过有效的方式结合未排序网格与已排序网格,并且可以适于绘制诸如具有嵌入式透明网格的体的场景。第二技术(连贯层剥离)可以在一次迭代中针对给定的像素有效地检测和绘制正确排序的分段序列,这允许少于传统深度剥离的通过次数。可以执行对场景中一些或者全部面的预排序和/或周期排序,但是可以不需要完全排序。该方法可以通过硬件、软件或其组合来实现,诸如通过在一个或多个CPU和/或GPU上可执行的程序指令来实现。

著录项

  • 公开/公告号CN101609562A

    专利类型发明专利

  • 公开/公告日2009-12-23

    原文格式PDF

  • 申请/专利权人 奥多比公司;

    申请/专利号CN200910003946.2

  • 发明设计人 N·A·卡尔;G·S·P·米勒;R·米克;

    申请日2009-01-23

  • 分类号G06T15/00(20060101);

  • 代理机构11256 北京市金杜律师事务所;

  • 代理人吴立明

  • 地址 美国加利福尼亚州

  • 入库时间 2023-12-17 23:10:12

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2013-08-21

    授权

    授权

  • 2010-02-17

    实质审查的生效

    实质审查的生效

  • 2009-12-23

    公开

    公开

说明书

优先权信息

本申请要求2008年1月23日提交的美国临时申请No.61/022,897 的优先权,在此通过引用并入其全部内容。

背景技术

透明面的有效绘制一直以来都是计算机图形学中的一个问题。在 绘制包括半透明面的3D场景时,由图形学硬件执行的典型方法是光 栅化方案,其中每个三角形被描绘投影到相机平面,并依次被描绘到 屏幕。在这些系统中,称为z缓冲区(z-buffer)的结构针对屏幕上的 每个像素来跟踪在该像素处最接近相机的面。如果所有三角形都是不 透明的,则在描绘新三角形(或者描绘新三角形的一部分)或者其距 离观察者较近时,z缓冲区将仅通过替换像素来解决遮挡问题。在绘 制不透明几何体时,对每个三角形进行光栅化,并依次将其转换为像 素颜色和深度,并且z缓冲区测试确保在每个像素处显示最近的面颜 色。因此,被其他三角形所遮挡或者隐藏的三角形将是不可见的,并 且只有那些可见的面出现在屏幕上。对于经过z缓冲的不透明几何体, 无需按深度对三角形排序。然而,对于包括半透明面的场景,不能直 接使用z缓冲,因为排序是有影响的。不能以任何随意的顺序提交三 角形。

多年前开发了一种用于这种绘制的简单解决方案,一种称为“画 家算法”的技术。画家算法开始于按照从相机处观察从后到前的顺序 的方式对场景中的几何体(例如,三角形和/或对象)进行排序。首先 绘制距离相机最远的面,并且在其上绘制每个后续透明层,这非常类 似于画家作画的方式。使用该方法,逐层地缓慢构建场景,直到场景 完成。使用混合(blending)模式,可以正确地刻画出透明效果。该 方法存在两个主要缺点。首先,必须将面排序为遮挡顺序,第二,在 相交处或是在排序期间出现可见性循环时,必须对三角形或者其他几 何基元进行切分。这两个问题中的后一问题可能使该过程的代价特别 高。可以将画家算法分类为用于透明面绘制的对象级方法,因为其是 通过对诸如三角形的高级基元进行排序来工作的。

备选的算法类型在像素级工作。这些算法对按照通过每个像素中 心看到的面进行排序来工作。这种像素级技术之一称为深度剥离。深 度剥离通过多次绘制几何体以积累最终结果来进行工作。绘制的每次 迭代剥离掉通过每个像素可见的单个面深度层。该核心算法相对于画 家算法的优势在于:其无需对几何基元预先排序。此外,无需对象级 透明度技术情况中的几何切分。然而,深度剥离需要的迭代次数是最 差(也即,最复杂)像素的透明深度复杂性。例如,假定通过像素看 到的n个透明面,深度剥离的最差情况算法复杂性是O(n2),因为需 要n次剥离,并且每次剥离绘制所有n个面。

随着个人计算机系统的能力和复杂性的提高,越来越多地使用称 为图形处理单元(GPU)的专用图形学绘制设备来执行图形学操作, 诸如z缓冲、深度剥离、光栅化等所需的那些图形学操作。在此使用 的术语“图形处理单元”和“图形处理器”可互换使用。GPU通常在 经由标准总线(例如,AGP或者PCI Express)耦合至主板的可移动 图形卡中使用。GPU还可以在游戏控制台中以及集成化图形解决方案 (例如,用于某些便携式计算机和廉价桌面型计算机)中使用。尽管 GPU的能力有所不同,其通常可以用来执行诸如以下任务:二维(2D) 图形数据的绘制、三维(3D)图形数据的绘制、图形用户界面(GUI) 显示元素的加速绘制以及数字视频回放。GPU可以实现一个或多个应 用程序员接口(API),该API允许程序员调用GPU的功能。

GPU可以包括用于将数字图像绘制到成像设备的各种内置及可 配置结构。数字图像可以包括光栅图形、矢量图形及其结合。光栅图 形数据(在此也称为位图)可以作为个体图片元素(称为像素)的栅 格来存储和操纵。位图可以通过其宽度和高度(以像素为单位)来表 征,也可以通过每个像素的位数来表征。通常,在RGB(红、绿、蓝) 颜色空间中定义的颜色位图对于红、绿和蓝通道中的每一个可以每个 像素包括1到8个位。阿尔法(Alpha)通道可以用来存储附加数据, 诸如每个像素的透明度值。

矢量图形数据可以作为利用几何基元构建的一个或多个几何对 象来存储和操纵。几何基元(例如,点、线、多边形、曲线和文本字 符)可以根据数学方程式来表达数字图像中的矢量图形数据的部分。 几何对象通常可以位于二维或者三维空间中。为了在基于光栅的成像 设备(例如,多数显示设备和打印机)上绘制矢量图形,通常在称为 光栅化的过程中将几何对象转换为光栅图形数据。

图形数据通常利用与用于表示这种数据的特定规范或者模型相 兼容的结构化格式来表达。不需要应用程序将每个页面描述为全分辨 率的像素阵列,相反,高层成像模型可以使应用能够按照抽象图形元 素而不是直接按照设备像素来描述包含文本、图形形状以及采样图像 的页面的出现。通常可以跨过多个计算平台来实现这种规范和模型, 以促进图形数据的交换。语言、可移植文 档格式以及成像模型例如包括用来描述复杂二维图形数据 (包括几何模型和位图化图像)的各种结构和命令。

发明内容

公开了用于在复杂三维场景中绘制透明面的系统、方法和计算机 可读存储介质的各种实施方式。在某些实施方式中,方法可以检测到 至少某些面处于正确的深度顺序(也即,正确的遮挡顺序),并且可 以利用这种情况来改进性能。例如,该方法可以包括:仅对尚未按照 顺序的深度层范围内的面执行深度剥离。可以使用诸如反向画家算法 的其他技术来处理处于正确深度顺序的面的跨距,以便在一次通过中 将其合成到最终图像中。相对于传统的深度剥离技术,该技术的使用 可以极大地改进在各种图形应用中绘制这类图像的性能,因为可以无 需在每个像素处以及针对每个深度层应用深度剥离。

在此描述的用于绘制具有顺序无关的透明度的场景的方法可以 包括基于对象的方法和基于像素的方法二者的某些最佳特征。公开了 用于透明面绘制的两个像素级技术以及多个备选变形。两种技术都是 对利用几何体中有序结构的传统深度剥离的增强。一种技术尤其可以 适用于将未排序网格与排序网格相结合。第二技术对于大部分(或者 至少部分)排序的网格集合利用给定像素处正确排序的层序列。将近 似模型空间排序与每次通过的增强剥离逻辑相结合的结合方法可以 支持用于正确绘制高深度复杂性场景的极大的性能改进。在各种实施 方式中,该技术可以在目前可用的CPU和/或图形处理单元(GPU) 上有效地实现。在其他实施方式中,该技术可以适于利用对硬件特征 的最小改动,例如可以在下代GPU上提供。

如上所述,在一些实施方式中,在此描述的方法可以包括标准深 度剥离的增强方法,其可以在面至少部分排序时更为有效地执行。该 方法可以不需要高代价的剪切或者完全排序,而该方法的性能可以取 决于对数据排序的程度。例如,在一些实施方式中,如果数据完全排 序,该方法可以在单次迭代中绘制正确的结果。另一方面,当数据反 向排序时,该方法可以类似于深度剥离,但是每次迭代可能具有稍高 的成本。

在此描述的技术可以在使用硬件、软件或其结合的各种实施方式 中。例如,在一些实施方式中,在一个或者多个处理器(例如,CPU 或者GPU)上可执行以实现该方法的程序指令可以被编码和存储在计 算机可读的存储介质上。在其他实施方式中,这种程序指令可以存储 在计算机系统的存储器中,该计算机系统包括被配置用于访问该指令 以及执行该指令以实现所述方法的一个或多个处理器。

附图说明

图1是示出了根据一个实施方式的用于执行混合型层剥离的方法 的流程图。

图2示出了根据一个实施方式的针对部分排序的面序列来确定剥 离范围。

图3是示出了根据一个实施方式的用于绘制合成透明面的方法的 流程图。

图4是示出了根据一个实施方式的用于使用GPU来绘制合成透 明面的方法的流程图。

图5是示出了根据一个实施方式的用于使用GPU来绘制合成透 明面的第二方法的流程图。

图6A-图6F是根据各种实施方式的可以应用标准深度剥离、混合 型层剥离以及连贯层剥离各种场景。

图7是示出了根据各种实施方式的标准深度剥离、混合型层剥离 以及连贯层剥离的相对性能的图表。

图8是示出了被配置用于在复杂三维场景中绘制透明面的图形处 理单元(GPU)的一个实施方式的框图。

图9是示出了被配置用于在复杂三维场景中实现绘制透明面的系 统和方法的实施方式的计算机系统的组成元件的框图。

在附图中以示例的方式示出了具体实施方式并且在此对其进行 详细描述。然而应当理解,附图及其详细描述并非意在将本发明限于 所公开的具体形式,相反,意在涵盖落入所附权利要求书限定的精神 和范围之内的所有修改、等效物以及备选方案。例如,尽管将给出的 多个算法描述为按照从前到后的方式来合成图像,该技术也可以应用 于以从后到前的方式来执行合成的层剥离机制。在一些实施方式中, 从后到前合成方案的使用可以允许支持混合模式的不同集合。

具体实施方式

以交互式速率在具有高复杂性的3D场景中正确绘制透明度可能 具有挑战性。使用在此描述的系统和方法的实施方式,可以在已有的 硬件上和/或使用图形处理单元(GPU)来有效地绘制包括顺序无关的 透明度的场景。在传统的基于对象的方法中,例如在画家算法中,通 常对面进行排序,并且按照从后到前或者从前到后的顺序来描绘面。 这种排序可能是高计算代价的,因为可能必须在每次相机位置或者场 景改变时执行它,并且当面互相穿透或者循环重叠时,其需要剪切。

画家算法可能例如不适于对空间中彼此相交的三角形进行操作。 例如,场景可以包括以45度角彼此切入的两个三角形。如果它们都 是透明的,则无法对其进行排序(例如,有时,一个在另一个之前, 反之亦然)。为了使画家算法在这种情况下正确工作,必须将三角形 沿着相交部分切分为子三角形。当沿着所有这种交线对几何体进行切 割时,产生了更多的三角形,并且算法可以将这些子三角形排序为遮 挡兼容的顺序。该方法可能是代价很高的,特别是在场景中存在数以 百万计的三角形时。指出空间中哪些三角形相交以及哪些重叠可能是 非常大的计算量。

画家算法不适用的另一种情况是面循环重叠时。例如,多个三角 形可能以如下方式布置:它们彼此在深度中循环重叠,从而使每个三 角形在连续循环中处于的每个其他三角形之前。这类似于扇形展开一 副扑克牌,并且使其转回自己之上。在这种情况下,即使三角形不能 在空间中彼此切入,也无法恰当地对其排序。

开发了称为深度剥离的算法,以试图解决这个问题。该算法在每 个像素级别处工作,类似于上文描述的包括z缓冲区的算法。该算法 尝试构建通过每个像素的面的正确排序。为了该算法的目的,从前到 后地执行合成(这不同于画家算法,其是从后到前进行操作)。为了 该算法,可以修改混合算法,以便替代地使用从前到后的排序来进行 混合,而在计算机上混合算法通常在任一方向中同样良好地工作。因 为该算法在像素级进行工作,其无需对几何体进行排序。其通过每个 像素对事物正确地排序并且进行正确的合成(每个像素级别的排序)。 注意,基于像素的方法(诸如深度剥离)通常所需的通过数据的次数 是覆盖屏幕上任何给定像素的面的最大数目,但是在这种方法中可以 不需要剪切。

下面描述传统的深度剥离。如果使用z缓冲区在绘制场景,在已 经对场景进行一次绘制之后,观察到:如观察者看到的可见的最先一 组面的深度现在是可用的。换言之,对于每个像素,在首次进入场景 之后,z缓冲区所保存的是通过屏幕中该像素的第一个面的深度值。 也即第一深度层。如果你具有该第一深度层,则可以再次绘制该场景 而排除位于该第一深度层的面(在将其“剥离”掉之后)。在该第二 次通过绘制几何体之后,z缓冲区存储下一组可见面。例如,当绘制 球体时,将看到的第一深度层将是球体的前半部分,因为其朝着相机 或者观察者突出。在下一次通过中,在将第一深度层剥离掉之后,相 机或者观察者将看到指向远离他们的球体部分(也即,后半部分)。 该算法工作良好,并且能够处理相交和重叠的三角形。通过每个像素, 每次将依次剥离掉一个深度层,以绘制场景。每次剥离掉深度层时, 如果对于该层的透明值是已知的,可以以从前到后的方式开始合成, 逐层解决场景中的透明度,每次一个。如上所述,该算法需要通过几 何体的次数与存在的深度层数一样多。例如,球体具有两个层,因为 不论如何观察球体,穿过球体的光线在两个位置与球体接触(也即, 光线总是通过两个面)。所以,为了能够得到解决,球体可以绘制两 次(因为其具有两个层)。

如上所述,深度剥离通常是代价很高的,因为其需要很多次通过, 并且如果所绘制的场景在深度上具有多个透明的层,则必须多次提交 几何体以得到正确的答案。考虑这种方法的研究者看到,这是相当低 效的。一些研究者已经提出对问题进行细分来改进性能的方法。理论 上,他们觉得他们能够降低它以接近线性时间。在一个提议中,如果 场景的深度范围是已知的,算法可以指出接近观察者的所有几何体并 对其进行剥离。例如,该算法可以对场景的深度范围的前半部分或者 深度范围的前四分之一应用深度剥离。换言之,可以针对场景来分割 深度范围。该算法可以确定哪些是距离相机或者观察者最近的面以及 哪些是最远的面,并将其聚合在一起(例如,聚合到距离观察者较近 的一个或多个面群组中,或者距离观察者较远的一个或多个面群组 中)。使用该方法,可以对第一组面执行深度剥离,继而独立地对第 二组面执行深度剥离,并将结果合成在一起。例如,如果场景中有两 个球体,一个远在另一个之后,传统的深度剥离算法可能需要四次通 过来剥离这两个球体的所有层。但是如果球体在空间中没有重叠,可 以通过第一球体执行深度剥离,并且可以独立地对第二球体执行深度 剥离,继而算法可以将这两个结果合成在一起。该方法的基本思想是 将问题细分为子问题,并且对每个子问题独立地执行深度剥离(例如, 对不同的深度范围和/或对象),并继而最终对结果进行合成以得到正 确的解决方案。注意,该方法可以应用于任意数目的深度层群组,但 是可能仍然是代价很高的,这取决于场景的总体复杂度。

在一些实施方式中,与传统的深度剥离技术以及仅仅将问题划分 为子问题的深度剥离技术相比,在此公开的系统和方法可以在绘制包 括半透明面的场景时显著地改进图形应用的性能。在此公开的方法包 括多个像素级技术,用于正确地绘制具有顺序无关的透明度的复杂场 景。可以将这些技术视为对传统深度剥离的增强,当面的流包括正确 排序的面的一个或多个连续跨距时,这些算法更为高效地运行。换言 之,该技术可以利用至少部分排序的面的存在,但是其可以不需要完 全的排序。例如,在一个实施方式中,该方法可以包括事先对对象和 /或三角形执行排序操作,从而在应用深度剥离和/或其他技术之前对 其部分排序。在该排序操作之后,在一些位置可能存在少数乱序的面 (例如,通过一些像素),但是大部分面进行了排序。在其他实施方 式中,该方法可以利用包括完全排序的面的一个或多个跨距的输入几 何体。该算法可以通过每个像素来保持跟踪这些连贯的、有序的流, 从而使其可以在单次迭代中将多个层合成在一起。换言之,在一些实 施方式中,该方法可被配置用于发现面何时处于正确的顺序和/或利用 完全排序的面的跨距。在最佳情况下,如果空间中存在正确排序的多 个几何基元,该算法将检测到其是正确排序的,并且将仅仅进行一次 迭代来产生输出图像。

在一些实施方式中,用户或者预处理操作可以在绘制几何体之前 部分地对几何体进行排序。在这种实施方式中,该方法可以不需要在 相交处切断三角形,或者说能够在循环重叠的情况下对面进行排序。 假定存在任何这种相交和重叠,排序操作可配置用于尽可能地对几何 体进行排序。在一些实施方式中(例如,如果相机不是快速移动), 可以周期性地(或者仅仅不频繁地)重复排序操作,以维护连贯性。 然而,即使面仅仅是多数(或者部分)排序,该算法也能有效地工作。 当算法检测到面的串处于正确顺序时,其可以在单次通过中应用简单 的方法(例如,反向画家算法)来将那些正确排序的面合成在一起。 当算法遇到乱序的面时,该算法可以仅对那些乱序的面应用深度剥 离。如同利用传统的深度剥离,可以在通过每个像素的每次通过中应 用该算法。换言之,对于屏幕上的每个像素,该算法可以配置用于确 定哪些面处于正确的顺序,哪些面没有,以便在单次通过中合成按序 的面,并且将乱序的面剥离掉。在一些实施方式中,该方法与传统的 深度剥离相比可以得到显著的性能改进,因为可以无需对每个像素以 及针对每个深度层来应用深度剥离。

在此描述利用场景中几何体的部分排序的、用于透明面的有效绘 制的各种技术。如上所述,一些技术可以在略微老旧的硬件上执行, 诸如目前可用的CPU和/或第一代GPU,而其他技术可能在较为现代 的图形硬件上执行时更为有效。一种称为混合型层剥离的技术可以通 过有效的方式将未排序的网格与已排序的网格相结合,并且在一些实 施方式中,其可以适于绘制诸如具有嵌入透明网格的体的场景。在各 种实施方式中,可以使用旧有的或者现代的硬件来实现混合型层剥 离。另一种称为连贯层剥离的技术可以在一次迭代中针对给定的像素 有效地检测和绘制正确排序的片段序列,对于典型的场景,这允许比 传统深度剥离更少的通过次数。在此描述连贯层剥离的多个变形,包 括可以通过较旧硬件实现的一个变形,以及当使用较为现代的硬件实 现时更为有效的另一个变形。

尽管代价比混合层剥离高出恒定的因子,在各种实施方式中,连 贯层剥离可以应用于更广泛类型的场景,包括单个网格或者网格集 合。由于其不依赖于任何完全排序的面跨距的存在,连贯层剥离可以 不需要高代价的剪切或者完全排序。然而,该方法的性能可能至少部 分地取决于数据排序的程度。如前所述,最佳情况下,在一些实施方 式中,该方法可以在一次迭代中绘制正确的透明度,由此得到O(n) 的运行时间。当数据被反向排序时,该方法的复杂性可能类似于标准 的深度剥离方法。还公开了针对理想化光栅化架构而设计的连贯层剥 离的修改形式。在各种实施方式中,这种方法即使在最坏情况下也能 够匹配深度剥离的性能,同时当正确排序的序列存在时,仍然对其加 以利用从而优于深度剥离。

如前所述,已经进行了很多研究来改进传统深度剥离的性能。在 上文概括的研究中,已经指出:在很多情况下,可以通过将问题分解 为子问题来将深度剥离的渐近复杂性降低为O(n)。例如,在一个方法 中,对象被放置在堆(heap)中,以O(n lgn)从前到后地对其有效地 排序。在该方法中,将固定的少量对象从堆中提取到集合中,以形成 批次的集合。如果每个批次的深度范围没有重叠,则对每个批次执行 传统的深度剥离,并且完成(从前到后的)合成以累积解。在重叠批 次的情况下,使用剪切平面来定义当前批次的z范围。在处理当前批 次时,还必须包括跨过该范围的任何对象(即使是不在该批次中的对 象)。如上所述,当批次彼此之间在深度上不是十分重叠时,该算法 工作良好。由于该算法不需要完全的对象级排序,可以通过线性时间 的桶排序来替代堆排序,以便针对多数场景获得O(n)的运行时间。通 过桶排序,基于z范围通过每个像素来观察面。当使用这样的方法时, 继而可以对每个z范围桶来分离地应用深度剥离。使用该方法,通常 将面置于所有z范围桶中,其是重叠的。该算法得到近似 O((n/b)b2)=O(bn)的运行时间,其中b是每个桶中的面数。当选择了大 量的桶、并且对z的线性桶排序可以对z中的数据正确排序时,该算 法取得其最佳性能。然而,在一些情况下,简单的桶排序无法有效地 对数据进行排序。例如,这可能发生大部分面放在(land)在相同桶 中时。此外,该方法需要对每个帧上的面进行桶排序。

另一个最近提出的方法包括使用图形硬件和遮挡查询扩展来执 行对象级排序。当数据可以恰当排序时,这种方法工作良好。然而, 当存在可视性循环时,仍然需要剪切来解决面排序。已经提出了对硬 件的多种扩展,以允许更为有效地处理透明面。例如,一些已经提出 了延迟流的概念,用以改进图形硬件中处理透明面的效率。

另一方法包括对到达给定像素的片段的列表及其颜色和深度进 行排序。一组研究者引入了F缓冲区的概念,其通过中间表示捕获通 过每个像素的片段流。可以在附加的通过中解决这些分段的排序。已 经描述了F缓冲器的实践硬件实现。这一概念的更为严格的形式称为 k缓冲区,其限制在每个像素处存储的片段的大小,并且为该列表提 供受限的读-修改-写操作。另一备选方案使用图形硬件已有的多采样 特征以及模板打线(stencil routing)来存储每个像素的分段列表。然 而到目前,这些扩展尚未实现,或者在消费硬件中尚未广泛应用。

不同于上面描述的一些技术,在此公开的方法可以仅需要能够绘 制到模板和浮点缓冲区中的简单的已有硬件。下面描述对高效深度剥 离问题的解决方案的详细描述,并且描述在一些实施方式中适于实践 该方法的硬件特征。此外,在此描述可以用来在已有硬件上实现该方 法的有效的基于GPU的方法的详细例子。还描述了两个备选实施方 式,一个依赖于浮点混合操作,另一个可以在理想的光栅化架构上实 现。

在各种图形学应用中,相对普遍的是具有简单排序的透明几何 体,诸如通过体数据集的切片或者屏幕对齐精灵(sprite)。然而,这 些经常会与其他网格(诸如,半透明的iso面或者治疗束)在几何上 相交。如上所述,对于完全排序的几何体,可以仅需要一遍绘制。然 而,只要场景包括重叠的未排序几何体,可以应用更为一般性的技术, 诸如深度剥离。对于高深度复杂性场景,这可能导致非常大的通过次 数。

对深度剥离的扩展可以利用如下观察:可以将方法划分为备选步 骤。该技术称为混合型层剥离,其在一些实施方式中可能是理想的, 诸如图6A中所示的场景,其中表示光束的半透明面与体分片的一般 排序栈相交。换言之,混合型层剥离可以适于应用于这样的几何体, 该几何体被划分为或者可以被划分为一组或者多组未排序的面以及 一组完全排序的面。这种方法的一个实施方式由图1的流程图示出。 在此例子中,如在100中,接收表示场景的几何体。该场景可以包括 一个或多个三维几何基元。如图1所示,如在110中,混合型层剥离 技术在一些实施方式中可以将接收到的几何体划分为已排序分段和 未排序分段。注意,在一些情况下,在各种实施方式中,几何体可以 在接收时包括一组完全排序的面和其他组未排序的面,或者该方法可 以包括在绘制场景之前对场景中三维几何基元的所有或者部分面进 行预排序或者部分预排序的操作。该方法继而可以在每一次通过中对 刻画场景的图像的所有可应用像素(也即,所有这样的像素,该像素 的值反应了该像素位置处场景中几何基元的各个面)应用混合型层剥 离。注意,图1示出了包括在混合型层剥离算法的一次通过中的预处 理操作和操作。在这一通过期间,对每个批次的每个受影响像素执行 120-140中所示的操作。如从决策块155的肯定出口到块120的反馈 循环所示,可以针对其他面重复附加的通过(其包括如120-150示出 了操作)。

在一个步骤中,如在120中,对于所有像素,该方法可以包括: 通过使用传统深度剥离将一个或多个未排序面绘制到当前剪切深度 图中来找到最近的面。在第二步骤,如在步骤130中,对于所有像素, 可以将几何体的当前剪切深度与先前剪切深度之间的已排序分段合 成到用于该图像的颜色缓冲区中。换言之,在该例子中,合成操作可 以将经过剪切的面绘制到先前剥离深度和当前剥离深度(其对应于完 全排序面的跨距)之间的z范围。如图1所示,如在140中,可以将 未排序分段(也即,如块120中所述的被剥离的那些分段)合成到颜 色缓冲区中。在此例子中,如在150中,继而可以将当前剪切深度图 复制到先前剪切深度图之中,用来定义用于后续通过的剪切z范围。 此时,已经在这次通过中对所有受影响的像素位置一起进行了处理。 如果没有更多面要剥离,如决策块155的出口退出所示,可以在160 中输出图像。例如,表示混合型层剥离技术结果的图像可以显示在屏 幕上和/或可以保存在存储器中以便进一步处理(例如,在后续通过 中)。否则,如所示,可以针对其他面来重复块120-150中所示的操 作。在此例子中,步骤的数目可以由未排序面的深度复杂性来确定。

可以使用下面的伪代码更为详细地描述混合型层剥离技术:

1:for all pixel sample locations do

2:      zPeel←zNear

3:end for

4:while gChanged=true do

5:     for all pixel sample locations do

6:              zPeelNext←zOpaque

7:     end for

8:     for all unsorted geometry fragments do

9:              if zPeel<zFragment<zPeelNext then

10:                     zPeelNext←zFragment

11:                     gChanged←true   //occlusion query

12:              end if

13:    end for

14:    for all sorted geometry fragments do

15:             if zPeel<zFragment<zPeelNext then

16:                     Composite fragment into color buffer

17:             end if

18:    end for

19:    if gChanged=true then

20:           for all non-sorted geometry fragments do

21:                    if zFragment=zPeelNext then

22:                            Composite fragment into color buffer

23:                    end if

24:           end for

25:           swap(zPeel,zPeelNext)

26:    end if

27:end while

该方法的总迭代次数可以由仅未排序几何体所需的层剥离数目 来确定,而不是由包括已排序分段在内的最坏情况像素的总体深度复 杂性来确定。在一些实施方式中,这可以得到与排序几何体的深度复 杂性成比例的渐近性能改进,在体栈的情况下,这可以非常高的。不 幸地,只有有限类别的场景可以通过混合型层剥离来加速,也就是其 中一组场景几何体被完全排序的那些场景。该方法的更一般类型可以 在存在已正确排序的分段序列的每个像素处自动地利用该已正确排 序的分段序列,并且在未排序分段序列出现时对其进行正确绘制。下 面描述这样的方法。

在理想情况下,用于正确绘制半透明面的技术可以以线性时间来 执行。例如,假设存在透明面的列表S(也即,集合),其中透明面 与通过近平面和远平面之间的像素中心射出相机之外的线段相交。为 了正确地将这些面合成在一起,必须通过从前到后或者从后到前的顺 序对其进行混合。在任一情况下,该操作可能需要根据深度对S中的 面进行排序。对于随意放置的面的集合,排序可以在O(n lgn)中完成。 在桶排序有效时,可以在O(n)中对这些面进行排序。然而,这些需求 均对面的放置进行了假设。

与进行这些假设不同,在此描述的系统和方法可以使用连贯性的 性质。在一些实施方式中,可以假设:S中的面开始是大部分或者至 少部分按照已排序顺序的,并且仅有少量恒定数目的面的排序需要定 位。在实践中,该假设经常是成立的,因为可以根据给定的相机视图 预先对数据进行排序,并在相机移动和/或场景变化时对数据周期性地 进行更新。对于具有平滑移动的相机和几何体的实践场景,面不太可 能在帧之间变成完全乱序的。如上所述,在此所描述技术的渐近性能 可以与列表S中已正确排序的不间断跨距的数目相联系。

可以通过示例来进一步描述用于正确绘制具有顺序无关的透明 度的复杂场景的系统和方法。在此示例中,令s0...sn-1∈S是大部分(或 者部分)已排序面的列表,其中面与通过近平面和远平面之间的给定 像素中心射出相机之外的光线段相交。对于任意的si∈S,令D(si)表示 面的z深度。在此示例中,假设面是按照从前到后的方式大部分排序 的,并且已经对直到一些面sc进行了深度剥离。图2示出了大部分已 排序的面s1到s10(元素201-210)的一个这样的序列。在一些实施方 式中,在此描述的方法可以用来找到z范围(D(sc),∞]中下一个乱序面 的深度。在图2所示的例子中,最后剥离的面由s4给出,并且序列中 下一个乱序面是s9。在此示例中,剥离范围250[D(s3),D(s10)]中的所 有面由其定义保证是按照正确顺序的。

图3的流程图示出了用于绘制具有顺序无关的透明度的复杂场景 (诸如图2中的面所示出的场景)的方法的一个实施方式。在此示例 中,如上所述,对于所有受影响的像素,可以对直到面sc(包括)的 面(例如,sc对应于图2中的s4或者元素204)执行标准深度剥离。 这在块310中示出。在此示例中,可以将D(Sn)定义为最后被剥离的 层sc之后按照深度而言的第一个面。

在图3所示的实施方式中,该方法可以包括:如在320中,对于 所有受影响的像素,找到在序列中位于sn之前的、深度范围(D(sn),∞] 中的最近乱序面。在一些实施方式中,这可以包括检查在sn之前提交 的面的集合。根据定义,列表中在sn之前到来的、其深度大于sn的任 何面都是乱序面。该面的列表可以定义如下: S^={s:siS,i<n,D(sn)<D(sj)}.该方法可以包括找到任何这种面的最近 深度,如果其存在的话。这可以这样给出:

z_min_prev=argmins^S^D(s^),如果s^0或者

z_min_prev=∞,否则

在此示例中,深度z_min_prev可以提供对按序面的深度范围的宽 松界限。现在可以假设任何连贯的面列表落在范围[D(sn),z_min_prev) 之内。

在图3所示的实施方式中,该方法可以包括:对于所有受影响的 像素,如在330中,找到在序列中位于sn之后的、在深度范围(D(sn),∞] 之内的最近乱序面。在一些实施方式中,该方法可以包括考虑列表中 在sn之后出现的面的集合,并且在该列表中找到sn之后的任何乱序面 的最近深度。该面列表可以如下给出:

S^={si:siS,i>n,D(sn)D(si),D(si)D(si-1)}

在此示例中,列表中在sn之后出现的任何面的最近深度如下给 出:

z_min_post=argmins^S^D(s^),如果s^0

z min post=∞,否则

在一些实施方式中,深度z_min_post可以提供连贯面的深度范围 的宽松界限。在此示例中,现在可以给出剥离范围的严格界限: ([D(sn),min(z_min_prev,z_min_post)]。

在一些实施方式中,如图3的块340所示,该方法可以包括:通 过针对所有像素合成n个深度层来绘制中间图像(例如,针对直到但 是不包括剥离范围的面)。如果给出剥离范围间隔,在一些实施方式 中,该方法可以包括将经剪切的面S绘制到剥离范围。在此示例中, 确保剥离范围内的面是按照正确的从前到后顺序的,因此可以在对数 据的一次通过处理中完成合成。

注意,在一些实施方式中,连贯层剥离技术可以包括用以对场景 中的三维图像的全部或者部分面进行预排序或者部分进行预排序的 操作,如上文关于混合型层剥离所描述的。该方法继而可以对刻画场 景的图像的每个像素应用基于像素的连贯层剥离。在其他实施方式 中,可以对包括一些预排序面和一些未排序面的接收到的图像数据应 用连贯层剥离,并且连贯层剥离技术可以不包括显式的排序操作。在 又一实施方式中,连贯层剥离技术可以包括两个或更多排序操作。例 如,排序操作可以对场景元素的面的子集(例如,给定z范围内的那 些)进行预排序,并且可以将该子集内被排序为深度顺序的那些面合 成到图像缓冲区中,而无需执行深度剥离。继而可以如上所述地对面 子集内未被按照深度顺序排序的那些面应用深度剥离。在处理面的一 个子集之后,可以使用排序操作对面的另一子集进行预排序,并且在 此描述的技术可以应用于第二子集的已排序和/或未排序面。在一些实 施方式中,这可以针对面的多个子集(例如,z范围)进行重复,并 且可以将结果合成到一起以产生最终图像。

在一些实施方式中,可以使用现代图形硬件来实现图3中所示的 方法。例如,图4示出了方法的一个实施方式,其中可以将参考图3 描述的操作映射到GPU上。在此示例中,该方法可以包括如410中 的初始化操作。在一些实施方式中,为了绘制效率,初始化可以包括 将三维场景中不透明的面从透明面中分离出来。例如,可以将不透明 对象绘制到称为opaque_depth的深度图中。在此示例中,该方法还可 以包括将用于透明面的深度图(称为D(sc))初始化到z-near平面。 在此示例中,这两个缓冲区可以对深度范围进行编码,其中要对该深 度范围之间的透明排序进行求解。

如在图3中所示的示例中,图4中所示的方法可以包括:找到在 序列中位于sn之前的、深度范围(D(sn),opaque_depth)内的最近乱序 面。在图4所示的例子中,将该步骤分为两次通过。在一些实施方式 中,对该步骤的输入可以包括存储在图中的间隔(D(sc), opaque_depth),并且该步骤的输出可以是间隔(D(sn),z_min_prev)。如 图4中的块420中所示,该步骤可以包括:对更新z缓冲区值、并且 其深度值位于范围(D(sc),opaque_depth)内的面数进行计数。在此示例 中,可以使用模板缓冲区来存储该计数。在一些实施方式中,可以在 简单的分段着色器(shader)中来完成深度范围剪切。在一个实施方 式中,用于绘制该次通过(也即,通过1)所需的OpenGL声明如下:

glClearStencil(0);

glClearDepth(1.0);

glStencilMask(0xFF);

glClear(DEPTH_AND_STENCIL_BUFFER_BITS);

glEnable(DEPTH_TEST);

glDepthFunc(LESS);

glEnable(STENCIL_TEST);

glStencilFunc(ALWAYS,0,0xFF);

glStencilOp(KEEP,KEEP,INCR);//fail,zfail,zpass

drawTransparentObjects();     //draw transparent objects

由于该方法可以包括在分段着色器中对范围(D(sc), opaque_depth)的剪切,模板计数过程可以仅受到面si(其中i≤n)的 影响。只要面sn流过,便可以将D(sn)写到深度缓冲区,并且所有后 续面(例如,si:i>n)可能无法通过z测试。在该通过的结尾,模板 可以保存更新过z缓冲区的面数的计数。在一些实施方式中,该计数 可以包括sn对z缓冲区的更新。在此示例中,深度缓冲区可以保存 D(sn),其可以在后续步骤中使用。

在图2所示的例子中,后面的面更新模板缓冲区:s1、s2和s3。 由此,根据图4所示的方法,可以将模板缓冲区设为3,而将深度缓 冲区设为D(s3)。

注意,在一些实施方式中,如果处于不正确顺序的面多于255个, 则模板计数可能失效,并且计数可以溢出。尽管这种情况可能在非常 复杂的场景中发生,但是在多数情况下,可以通过提供面的高层排序 来防止它,其中面的高层排序实际上可以消除模板溢出的机会。下面 将讨论一种更为鲁棒的方法,该方法可以利用可用的浮点混合。

如图4的块430所示,该方法可以包括:将模板缓冲区向下计数 回1,以找到范围(D(sc),opaque_depth]内的任何曲面si:i<n的最小深 度。为此,在一些实施方式中,可以使用相同的深度比较逻辑再次绘 制几何体,将模板向下计数,并且仅在模板计数大于1的情况下通过 模板测试。在此示例中,该过程的结果将z_min_prev记录到z缓冲区 中。在一个实施方式中,用于绘制通过(也即,通过2)的OpenGL 声明可以如下:

glClearColor(1.0,1.0,1.0,1.0);

glClear(COLOR_AND_DEPTH_BUFFER_BITS);

glEnable(DEPTH_TEST);

glDepthFunc(LESS);

glEnable(STENCIL_TEST);

glStencilFunc(LESS,1,0xFF);

glStencilOp(KEEP,KEEP,DECR);

drawTransparentObjects();    //draw transparent objects

在图2所示的例子中,绘制可以略过s1并且在s2停止,因为在绘 制s2并将深度设为D(s2)之后,模板计数达到1,并且不再对像素进行 更新。

如图3(块330)中所示的示例中,图4所示的方法可以包括: 找到序列中位于sn之后的、在深度范围[D(sn),min(z_min_prev, opaque_depth)]内的最近乱序面。再次,在一些实施方式中,该步骤 可以包括两次通过。在一些实施方式中,对于这两次通过,可以使用 简单的分段着色器对落入范围[D(sn),min(z_min_prev,opaque_depth)] 内的所有面分段进行剪切。注意,如从图3中块320中描述的步骤中 得出的,i<n的所有面si落入该范围内。因此,其在通过3和通过4 中不起作用。

如图4中的块440所示,该方法可以包括:对范围[D(sn), min(z_min_prev,opaque_depth)]内直接在sc之后的面的已存储最长连 贯跨距(也即,正确排序的面的数目)进行计数。在一些实施方式中, 这可以通过将z测试设为GREATER(大于)以及在面每次通过z测 试时递增模板计数来实现。在这种实施方式中,没有通过z测试的第 一个面将对模板值取逆,并使模板测试剔除掉所有剩余的面分段。在 此示例中,该通过(通过3)的结果可以是给出sc之后处于正确深度 顺序的面的数目上界的模板值。在一个实施方式中,该次通过的伪代 码可以如下:

glClearStencil(0);

glClearDepth(0);

glClear(DEPTH_AND_STENCIL_BUFFER_BITS);

glEnable(DEPTH_TEST);

glDepthFunc(GREATER);

glEnable(STENCIL_TEST);

glStencilFunc(GREATER,128,0xFF);

glStencilOp(KEEP,INVERT,INCR);    //fail,zfail,zpass

drawTransparentObjects();

在图2所示的例子中,模板缓冲区针对面s3、s5、s6和s7递增。 因此,在此示例中,面s9可以对从4到251的模板值取逆,并且将深 度设为D(s9)。

注意,在一些实施方式中,该通过中可能没有任何溢出问题。如 果正确顺序的面多于128个,当模板计数达到128时,计数停止,并 且可以假设最后的面是乱序的。因此,在一些实施方式中,该通过在 方法的一次迭代中最多可以处理128个面。

如上所述,在通过3中,可以对直接在D(sc)之后的已排序的z 连贯面的最长跨距中的已排序z连贯面的数目进行计数。然而,可能 存在打断该连贯跨距的其他面sj:j>n(例如,图2中的面s10)。在此 示例中,在通过4中,可以计算这种面的最小深度,如图4的块450 中所示。可以将该值存储为z_min_post。在一个实施方式中,下面包 括的用于通过4的逻辑可以用以使用模板测试以及在每次模板测试失 败时递增模块来从最长连贯跨距(在通过3中计数)中剔除掉前k个 面。在此示例中,一旦模板值达到255,剩余的面可以流过管道 (pipeline),并且可以使用具有LESS(小于)的z缓冲来找到最小 深度。

glClearColor(1.0,1.0,1.0,1.0);

glClearDepth(1.0);

glClear(COLOR_AND_DEPTH_BUFFER_BITS);

glDepthFunc(LESS);

glStencilFunc(EQUAL,255,0xFF);

glStencilOp(INCR,KEEP,KEEP);//fail,zfail,zpass

drawTransparentObjects();

在图2所示的例子中,通过4可以跳过面s3、s5、s6和s7,并且 可以绘制面s9和s10

如图3的块340中所示的例子中,图4中所示的方法可以包括: 合成n深度层,这在一些实施方式中包括两次通过。如上所述,位于 间隔[D(sn),min(z_min_post,z_min_prev,opaque_depth))内的面可以确 保处于不间断的正确深度顺序。因此,在一些实施方式中,标准的合 成通过可以使用分段着色器来剪切该范围,以便将这些面积累到最终 图像中。该通过(通过5)被示为图4中的块460。

注意,在一些实施方式中,位于剥离范围上界的面可能是乱序面 (例如,在没有设置z_min_post的情况下,例如,如果图2中的面s3直接在面s2之后)。在这种实施方式中,由于该深度是已知的,该方 法可以包括将该面剥离掉,以及在附加的合成通过(例如通过6,未 示出)中使用z相等测试。在这种情况下,该方法在每次过程迭代中 可以剥离掉(在最坏情况下)两层。

如图4所示,一旦已经合成了面的连贯范围,则可以将D(sc)更新 为z_min_prev、z_min_post和opaque_depth的最小值。如块470所示。 在一些实施方式中,可以重复块420-470所示的过程,直到没有剩余 的面要剥离。这由从决策块480的肯定出口到块420的反馈循环示出。 在一些实施方式中,该方法可以包括在合成阶段(未示出)使用遮挡 查询来检测何时发生这种情况。一旦没有更多的面要剥离,如块408 的否定出口所示,可以输出最终的合成图像,如490中。例如,表示 连贯层剥离技术的该次通过的结果的图像可以显示在屏幕上和/或可 以保存在存储器中,以用于进一步处理(例如,在后续通过中)。

注意,在一个实施方式中,该方法可以包括:在通过2之后,以 深度图opaque_depth绘制全屏多边形以获得min(z_min_prev, opaque_depth),并继而在通过4之后以得到的图min(z_min_prev, opaque_depth)绘制多边形。在这样的实施方式中,有可能在通过1- 通过4的分段着色器中消除一次比较,以及在通过5中消除两次比较。

如上所述,上面描述方法的备选实施方式可以利用浮点图像混合 来达到通过次数的减少。例如,可以通过单次通过来替代通过1和通 过2,这使得总计数变为5。图5中示出了一个这样的实施方式。如 块510中所示,如上文描述的实施方式,该方法可以包括初始化各种 缓冲区(例如,深度图)。

如前面的例子中,图5中所示的方法可以再次包括找到序列中在 sn之前的、在深度范围(D(sn),opaque_depth)之中的最近乱序面。如块 520中所示,可以将深度和颜色信道初始化为具有z-far的值。在此示 例中,如在530中,浮点混合可以用来将先前距离相机最近的面的深 度存储在颜色通道中。在绘制几何体中,该方法可以包括将颜色设为 1.0、1.0、1.0以及将alpha设置为分段深度。在一些实施方式中,通 过使用将源颜色乘以目的alpha的混合方法,可以将帧缓冲区中的先 前面的深度移动到该帧缓冲区的颜色通道。在此示例中,这次通过的 结果可以将z_min_prev的值存储到颜色通道中。在一个实施方式中, 用于绘制这次通过所需的OpenGL声明如下:

glClearStencil(0);

glClearDepth(1.0);

glClearColor(1.0,1.0,1.0,1.0);

glClear(COLOR_AND_DEPTH_BUFFER_BITS);

glEnable(DEPTH_TEST);

glDepthFunc(LESS);

glEnable(BLEND);

//multiply source color by destination alpha

//set alpha to source alpha

glBlendFuncSeparate(ZERO,DEST_ALPHA,ONE,ZERO);

drawTransparentObjects();     //draw transparent objects

如图5所示,该方法可以还包括:找到序列中在sn之后的、深度 范围[D(sn),min(z_min_prev,opaque_depth))中的最近乱序面。在此示 例中,该步骤可以涉及两个绘制目标,一个用于计算合成图像,第二 个用于计算过程的下一阶段的新的z剥离深度。在此示例中,该方法 可以包括两次提交每个分段,一次作为朝前分段,第二次作为朝后分 段,如块540中所示。在一些实施方式中,可以清空缓冲区,以具有 z-far的深度和为1的模板。使用“比目的地的分段更接近或者相等” 的z测试通过,该方法可以包括绘制比z_min_prev更接近而比z-剥离 (z-peel)更远离的分段。

在一些实施方式中,可以根据如下规则、使用对从后到前的顺序 的估计来绘制多边形:

●对于分段配对的第一分段(也即,向后分段):

○将颜色设置为0.0、0.0、0.0,并将alpha设为1。如果描绘 该分段,则将颜色重置为黑,其中将在其上合成其他颜色。

○模板测试:大于零。如果模板失败:模板保持。如果模板通 过并且z通过:模板保持。如果模板通过并且z失败:模板 保持。

●对于分段配对的第二分段(也即,向前分段):

○颜色是面颜色,alpha是面alpha。

○模板测试:总是为真。如果模板通过而z失败:将模板设为 1。如果模板通过且z通过:清空模板。

如块540中所示,该步骤可以成功地计算z_min_prev与z剥离之 间的面的合成颜色。然而,其可能没有计算正确的透明度值,因为经 过翻转的分段的alpha被设为了1.0(透明度为0)。为了解决该问题, 如在块550中,该方法可以包括第二绘制目标,其执行与第一目标相 同的合成,但是将朝前分段颜色设置为分段透明度值,并将朝后分段 颜色设置为1。在一些实施方式中,该方法使用将源颜色乘以目的颜 色的混合规则。在一些实施方式中,第三绘制目标可以使用相同的规 则,但是可以将朝后分段设置为具有颜色“z-frag”以及alpha“1.0”, 并将朝后分段设为具有颜色“0”以及alpha“0”。在这样的实施方 式中,第三绘制目标可以使用过混合模式。

如块560中所示,该方法可以包括将结果从先前步骤合成为全局 合成图像(按照从前到后的顺序)。在一些实施方式中,这可以通过 全屏四边形来实现。如在前面的例子中,重复块520到560中所述的 操作,直到没有更多要剥离的面。这在图5中示为从决策块580到块 520的反馈循环。一旦没有更多要剥离的面,该方法可以包括输入最 终图像,如在590中。例如,表示连贯层剥离技术的这次通过的结果 的图像可以显示在屏幕上和/或可以保存在存储器中以用于进一步处 理(例如,在后续通过中)。

在一些实施方式中,上面描述的方法每次迭代可以需要5次几何 体通过,并且每次迭代可以剥离至少两层。下面描述的另一实施方式 可以将几何体通过的数目减少为2,其只需要对已有硬件进行微小的 改动。

在一个实施方式中,理想光栅化引擎可以允许几何体的有效光栅 化,同时允许访问光栅化着色器中的多个目标缓冲区。在一个这样的 实施方式中,光栅化着色器可以是通用着色器的部分,其同时计算颜 色和alpha。在另一实施方式中,其可以在亚像素采样级别以更为精 细的尺度来执行,其中面材料着色器分摊在多个像素的子采样上,如 有时在目前的GPU中完成一样。注意,在一些目前的GPU中,光栅 化着色器被限制为有限的帧缓冲区状态机。在一些实施方式中,在此 描述的方法可以实现为对这种状态机的扩展。

在该备选实施方式中,光栅化着色器可以具有用于采样位置处的 分段的可用的插值Z,以及在绘制目标的等效物中可以读和写的多个 z值和其他整数值(等同于模板)。在这样的实施方式中,光栅化着 色器可以按照每个像素子采样的光栅化顺序针对每个分段来执行。这 种系统可以能够将传统GPU的多次通过结合为单次通过。在一个实 施方式中,可用于光栅化着色器的输入可以包括:

●zFragment:采样位置处的分段的插值深度

●zPeel:来自过程的先前通过的最终剥离深度

●zOpaque:最近不透明面或者z-far中距离相机最近的一个的深 度

●z1,z2,z3:一组全精度缓冲区,用来存储z值(在各种实施方 式中,或者是浮点或者是定点)

●gChanged:单个全局改变的位,用来确定类似于遮挡查询的终 止

这种用于连贯层剥离的方法的一个示例由下面的伪代码给出:

1:for all pixel sample locations do

2:     z3←zNear

3:end for

4:gChanged←true

5:while gChanged=true do

6:     gChanged←false;

7:     for all pixel sample locations do

8:             z1←zOpaque;

9:             z2←zOpaque;

10:            zPeel←z3;

11:            zPostFlag←false

12:    end for

13:    for all geometry sample locations do    //Pass 1

14:            if(zPeel<zFragment<z2)then

15:                   gChanged←true;

16:                   if zFragment<z1 then

17:                           z2←z1

18:                           z1←zFragment

19:                           z3←z1          //Reset the state for post

20:                           zPostFlag←false

21:                   else ifzPostFlag=true then

22:                           if zFragment<z3 then

23:                                   z3←zFragment

24:                           end if

25:                   else

26:                           if zFragment<z3 then

27:                                   zPostFlag←true

28:                           end if

29:                           z3←zFragment

30:                   end if

31:          else if zFragment=zPeel then

32:                   Composite fragment into color buffer

33:          end if

34:   end for

35:   if gChanged=true then

36:          for all geometry sample locations do     //Pass 2

37:                   if(zPeel<zFragment<z3)then

38:                          Composite fragment into color buffer

39:                   end if

40:          end for

41:   end if

42:end while

如上所述,用于绘制透明面的不同方法可以适于不同的应用和/ 或输入场景。图6A-图6F示出了各种场景,其包括已经应用了在此 描述的各种方法的透明面。

为了评价不同方法的价值,可以考虑多个量度。一个量度可以是 在当前现有技术硬件上的性能的绝对时间,第二个量度可以是绘制具 有正确透明度的特定场景所需的几何体通过的次数。出于显然的原 因,在实践中可能在短期内对绝对性能特别感兴趣。可能在理论上对 所需的通过次数更为感兴趣,因为假设光栅化硬件的进一步优化,则 其可以表明混合型层剥离或者连贯层剥离的价值。这种优化例如可以 通过支持理想化连贯层剥离方法或者通过改进或合并目前基于GPU 方法的通过来实现。

通常,可以通过混合型层剥离来绘制的所有场景也可以通过连贯 层剥离和传统深度剥离来绘制。为了确定方法如何随深度复杂性而伸 缩,使用在此描述的各种方法绘制了与表示治疗束的圆锥体相交的、 表示体的alpha调制明面的栈。由于圆锥体具有非常低的深度复杂性, 这种情况可能非常适于混合绘制和连贯层剥离。图6A示出了测试场 景,其中跨过体的分片的数目是可设置的参数。图7示出了与使用各 种方法来绘制测试场景相关联的执行时间,其中跨过体的分片数目是 可配置的参数。在此示例中,该图示出了对于每个不同算法的绝对时 间以及所需剥离的次数。如图7所示,对于传统层剥离,剥离次数随 着体层的数目线性增长。传统深度剥离的总时间的增长快于线性时 间。相反,混合型层剥离和连贯层剥离所需的通过次数保持恒定,而 绘制时间随着层数线性增长。对于256个层,混合型层剥离相对于深 度剥离而言实现了52比1的速度改进。连贯层剥离由于近似为6的 恒定因数而较慢。这可以归因于该方法每次迭代的较大数目的几何体 通过,以及需要在每次通过中绘制体层。在此示例中,对于混合型层 剥离,仅需要针对合成通过来绘制体分片,而不需要针对深度剥离通 过。

为了针对更为一般性的场景来考察混合型层剥离相对传统深度 剥离的性能,使用了各种模型。传统深度剥离所需的总层数部分地取 决于相机的位置。在一些情况下,对一些模型的顶视图和侧视图进行 了比较。在这些示例中,基于上文描述方法的连贯层剥离得到了相对 于传统深度剥离高达3倍的速度改进。取决于模型,该方法的浮点变 形慢于或者快于基于模板的版本。变化可以归因于浮点混合方法的较 少几何体通过相对于去往帧缓冲区的代价较高的带宽的相对代价。表 1中描述的性能测量是基于Marko Dabrovic提供的模型(例如,Sponza 模型)、斯坦福大学计算机图形学实验室提供的模型(例如,Dragon 和Lucy模型)或者可公开获得的模型(例如,Engine和Car模型)。 图6A中所示的模型(头部体数据集)是基于从Simens Magnetom上 取得数据并且得到了Simens Medical System,Inc.,Iselin,NJ的允许。

表1(下面)示出了使用连贯层剥离方法A、利用浮点混合的高 级版本B以及标准深度剥离方法来绘制的各种模型的帧率、迭代次数 以及几何体通过次数。

  模型图   面顶点   连贯剥离A   连贯剥离B   标准深度剥离   引擎   (图6C)   133K面   120K顶点   22fps   7次迭代42个几何体   23fps   7次迭代35个几何体   21fps   22次迭代44集合体   Dragon   正面   150k面   749K顶点   51fps   3次迭代18个几何体   53fps   3次迭代15个几何体   35fps   14次迭代28个几何体   Dragon   侧面   (图6D)   150K面   749K顶点   51fps   3次迭代18个几何体   53fps   3次迭代15个几何体   35fps   14次迭代28个几何体   Lucy对端   250K面   125K顶点   37fps   3次迭代18个几何体   41fps   3次迭代15个几何体   15fps   22次迭代44个几何体   Lucy正面   (图6F)   250K面   125K顶点   36fps   3次迭代8个几何体   40fps   3次迭代15个几何体   27fps   12次迭代24个几何体   Sponza   对端   66K面   61K顶点   36fps   3次迭代18个几何体   40fps   3次迭代15个几何体   12fps   26次迭代52个几何体   Sponza   正面   (图6E)   66K面   62K顶点   56fps   3次迭代18个几何体   50fps   3次迭代15个几何体   35fps   16次迭代32个几何体   Car   正面   (图6B)   730K面   365K顶点   0.28fps   11次迭代   66个几何体   0.34fps   11次迭代   55个几何体   0.27fps   36次迭代72个几何体

表1多种方法对各种模型的相对性能

如上所示,混合型层剥离可能在某种程度上可应用性稍窄。然而, 其示出了相对于传统深度剥离的显著性能改进,并且可以易于在目前 的GPU上实现。连贯层剥离可以应用于较宽类型的部分排序的场景, 并且示出了在目前硬件上针对典型测试模型的上至3倍的速度加速。 其还可以作为将来改进的绘制硬件的基础,改进的绘制硬件允许其至 少在最坏情况下与传统深度剥离匹配,并且对于具有良好但是不完全 排序的高速度复杂性场景渐近地具有更好性能。

在此描述的方法主要关注于混合型层剥离和连贯层剥离的光栅 化逻辑。如本文所述,连贯层剥离可以受益于良好排序的场景。备选 实施方式可以包括确定理想的排序算法以及其他启发式算法,例如当 连贯层剥离是核心光栅化算法时的几何体切割。在此描述的各种实施 方式使用三角形重心的简单的桶排序。然而,其他实施方式中可以应 用其他排序方法。其他实施方式可以在GPU的改进可用时对其加以 利用,并且可以得到显著的加速。其他实施方式可以包括研究如何增 强帧缓冲区状态机以降低通过的次数,以及在适当硬件变得可用时的 理想方法的备选实现。在一些实施方式中,Z剔除(Z-culling)可以 促进传统深度剥离的效率,并且在连贯层剥离的上下文中可以解决对 z剔除的利用。最后,当其变得可实际用来绘制具有高透明深度复杂 性的场景时,这种绘制可以在可视化中被有效地使用。

如前所述,在此描述的用于正确绘制具有顺序无关透明度的复杂 三维场景的方法可以使用诸如图形处理单元或称GPU的现代图形硬 件来实现。图8是示出了被配置用于绘制这种场景的GPU 600的一个 实施方式的框图。GPU 600可以包括与计算机相关联的专用图形绘制 设备。用于与GPU结合使用的适当计算机系统900的例子在图9中 示出。图8中所示的GPU 600可以包括多个专用部件,其配置用于优 化绘制图形输出的速度。例如,GPU 600可以包括用于绘制三维模型、 用于对面应用纹理等的专用组件。然而,为了说明目的,在图8的示 例GPU 600中仅示出了有限的组件选择。可以预计,不同于图8的示 例架构的GPU架构可以适于实现在此描述的技术。GPU 600可以实 现允许程序员调用GPU功能的一个或多个应用程序员接口(API)。 适当的CPU可以从诸如NVIDIA公司、ATI Technologies以及其他供 应商处购得。

GPU 600可以包括主机接口660,其被配置用于与数据源680(例 如,主计算机900的通信总线和/或处理器910,或者主机系统本身) 通信。例如,数据源680可以向GPU 600提供输入数据(例如,包括 一个或多个几何对象的场景,其中对象包括一个或多个透明面)和/ 或可执行程序代码。在一些实施方式中,主机接口660可以允许GPU 600与数据源680之间的双向数据移动。GPU 600还可以包括显示接 口670,用于向数据目标690提供输出数据。例如,数据目标690可 以包括显示设备952,并且GPU 600(以及图形组件和/或接口956) 可以通过来自屏幕缓冲区(例如,图像缓冲区650)的特定速率提供 图形数据来“驱动”显示器952。

在一个实施方式中,GPU 600可以包括内部存储器610。GPU存 储器610在此也称为“视频存储器”或者“VRAM”,其可以包括其 他GPU组件可访问的随机访问存储器(RAM)。如下文更为详细描 述的,在一些实施方式中,GPU存储器610可以用来存储各种类型的 数据和指令,诸如输入数据、输出数据、中间数据、用于执行各种任 务的程序指令等。在一个实施方式中,GPU 600还可以被配置用于经 由主机接口660来访问主计算机系统900的存储器920。

在一个实施方式中,程序指令940可以存储在主计算机系统900 的存储器920中,并与主计算机系统900执行,以根据输入数据685 来生成输出图像695。如在此所述,输入数据685可以包括表示包括 一个或多个几何对象的场景的数据,其中几何对象具有按照已排序顺 序或者任意顺序的一个或多个透明面。

在一个实施方式中,GPU 600可以包括GPU程序代码620,其可 由GPU 100来执行,以执行在此描述的技术的方面。例如,在绘制过 程(包括GPU程序代码620在GPU 600上的执行)期间,可以将输 入数据685中的几何对象光栅化为像素。GPU程序代码620的元素可 以由主计算机系统(例如,数据源680)提供给GPU 600,和/或GPU 600本源的。在一个实施方式中,GPU程序代码620可以包括一个或 多个着色器622(例如,顶点着色器、像素着色器、分段着色器或者 光栅化着色器)。如图8中所示,在各种实施方式中,GPU程序代码 620可以包括如在此所述的混合功能621、标准深度剥离功能623以 及增强的深度剥离功能624中的一个或多个。在生成示出图像695中, 这些功能的任何功能或者GPU程序代码620中包括的其他功能可以 在图形学流水线中的各个点执行。

GPU存储器600可以包括一个或多个缓冲区,并且每个缓冲区可 以包括像素数据(例如,颜色值)和/或像素元数据(例如,深度值、 模板值等)的二维数组。每个缓冲区可以包括像素数据(例如,颜色 值)和/或像素元数据(例如,深度值、模板值等)的二维数组。例如, 如图8中所示,GPU存储器610可以包括图像缓冲区650。图像缓冲 区650可以存储在绘制过程中生成的中间或者最终像素值。在一个实 施方式中,图像缓冲区650可以包括单采样缓冲区,其中缓冲区中的 每个像素由颜色和alpha值的单一集合表示(例如,针对红通道的一 个颜色值,针对绿通道的一个颜色值,针对蓝通道的一个颜色值,以 及针对一个或多个阿尔法通道的适当值)。在另一实施方式中,图像 缓冲区650可以包括多采样缓冲区,其可用于自动反走样。

如图8所示,GPU存储器610可以包括各种其他缓冲区,诸如在 此讨论的深度缓冲区(也即,Z缓冲区)640、模板缓冲区665、深度 图D(sc)以及opaque_depth图645。在一个实施方式中,图像缓冲区 650可以是与数据目标690的目标分辨率相同的分辨率。图像缓冲区 650可以包括屏幕缓冲区,其直接被提供给数据目标690。在一个实 施方式中,图像缓冲区650和深度缓冲区640可以是相同的分辨率, 并且图像缓冲区中的每个位置(也即,像素)可以对应于深度缓冲区 640中的相应位置。深度缓冲区640中存储的每个值可以指明相对于 视点的相应像素的相对深度或者距离。

GPU 600可以包括用以辅助作品绘制的各种内置功能。在一个实 施方式中,GPU 600可以包括Z测试(也即,深度测试)功能,其可 操作以执行对Z值(也即,深度缓冲区640中深度值)的比较并相应 地采取动作(例如,保持或者丢弃像素)。在一个实施方式中,GPU 600可以包括模板测试功能,其可操作以执行对模板值(例如,在模 板缓冲区中)的比较并相应地采取动作(例如,保持或者丢弃像素)。 诸如Z测试和模板测试的功能可以被启用、禁用和/或通过对GPU API 中适当功能的调用和/或反走样程序代码620的操作来进行配置。

如上所述,程序代码620可以包括标准深度剥离功能623以及增 强的深度剥离功能624。在一些实施方式中,增强的深度剥离功能624 可以包括可由GPU执行以实现在此描述的用于正确绘制顺序无关的 透明面的方法的程序指令。在其他实施方式中,程序指令940(在图 9中示出)可以用来实现这些方法。在又一实施方式中,图形学应用 的操作,包括在此描述的用于绘制顺序无关的透明面的一些操作,可 以在一个或多个CPU和/或GPU之间划分以便执行。例如,用于确定 绘制参数的计算在CPU上可能比较简单,并且可以在GPU上的像素 着色器中使用较少的指令。此外,GPU和/或CPU中的计算对于图形 学应用所执行的特定计算可以更为鲁棒。可以选择各种实施方式来匹 配特定GPU 600(例如,GPU 600可以缺少着色器或者图8中所示的 其他组件)的能力。

图9是示出了计算机系统900的组成元件的框图,其中计算机系 统900被配置用于实现用于绘制具有一个或多个顺序无关的透明面的 复杂场景的系统和方法的实施方式。计算机系统900可以包括一个或 多个处理器910,其是使用任何期待的架构或者芯片集来实现的,诸 如来自Intel公司或者Advanced Micro Devices的SPARCTM架构、x86 兼容的架构或者能够处理数据的其他架构或者芯片集。计算机系统 900上可以运行任何期望的操作系统,诸如各种版本的Unix、Linux、 来自微软公司的来自苹果公司的或者支持软件 在硬件平台上运行的任何其他操作系统。处理器910可以通过至少一 个通信总线耦合至一个或多个其他示出的组件,诸如存储器920。

在一个实施方式中,专用图形卡或者其他图形组件956可以耦合 至处理器910。图形组件956可以包括GPU,诸如图8中所示的GPU 600。而且,计算机系统900可以包括一个或多个成像设备952。该一 个或多个成像设备952可以包括各类基于光栅的成像设备,诸如监视 器和打印机。在一个实施方式中,一个或多个显示设备952可以耦合 至图形组件956,以用于显示图形组件956所提供的数据。

在一个实施方式中,可以由处理器910执行以实现在此所描述技 术的方面的程序指令940在任何时间点可以部分或者全部地驻留在计 算机系统900处的存储器920中。存储器920可以使用任何适当的介 质来实现,诸如任何类型的ROM或者RAM(例如,DRAM、SDRAM、 RDRAM、SRAM等)或其组合。程序指令还可以存储在可从处理器 910访问的存储设备960上。在不同的实施方式中,多种存储设备960 中的任何设备可以用来存储程序指令940,包括任何期望类型的永久 性和/或易失性存储设备,诸如独立的盘、盘阵列、光设备(例如, CD-ROM、CD-RW驱动器、DVD-ROM、DVD-RW驱动器)闪存设 备、各类RAM、全息存储等。存储设备960可以通过一个或多个存 储接口或者I/O接口耦合至处理器910。在一些实施方式中,可以经 由包括上面描述的存储器920和存储设备960在内的任何适当的计算 机可读存储介质将程序指令940提供给计算机系统900。

计算机系统900还可以包括一个或多个附加的I/O接口,诸如用 于一个或多个用户输入设备950的接口。此外,计算机系统900可以 包括一个或多个网络接口954,其提供对网络的访问。应当注意,计 算机系统900的一个或多个组件可以位于远程,并且通过网络来访问。 在各种实施方式中,可以使用任何期望的编程语言、脚本语言或者编 程语言和/或脚本语言的结合来实现程序指令,例如C、C++、C#、 JavaTM、Perl等。对于本领域的普通技术人员易见的是,计算机系统 900还可以包括图9中未示出的多种元件,这由所示的椭圆来表示。

在各种实施方式中,图1和图3-图5中所示的操作可以按照不同 于所示顺序的顺序来执行。总体上,在这些图中描述的任何操作可以 可编程地执行(也即,由计算机根据计算机程序来执行)。在图1中 以及图3-图5,所描述的任何操作可以自动执行(也即,无需用户干 预)。

尽管已经对实施方式进行了详细描述,但是只要完全理解了上述 公开内容,则多种变形和修改对于本领域技术人员来说将是易见的。 意在将所附权利要求书解释为涵盖所有这些变形和修改。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号