法律状态公告日
法律状态信息
法律状态
2022-09-23
未缴年费专利权终止 IPC(主分类):G06T 1/20 专利号:ZL200910221456X 申请日:20090930 授权公告日:20130424
专利权的终止
2013-04-24
授权
授权
2010-08-04
实质审查的生效 IPC(主分类):G06T1/20 申请日:20090930
实质审查的生效
2010-05-26
公开
公开
技术领域
本发明总体上涉及在基于处理器的系统中渲染图像。
背景技术
为了描绘复杂几何形状,必须以数学形式来表示这些形状。在图形中,样条具有在表面上从零到一变化的参数值t。样条可以由等式来表示,该等式对邻近点进行加权并且描述了如何将他们组合以创建曲线部分。
通常,在三维空间中,整个表面由多个样条的组合来确定。因此,在一个点处的改变会导致该表面的一部分的变形,所述表面的大小按照多项式的阶数成比例地增长。
B样条是一种曲面表示。B样条为它的各种控制点提供局部控制和影响。B样条具有与自然样条相同的连续性,但是它们不内插它们的控制点。控制点是在用于表示几何图像的形状的多边形中的顶点。在B样条中的B代表“基本(basis)”,因为B样条可以被表示为多个多项式基函数的加权和。
有理B样条是多项式的比率。非均匀有理B样条或NURB的特征在于所谓的结点的非均匀位置。结点是沿着一个弯曲段的样条参数的起始值。通过使连续的结点值具有相同的起始值,可以在空间中的该特定点处改变表面的曲率。
如果结点是等间隔的,那么该表面将被称为是均匀的。在NURB中的非均匀意味着结点位置可能不是等间隔的。
通过定义在NURB的表面上的曲线并且在NURB表面中开孔,来得到修整的非均匀有理B样条或修整的NURB。NURB允许在游戏、计算机辅助设计、科学研究可视化和电影中所使用的高保真弯曲几何图形的表示。
附图说明
图1是一个实施例的系统描述;以及
图2示出了根据一个实施例,在图1的系统中的在中央处理单元侧和图形处理单元侧的操作。
具体实施方式
根据一些实施例,可以通过图形处理器来生成修整的NURB。这避免了在中央处理单元和图形处理器之间反复地发送复杂的图形信息。这种传输会用尽可用的带宽并且使得复杂形状的渲染变得不可行。
参照图1,典型的图形流水线从图形处理器112通过链路106向帧缓冲器114提供渲染的图形,从而经由链路107在显示屏118上进行显示。图形处理器112可以通过总线105,例如外围组件互连(PCI)总线,来耦合到芯片组核心逻辑电路110。图形处理器112可以是多核处理器。核心逻辑电路110被耦合到主处理器或中央处理单元(CPU)100。中央处理单元可以是处理计算机系统的各种处理功能的一个或多个处理器,而图形处理器专用于图形功能。核心逻辑电路还可以被耦合到可移动介质136、硬盘驱动器134,和主存储器132,其可以存储程序139。核心逻辑电路110可以通过链路108耦合到用于显示控制的键盘或鼠标120。程序139可以由处理器100或处理器112所执行的指令组成。因此,主存储器132构成了根据本发明的一些实施例的可以存储可执行指令的计算机可读介质的一个示例。
参照图2,描述了经由中间总线105在CPU 100和图形处理器单元112上的操作。最初,中央处理单元100加载控制点。控制点是组成数字化图像的多边形的顶点。然后,处理器100加载修整曲线(trimming curve)。修整曲线是可以被用于修整碎片(patch)以创建曲线形状的曲线。
碎片与正方形的纸张类似。纸张可以被折叠或折皱,但是它仍然是正方形的纸张。折叠或折皱正方形的纸张不会使得它变成圆形。相反,如果从正方形的纸张中将圆形剪下来,那么纸张会变为圆形。
NURB是在三维空间中的参数表面。复杂的表面是由碎片来组成的并且每一个碎片都是与某对参数u和v相对应的点的集合,其中u和v都大于或等于零并且小于或等于一。
所以,在参数空间中,碎片等同于正方形的纸张。通过将参数u和v变换到三维空间中,将碎片进行整形,但是碎片不会变为圆形,你不能通过将正方形的纸张折叠或折皱而使其变为圆形。通过修整可以将碎片变为圆形。
在参数空间中进行剪切并且这种剪切被叫做修整曲线(或者如果该剪是圆形的,那么就叫做修整圆形,或者如果该剪切是直的,那么就叫做修整线)。圆形的剪切生成两个表面。第一表面是该剪切的外侧部分(其对应于其中具有圆孔的正方形的纸张)。第二表面是内侧部分,其是被剪切下来的圆盘。
因此,由处理器100加载修整曲线。如在块66中指示,在处理器100中还进行了对修整的预计算。如在块64处指示,在顶点和索引缓冲器中,在处理器100中正在对顶点和索引数据进行计算。控制点和所得到的修整曲线通过总线105传输到图形处理器112,并且具体地是传输到其顶点着色器68。
然后,图形处理器的顶点着色器使用所传输的控制点来对NURB进行镶嵌(tessellation)。在块68中的顶点着色器对顶点进行变换。顶点着色器68以如下方式工作。顶点着色器对变量float2col进行计算,其等于float2((float(vertld%g_size))/g_size,(float(vertld/g_size))/g_size)。Vertld是指范围[0,g_size*g_size]之内的输入顶点的数量。总共有g_size*g_size个顶点。顶点的这个数量(vertld)对应于[u,v]的均匀的分隔(division),其在NURB参数空间中小于或等于一并且大于或等于零。该步骤建立了在正方形内的顶点数量与位置的对应关系。
下一步骤是将float4 res4等于EvalSurface(col.x,col.y)。对于在正方形(col)内的给定位置,通过对NURB表面上的点的求值来进行变换(u,v)→(x,y,z)。EvalSurface()函数的内容是一种用于对表面上的点进行求值的公知的方法。顶点着色器接下来将输入参数传递给图形流水线的下一阶段。
然后,几何着色器在块70使用从中央处理单元100传输的修整曲线来修整NURB,这也在块70中说明了。到了修整曲线相交的程度时,沿着该修整来选择它们,以简化通过在三角形内的两个或更多个修整段的相交而获得的修整曲线的片断(piece)。
几何着色器以如下方式工作。首先,按照以下的方法来计算顶点的法线:
float3 normal=normalize(cross(edge1,edge2));
如果该三角形必须作为整体进行修整,那么不产生输出。
使用以下伪代码来判断向量m_trim1和m_trim2的红色(r)、绿色(g),和蓝色(b)分量是否包含关于在修整曲线与被处理的三角形的顶点的邻边之间的交点的信息:
if((input[0].m_trim1.r||input[0].m_trim1.g||input[0].m_trim1.b||
input[0].m_trim2.r||input[0].m_trim2.g||input[0].m_trim2.b)&&
(input[1].m_trim1.r||input[1].m_trim1.g||input[1].m_trim1.b||
input[1].m_trim2.r||input[1].m_trim2.g||input[1].m_trim2.b)&&
(input[2].m_trim1.r||input[2].m_trim1.g||input[2].m_trim1.b||
input[2].m_trim2.r||input[2].m_trim2.g||input[2].m_trim2.b))
然后,处理所有顶点对从而通过使用向量m_trim1和m_trim2形式的与交点相关的信息来寻找相交的边。因此,产生了输出三角形或四边形,这取决于被处理的三角形是如何相交的:
output.m_posPS=input[tri_compl].m_posPS;
output.m_posOS=input[tri_compl].m_posOS;
TriStream.Append(output);
output.m_posPS=input[tri_compl].m_posPS*coefs[0]+input[nbors[0]].m_posPS*coefs[1];
output.m_posOS=input[tri_compl].m_posOS*coefs[0]+input[nbors[0]].m_posOS*coefs[1];
TriStream.Append(output);
output.m_posPS=input[tri_compl].m_posPS*coefs[2]+input[nbors[1]].m_posPS*coefs[3];
output.m_posOS=input[tri_compl].m_posOS*coefs[2]+input[nbors[1]].m_posOS*coefs[3];
TriStream.Append(output);
上述代码的结果是输出三角形。该输出三角形的顶点中的一个是经处理的三角形(input[tri_compl])的一个顶点。其它两个顶点是经处理的三角形的边与修整曲线之间的交点。在一些情况下,不必将经处理的三角形作为整体来修整并且它不包含如上所处理的交点。这意味着所有的顶点都位于被修整的部分的外部并且它们刚好通过:
{
output.m_posPS=input[0].m_posPS;
output.m_posOS=input[0].m_posOS;
TriStream.Append(output);
output.m_posPS=input[1].m_posPS;
output.m_posOS=input[1].m_posOS;
TriStream.Append(output);
output.m_posPS=input[2].m_posPS;
output.m_posOS=input[2].m_posOS;
TriStream.Append(output);
}
然后,图形处理器发送这些新的多边形到像素着色器72。像素着色器将其光栅化并且将其渲染到屏幕188。
在一些实施例中,不是使用视觉修正,而是使用几何修整。在一些实施例中,可以在一次循环(single pass)中实现修整。在一个实施例中,不是传输整个多边形集合,而是将要被镶嵌的网格的控制点传输到图形流水线。在一些实施例中,不是使用通用的处理单元,而是使用几何着色器对NURB碎片执行对NURB的修整或镶嵌。
可以以各种硬件架构来实现本文所描述的图形处理技术。例如,图形功能可以集成在芯片组内。或者,可以使用分立的图形处理器。作为另一个实施例,可以通过包括多核处理器在内的通用处理器来实现图形功能。
贯穿该说明书所提及的“一个实施例”或“实施例”意味着结合该实施例描述的特定特征、结构或特点包括在本发明所涵盖的至少一个实现中。因此,短语“一个实施例”或“在实施例中”的出现并非必然是指相同的实施例。此外,可以在除了所说明的特定的实施例之外其它合适的形式中实现特定的特征、结构,或特点,并且所有这些形式都可以包括在本申请的权利要求的范围之内。
虽然本发明就有限数量的实施例进行了描述,但是本领域普通技术人员应当理解可以从上述实施例进行多种变型和改变。所附的权利要求旨在覆盖落入本发明的实质精神和范围内的所有这种变型和改变。
机译: 在可编程图形架构中修整的NURBS的创建
机译: 在可编程图形体系结构上渲染修剪的NURB
机译: 在可编程图形体系结构上渲染修剪的NURB