国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種代數b樣條曲面的實時繪制方法

      文檔序號:6575852閱讀:554來源:國知局
      專利名稱:一種代數b樣條曲面的實時繪制方法
      技術領域
      本發(fā)明涉及計算機圖形學實時繪制技術,特別是涉及一種基于Newton-Raphson(簡稱NR)迭代算法的代數B樣條曲面的實時繪制方法。

      背景技術
      代數曲面的光線投射算法的核心問題為光線跟曲面的求交計算。由于低于五次的一元方程可以解析的求根,Blinn近年來在解析求根的理論基礎與魯棒性上也作了大量的工作,基于此Loop提出了基于GPU的分段代數曲面的解析的魯棒的實時繪制算法,參見Loop C.,Blinn J.Real-timeGPU render-ing of piecewise algebraic surfaces.In SIGGRAPH’06,pp.664-670,但是這種方法無法做次數高于4次的代數曲面的繪制。
      對于一般代數曲面的求交算法,Kajiya 1982年中使用的算法為Laguerre迭代,該迭代提供了三次的收斂速度,但是每次迭代的代價比較高,參見Kajia J.T.Ray tracing parametric patches.In SIGGRAPH’82,pp.245-254。Knoll分別在2006年與2007年利用SSE指令集同時進行4條光線的基于區(qū)間算法的求交計算,對于超二次曲面達到30fps的性能,隨后將其推廣到GPU上,參見Knoll A.,Wald I.Interactive ray tracing of arbitrary implicitfunctions.In Proceedings of the 2nd IEEE/EG Symposium on Interactive RayTracing(2007),pp.11-18和Knoll A.,Hijazi Y.,Kensler A.,Schott M.,Hansen C.,Hagen H.Fast ray tracing of arbitrary implicit surfaces withinterval and affine arithmetic.Comput.Graph.Forum 28,1(2009),26-40,區(qū)間算法的缺陷在于需要對于特定的曲面設計特定的區(qū)間操作,尤其對于系數很多的曲面區(qū)間算法過于保守,導致效率低下。Nishita于1989年使用了Bezier Clipping算法在Bezier曲面的u,v方向上進行裁剪細分進行求交,Nishita T.,Sederberg T.W.,Kakimoto M.Ray tracing trimmed rationalsurface patches.In SIGGRAPH’90,pp.337-345,該算法需要遞歸的調用Bezier clipping,不適合并行的GPU運行環(huán)境。Reimers等于2008年使用B樣條節(jié)點插入算法得到實時繪制的效果,Reimers M.,Seland J.Raycasting algebraic surfaces using the frustum form.Comput.Graph.Forum 27,22008),361-370,但該方法僅限于單片曲面,而且會引入非常多的復雜的函數復合操作,在求法向與反走樣方面表現也不好。
      具我們所知,至今沒有專門針對高次的分段連續(xù)的代數B樣條曲面的實時繪制的算法。


      發(fā)明內容
      本發(fā)明提出了一種基于NR迭代算法的代數B樣條曲面的實時繪制方法,該算法是基于GPU的光線投射算法,適合于繪制分段連續(xù)的高次代數曲面。
      繪制曲面的方法有兩種,一種是繪制粗糙的近似的模型,因為近似的逼近得到的模型相對簡單,繪制也方便,但是繪制精度不夠;另外一種就是光線投射(或光線跟蹤)繪制算法,通過求解視線與曲面的交點達到在屏幕上像素精度的繪制結果,這種方法較為復雜耗時,但結果非常漂亮。因為代數B樣條曲面(即代數張量積B樣條曲面)具有分段連續(xù)性以及一般次數會超過4次(高于4次的方程沒有解析解)的性質,所以本發(fā)明方法適合分段高次代數曲面的繪制。
      由于在曲面空間使用NR迭代算法,在分析了NR迭代算法收斂性要求的基礎上提出了分區(qū)域繪制的算法,該算法可以保證NR迭代算法的收斂性。
      為了達到上述目的,本發(fā)明采用以下技術方案如下 包括以下七個步驟 (1)輸入待繪制的代數B樣條曲面的相關信息,計算得到代數B樣條曲面的Lipschitz常數,并通過節(jié)點插入算法將代數B樣條曲面轉換為分段的Bezier曲面片; 所述的代數B樣條代數曲面為如下定義 曲面定義于三維空間的一個矩形域R3=[a1,a2]×[b1,b2]×[c1,c2]上,令X=[x0,x1,…,xm+M+1],Y=[y0,y1,…,yn+N+1],Z=[z0,z1,…,zq+Q+1]表示在x、y和z方向上非遞減節(jié)點向量,則一個分段的代數張量積B樣條曲面表示如(1)式所示 其中Nim(x),Njn(y),Nkq(z)分別表示在節(jié)點向量X、Y和Z上的m、n和q次的B樣條基函數。標量wijk是曲面的權值,與參數曲面的控制頂點有相似的作用。該曲面是張量積的,各個方向都是獨立的,曲面的次數為X、Y和Z三個軸方向上的次數和為M+N+Q,M+N+Q通常會大于4,所以代數B樣條曲面具有次數高、各個方向上高階連續(xù)性等特點。而代數B樣條曲面可以通過節(jié)點插入算法得到等價的分段連續(xù)的Bernstein基表示的Bezier曲面。
      NR迭代算法可以提供二次的收斂速度,也是最常見的求解非線性方程組的方法,但是其算法收斂的要求為良好的初始值,否則算法可能發(fā)散。通過分析NR迭代算法的局部收斂特性性質,得到對一般非線性方程組,只需滿足如下(2)式,算法即可收斂 ||J(x*)-1[J(x)-J(x*)]||≤||J(x*)-1||||[J(x)-J(x*)]|| ......(2) ≤βγ||x-x*|| 其中該系統的解為x*,并且有γ,β>0,使得Jacobi矩陣J(x*)-1存在且||J(x*)-1||≤β,J∈Lipγ(N(x*,r))。
      那么我們在屏幕每一個像素上繪制曲面的時候,需要求解通過屏幕像素的視線方程,與曲面聯立的非線性方程組,經過推導可得該方程的Lipschitz常數(即βγ)。
      所述的屏幕像素的視線方程如(3)式所示 x*=E+dt......(3) 其中E為視點坐標,d為視線方向; 所述的Lipschitz常數(即βγ)如(4)式所示 其中

      為代數B樣條代數曲面函數F(x,y,z)的梯度,HF為代數B樣條代數曲面函數F(x,y,z)的Hessian矩陣,d為繪制的時候相對于每一個像素的視線方向,是d的轉置矩陣,為視線方向與曲面法向的夾角,ε的設定通常會影響線性插值區(qū)域的大小,ε值越大,線性插值來逼近的區(qū)域也就越大,當視線方向與曲面垂直的時候ε為0,也就是側影輪廓線的位置,通常選取ε小于0.1就可以得到滿意的結果。
      在計算的Lipschitz時,涉及到代數B樣條曲面的對于各個方向的二階偏導,且需要計算在其定義域中的Hessian矩陣的最大范數,準確的求解該范數的復雜度非常高,那么我們利用代數B樣條曲面的凸包性,可以使用代數B樣條曲面每個方向二階偏導的系數(即Hessian系數)代替函數值來近似的逼近Lipschitz常數,這樣計算的結果會放大該常數,導致的結果為MC的分辨率變高,經大量實驗驗證,取這種方法得到的常數的一般即可滿足一樣的收斂情況。
      (2)使用Marching cubes算法繪制抽取代數B樣條曲面的等值面,所述等值面的分辨率為所述的代數B樣條曲面的Lipschitz常數; 使用Marching cubes算法(簡稱MC算法)抽取代數B樣條代數曲面(簡稱ABS)的近似逼近,然后使用該等值面作為NR迭代算法(Newton-Raphson迭代算法)的初始值,并計算等值面上所有點的法向。所述的法向Fx、Fy、Fz各個分量為曲面表達式在x、y、z三個方向上的偏導。本方法使用的MC方法得到的ABS(代數B樣條曲面)的等值面上點及其法向均為準確計算,比線性插值更精確。MC算法采樣ABS(代數B樣條曲面)的得到的等值面的分辨率使用的為滿足NR迭代算法收斂要求的Lipschitz常數。
      (3)實時的計算代數B樣條曲面的極曲面; 代數B樣條曲面的極曲面的表達式如(5)式所示 其中,Fw為代數B樣條曲面所對應的齊次曲面對于齊次坐標w的一階偏導,式中E代表視點的坐標,代表法向,各個分量為曲面表達式在x、y、z三個方向上的偏導。
      (4)使用DirectX流水線對步驟(2)中的MC算法得到的等值面進行繪制,利用其高效的硬件光柵化算法和Z-Culling技術,得到代數B樣條曲面的等值面及其側影輪廓線的初始值,所述的初始值能進行良好的NR迭代算法。
      所述的側影輪廓線是指在曲面上其法向與視線方向垂直的位置。
      (5)聚集步驟(4)中得到的等值面的側影輪廓線的初始值,根據代數B樣條曲面及其極曲面方程,使用NR迭代算法對初始的側影輪廓線進行計算,得到代數B樣條曲面的等值面的浮點精度的側影輪廓線,并對側影輪廓線附近的值進行矯正。
      浮點精度指的是上述方程的解得到的側影輪廓線位置是浮點數,該精度遠遠大于屏幕上繪制的像素精度,適合進行反走樣操作。
      由于當Lipschitz常數(即βγ)在ε小于某一閾值的時候,Lipschitz常數就會變得很大,這樣就要求MC所使用的分辨率很高,這樣系統的開銷就很大,否則后續(xù)的NR迭代算法就不能收斂,所以我們使用曲面的側影輪廓線來保證繪制的正確性。
      曲面的初始的側影輪廓線為曲面與其極曲面的交線,如(6)式所示 其中E為視點的坐標,

      為法向各個分量為曲面表達式在x、y、z三個方向上的偏導,Fw定義為曲面所對應的齊次曲面對于齊次坐標w的一階偏導。
      由于在可見的兩個側影輪廓點之間,曲面是連續(xù)可見的,而NR迭代算法在側影輪廓線附近是很難保證收斂的,所以我們在求取側影輪廓線的基礎上,使用線性插值來替換無法收斂的區(qū)域,對側影輪廓線附近的值進行矯正。
      對于側影輪廓線的NR迭代算法,我們不僅使用了橫向、縱向兩個方向的輪廓線,而且要針對不同點的信息在不同的方向上使用NR迭代算法。因為側影輪廓線的法向是垂直于視線方向的,其在屏幕平面上的投影就是其真實的法向,等值面的繪制結果的邊界上點很接近側影輪廓線,其法向也是的側影輪廓線上法向的近似比較,那么我們就根據在MC算法中求得的法向,將其投影到屏幕空間,比較其在屏幕空間中x,y方向的分量大小來確定其是作為橫向還是縱向側影輪廓線。
      (6)將校正后的初始值按照其所屬的Bezier曲面片分類,進行聚類后使用NR算法迭代,得到每個像素的視線跟每個Bezier曲面的交點。
      但是在某些Bezier定義域之內、與其他Bezier曲面相鄰的邊界上可能有些交點經過NR算法迭代到了鄰接的曲面上。
      NR算法的每一步迭代都計算了曲面的法向信息,并保存該信息。
      由于ABS(代數B樣條曲面)相對于一般的代數曲面具有較多的控制系數,而NR算法的每一次迭代步驟需要將ABS(代數B樣條曲面)系數數據以及其極曲面數據載入到流處理器中計算函數值與法向信息,而使用現有的圖形卡硬件由于其內存機制的限制,無法對每個線程分別載入數據,所以本方法采用了分片曲面繪制時的數據訪問。
      針對CUDA現有的計算能力,將并行的線程數設置為64的倍數,這樣每一個線程內,訪問速度最快的變量——寄存器變量或者shared內存變量的數目就有限制。如果不能使用上述兩種變量,可以使用常數內存或者使用取紋理的方法來載入變量,這兩種方法都有緩存機制加速訪問,最慢的訪問是通過直接讀取顯存的方式。
      因為繪制和求解側影輪廓線時需要使用代數B樣條曲面及其極曲面函數的系數,對于3*3*3的曲面而言,需要4*4*4*2個浮點數,相比于常見的曲面,這些數據量還是比較大的。由于使用NR迭代算法,每一步程序主要代價就是函數值以及法向數據的計算,所以顯存的優(yōu)化訪問是獲取高性能的關鍵步驟。
      顯然在迭代開始之前將所有并行線程的相鄰曲面以及極曲面(在計算側影輪廓線時)數據都載入到處理單元中是不可取的,因為無法確定最近的曲面信息,所以每個線程最多可能有3*3*3-1個相鄰曲面片,這數據規(guī)模是非常大的。如果在程序運行時在根據程序計算結果載入相應的數據,最好也只能使用取紋理的方法來訪問,但是由于可能每個線程訪問的變量位置不同,會影響程序的并行性。
      本發(fā)明使用的算法是基于分片的算法,首先根據初始值將繪制數據按照其所屬曲面片分類,并根據曲面片信息進行排序聚類,這樣屬于同一曲面的數據就可以并行處理,需要訪問的曲面數據也都是一樣的,可以通過最快的shared內存的方式載入。曲面信息的排序聚類我們使用的是cudpp提供的基數排序,這種排序算法使用的是基數排序算法,比較使用于整數的排序。
      (7)通過NR迭代算法利用鄰接的Bezier曲面信息重新進行迭代求精,得到所有視線與代數B樣條曲面的正確交點,然后再利用交點信息與光源、視點的相對位置以及曲面本身的材質計算光照,得到代數B樣條曲線。
      在某些Bezier曲面片的定義域之內,經過NR算法迭代步驟(6)中得到側影輪廓線的每個像素視線和每個Bezier曲面的交點到了鄰接的Bezier曲面片,因此,需要使用NR迭代算法利用鄰接的Bezier曲面片信息重新進行迭代求精,得到最優(yōu)結果,該次NR迭代算法的內存可以使用取紋理的方法。
      當Bezier曲面片在邊界位置出現收斂到
      定義域之外時,則在相鄰曲面再進行一次使用NR算法利用鄰接的Bezier曲面信息重新進行迭代求精,得到最優(yōu)結果。
      由于在NR迭代算法的過程中已經計算了每次迭代結果處的法向,所以只需要簡單的將NR迭代算法的最后一步迭代的法向直接進行光照計算,這也免去了以往算法的一些參數變化或使用一元函數求交的相互轉化的步驟,效率更高。
      走樣問題一般發(fā)生在曲面與背景,曲面自遮擋的地方,顯然這些位置在我們的程序中,側影輪廓線的位置都是已知的,而且已經具有浮點數的精度,所以可以在亞像素級別上做反走樣,側影輪廓線處的曲面的法向與其在屏幕空間中的法向一致,我們可以根據其關于屏幕像素坐標的梯度來做反走樣。
      本技術方案中的代數B樣條曲面具有可表示任意拓撲的光滑曲面、便于進行外形分析與實體造型等優(yōu)點,而實時繪制是此類曲面進入實用領域的關鍵。具有像素精度的光線投射方法可以實現代數曲面的高質量顯示。本發(fā)明提出了代數B樣條曲面的實時GPU光線投射繪制算法。曲面繪制的核心問題為光線與曲面的求交算法,由于高于4次的多項式無法解析求根,所以本發(fā)明使用迭代的NR迭代算法,而NR迭代算法的初值由Marching cubes(MC)算法對原始曲面的逼近得到?;趯R迭代算法的收斂性分析,本發(fā)明算法可以得到給定曲面的能保證NR迭代算法收斂的Lipschitz常數,使用在該常數粒度下的MC算法得到的初始值可以保證使用NR迭代算法求根可以達到二次收斂的效果。對于不能滿足的收斂性要求的初始值(在側影輪廓線附近),可以通過簡單的修改來達到保證收斂的效果。與之前的算法相比,該算法能提供在原始的物體空間中二次的收斂速度,收斂更快,而且更適合在現在的圖形卡上運行。本發(fā)明方法還可以一次處理大量的分段連續(xù)高次代數曲面,這是以前的算法沒有提到的,并給出了分段多片曲面的一些實驗性建議,可以簡單的推廣到任意次數的代數曲面的繪制。



      圖1是本發(fā)明代數B樣條曲面實時繪制方法的流程圖; 圖2是本發(fā)明側影輪廓線附近插值算法示意圖。

      具體實施例方式 下面結合附圖對本發(fā)明實施例進行詳細說明,本發(fā)明可以在家用電腦的圖形卡硬件中并行處理。
      如圖1所示,一種基于Newton-Raphson迭代算法的代數B樣條曲面的實時繪制方法,包括七個步驟(1)輸入待繪制的代數B樣條曲面的相關信息,計算得到代數B樣條曲面的Lipschitz常數,并通過節(jié)點插入算法將代數B樣條曲面轉換為分片的Bezier曲面片;(2)使用Marching cubes算法抽取代數B樣條曲面的等值面,所述等值面的分辨率為所述的代數B樣條曲面的Lipschitz常數;(3)實時的計算代數B樣條曲面的極曲面;(4)使用DirectX流水線對步驟(2)中的MC算法得到的等值面進行繪制,利用其高效的硬件光柵化算法和Z-Culling技術,得到代數B樣條曲面的等值面的側影輪廓線的初始值;(5)聚集步驟(4)中得到的等值面的側影輪廓線的初始值,根據代數B樣條曲面的極曲面和代數B樣條曲面得到初始的側影輪廓線,使用NR迭代算法對初始的側影輪廓線進行計算,得到代數B樣條曲面的等值面的浮點精度的側影輪廓線,并對側影輪廓線附近的值進行矯正;(6)校正后的側影輪廓線的初始值按照其所屬的Bezier曲面片聚類使用NR迭代算法,得到側影輪廓線的每個像素視線跟每個Bezier曲面的交點;(7)通過NR迭代算法利用鄰接的Bezier曲面信息重新進行迭代求精,得到所有光線與代數B樣條曲面的正確交點,然后再利用交點信息與光源、視點的相對位置以及曲面本身的材質計算光照。
      具體步驟如下 (1)輸入待繪制的代數B樣條曲面的相關信息,計算得到代數B樣條曲面的Lipschitz常數,并通過節(jié)點插入算法將代數B樣條曲面轉換為分段的Bezier曲面片; 所述的代數B樣條代數曲面為如下定義 曲面定義于三維空間的一個矩形域R3=[a1,a2]×[b1,b2]×[c1,c2]上,令X=[x0,x1,…,xm+M+1],Y=[y0,y1,…,yn+N+1],Z=[z0,z1,…,zq+Q+1]表示在x、y和z方向上非遞減節(jié)點向量,則一個分段的代數張量積B樣條曲面表示如(1)式所示 其中Nim(x),Njn(y),Nkq(z)分別表示在節(jié)點向量X、Y和Z上的m、n和q次的B樣條基函數。標量wijk是曲面的權值,與參數曲面的控制頂點有相似的作用。該曲面是張量積的,各個方向都是獨立的,曲面的次數為X、Y和Z三個軸方向上的次數和為M+N+Q,M+N+Q通常會大于4,所以代數B樣條曲面具有次數高、各個方向上高階連續(xù)性等特點。而代數B樣條曲面可以通過節(jié)點插入算法得到等價的分段連續(xù)的Bernstein基表示的Bezier曲面。
      NR迭代算法可以提供二次的收斂速度,也是最常見的求解非線性方程組的方法,但是其算法收斂的要求為良好的初始值,否則算法可能發(fā)散。通過分析NR迭代算法的局部收斂特性性質,得到對一般非線性方程組,只需滿足如下(2)式,算法即可收斂 ||J(x*)-1[J(x)-J(x*)]||≤||J(x*)-1||||[J(x)-J(x*)]|| ......(2) ≤βγ||x-x*|| 其中該系統的解為x*,并且有γ,β>0,使得Jacobi矩陣J(x*)-1存在且||J(x*)-1||≤β,J∈Lipγ(N(x*,r))。
      那么我們在屏幕每一個像素上繪制曲面的時候,需要求解通過屏幕像素的視線方程,與曲面聯立的非線性方程組,經過推導可得該方程的Lipschitz常數(即βγ)。
      所述的屏幕像素的視線方程如(3)式所示 x*=E+dt......(3) 其中E為視點坐標,d為視線方向; 所述的Lipschitz常數(即βγ)如(4)式所示 其中

      為代數B樣條代數曲面函數F(x,y,z)的梯度,HF為代數B樣條代數曲面函數F(x,y,z)的Hessian矩陣,d為繪制的時候相對于每一個像素的視線方向,是d的轉置矩陣,為視線方向與曲面法向的夾角,ε的設定通常會影響線性插值區(qū)域的大小,ε值越大,線性插值來逼近的區(qū)域也就越大,當視線方向與曲面垂直的時候ε為0,也就是側影輪廓線的位置,通常選取ε小于0.1就可以得到滿意的結果。
      在計算的Lipschitz時,涉及到代數B樣條曲面的對于各個方向的二階偏導,且需要計算在其定義域中的Hessian矩陣的最大范數,準確的求解該范數的復雜度非常高,那么我們利用代數B樣條曲面的凸包性,可以使用代數B樣條曲面每個方向二階偏導的系數(即Hessian系數)代替函數值來近似的逼近Lipschitz常數,這樣計算的結果會放大該常數,導致的結果為MC的分辨率變高,經大量實驗驗證,取這種方法得到的常數的一般即可滿足一樣的收斂情況。
      (2)使用Marching cubes算法繪制抽取代數B樣條曲面的等值面,所述等值面的分辨率為所述的代數B樣條曲面的Lipschitz常數; 使用Marching cubes算法(簡稱MC算法)抽取代數B樣條代數曲面(簡稱ABS)的近似逼近,然后使用該等值面作為NR迭代算法(Newton-Raphson迭代算法)的初始值,并計算等值面上所有點的法向。所述的法向Fx、Fy、Fz各個分量為曲面表達式在x、y、z三個方向上的偏導。本方法使用的MC方法得到的ABS(代數B樣條曲面)的等值面上點及其法向均為準確計算,比線性插值更精確。MC算法采樣ABS(代數B樣條曲面)的得到的等值面的分辨率使用的為滿足NR迭代算法收斂要求的Lipschitz常數。
      (3)實時的計算代數B樣條曲面的極曲面; 代數B樣條曲面的極曲面的表達式如(5)式所示 其中,Fw為代數B樣條曲面所對應的齊次曲面對于齊次坐標w的一階偏導,式中E代表視點的坐標,代表法向,各個分量為曲面表達式在x、y、z三個方向上的偏導。
      (4)使用DirectX流水線對步驟(2)中的MC算法得到的等值面進行繪制,利用其高效的硬件光柵化算法和Z-Culling技術,得到代數B樣條曲面的等值面及其側影輪廓線的初始值,所述的初始值能進行良好的NR迭代算法。
      所述的側影輪廓線是指在曲面上其法向與視線方向垂直的位置。
      (5)聚集步驟(4)中得到的等值面的側影輪廓線的初始值,根據代數B樣條曲面及其極曲面方程,使用NR迭代算法對初始的側影輪廓線進行計算,得到代數B樣條曲面的等值面的浮點精度的側影輪廓線,并對側影輪廓線附近的值進行矯正。
      浮點精度指的是上述方程的解得到的側影輪廓線位置是浮點數,該精度遠遠大于屏幕上繪制的像素精度,適合進行反走樣操作。
      由于當Lipschitz常數(即βγ)在ε小于某一閾值的時候,Lipschitz常數就會變得很大,這樣就要求MC所使用的分辨率很高,這樣系統的開銷就很大,否則后續(xù)的NR迭代算法就不能收斂,所以我們使用曲面的側影輪廓線來保證繪制的正確性。
      曲面的初始的側影輪廓線為曲面與其極曲面的交線,如(6)式所示 其中E為視點的坐標,

      為法向各個分量為曲面表達式在x、y、z三個方向上的偏導,Fw定義為曲面所對應的齊次曲面對于齊次坐標w的一階偏導。
      由于在可見的兩個側影輪廓點之間,曲面是連續(xù)可見的,而NR迭代算法在側影輪廓線附近是很難保證收斂的,所以我們在求取側影輪廓線的基礎上,使用線性插值來替換無法收斂的區(qū)域,對側影輪廓線附近的值進行矯正。
      如圖2所示,該圖為算法在某一掃描平面的剖面圖,圖中曲線F(x,y,z)=0為所繪ABS的某一剖面,折線FMC為MC算法得到的等值面的剖面,PMC為等值面上滿足的點,也就是繪制等值面得到的側影輪廓線的初始值,Pε為使用PMC做初始值、通過NR算法得到的、通過屏幕像素(xε,ys)的視線與曲面的真實交點,Ps為使用PMC做初始值、通過NR算法得到的、處于ys掃描線上的側影輪廓線上的點。那么在通過(xs,ys)與(xε,ys)之間的像素的視線與曲面交點的初始值就是在“MC等值面”上、PMC點以后的虛線段表示的,因為無法滿足Lipschitz條件,可能會導致NR算法無法收斂,我們使用Ps與Pε的線性插值(即他們之間的連線)得到對Ps與Pε之間的曲面的良好的近似,因為不收斂的區(qū)域相對較少,這種近似的逼近可以得到較理想的繪制結果。
      對于側影輪廓線的NR迭代算法,我們不僅使用了橫向、縱向兩個方向的輪廓線,而且要針對不同點的信息在不同的方向上使用NR迭代算法。因為側影輪廓線的法向是垂直于視線方向的,其在屏幕平面上的投影就是其真實的法向,收斂圖邊界上點很接近側影輪廓線,其法向也是的側影輪廓線上法向的近似比較,那么我們就根據在MC算法中求得的法向,將其投影到屏幕空間,比較其在屏幕空間中x,y方向的分量大小來確定其是作為橫向還是縱向側影輪廓線。
      (6)將校正后的側影輪廓線的初始值按照其所屬的Bezier曲面片聚類使用NR算法迭代,得到每個像素視線跟每個Bezier曲面的交點。
      NR算法的每一步迭代都計算了曲面的法向信息,并保存該信息。
      由于ABS(代數B樣條曲面)相對于一般的代數曲面具有較多的控制系數,而NR算法的每一次迭代步驟需要將ABS(代數B樣條曲面)系數數據以及其極曲面數據載入到流處理器中計算函數值與法向信息,而使用現有的圖形卡硬件由于其內存機制的限制,無法對每個線程分別載入數據,所以本方法采用了分片曲面繪制時的數據訪問。
      針對CUDA現有的計算能力,將并行的線程數設置為64的倍數,這樣每一個線程內,訪問速度最快的變量——寄存器變量或者shared內存變量的數目就有限制。如果不能使用上述兩種變量,可以使用常數內存或者使用取紋理的方法來載入變量,這兩種方法都有緩存機制加速訪問,最慢的訪問是通過直接讀取顯存的方式。
      因為繪制和求解側影輪廓線時需要使用代數B樣條曲面及其極曲面函數的系數,對于3*3*3的曲面而言,需要4*4*4*2個浮點數,相比于常見的曲面,這些數據量還是比較大的。由于使用NR迭代算法,每一步程序主要代價就是函數值以及法向數據的計算,所以顯存的優(yōu)化訪問是獲取高性能的關鍵步驟。
      顯然在迭代開始之前將所有并行線程的相鄰曲面以及極曲面(在計算側影輪廓線時)數據都載入到處理單元中是不可取的,因為無法確定最近的曲面信息,所以每個線程最多可能有3*3*3-1個相鄰曲面片,這數據規(guī)模是非常大的。如果在程序運行時在根據程序計算結果載入相應的數據,最好也只能使用取紋理的方法來訪問,但是由于可能每個線程訪問的變量位置不同,會影響程序的并行性。
      本發(fā)明使用的算法是基于分片的算法,首先根據初始值將繪制數據按照其所屬曲面片分類,并根據曲面片信息進行排序聚類,這樣屬于同一曲面的數據就可以并行處理,需要訪問的曲面數據也都是一樣的,可以通過最快的shared內存的方式載入。曲面信息的排序聚類我們使用的是cudpp提供的基數排序,這種排序算法使用的是基數排序算法,比較使用于整數的排序。
      (7)通過NR迭代算法利用鄰接的Bezier曲面信息重新進行迭代求精,得到所有視線與代數B樣條曲面的正確交點,然后再利用交點信息與光源、視點的相對位置以及曲面本身的材質計算光照,得到代數B樣條曲線。
      在某些Bezier曲面片的定義域之內,經過NR算法迭代步驟(6)中得到側影輪廓線的每個像素視線和每個Bezier曲面的交點到了鄰接的Bezier曲面片,因此,需要使用NR迭代算法利用鄰接的Bezier曲面片信息重新進行迭代求精,得到最優(yōu)結果,該次NR迭代算法的內存可以使用取紋理的方法。
      當Bezier曲面片在邊界位置出現收斂到
      定義域之外時,則在相鄰曲面再進行一次使用NR算法利用鄰接的Bezier曲面信息重新進行迭代求精,得到最優(yōu)結果。
      由于在NR迭代算法的過程中已經計算了每次迭代結果處的法向,所以只需要簡單的將NR迭代算法的最后一步迭代的法向直接進行光照計算,這也免去了以往算法的一些參數變化或使用一元函數求交的相互轉化的步驟,效率更高。
      走樣問題一般發(fā)生在曲面與背景,曲面自遮擋的地方,顯然這些位置在我們的程序中,側影輪廓線的位置都是已知的,而且已經具有浮點數的精度,所以可以在亞像素級別上做反走樣,側影輪廓線處的曲面的法向與其在屏幕空間中的法向一致,我們可以根據其關于屏幕像素坐標的梯度來做反走樣。
      本技術方案中的代數B樣條曲面具有可表示任意拓撲的光滑曲面、便于進行外形分析與實體造型等優(yōu)點,而實時繪制是此類曲面進入實用領域的關鍵。具有像素精度的光線投射方法可以實現代數曲面的高質量顯示。本發(fā)明提出了代數B樣條曲面的實時GPU光線投射繪制算法。曲面繪制的核心問題為光線與曲面的求交算法,由于高于4次的多項式無法解析求根,所以本發(fā)明使用NR迭代算法,而NR迭代算法的初值由Marchingcubes(MC)算法對原始曲面的逼近得到?;趯R迭代算法的收斂性分析,本發(fā)明算法可以得到給定曲面的能保證NR迭代算法收斂的Lipschitz常數,使用在該常數粒度下的MC算法得到的初始值可以保證使用NR迭代算法求根可以達到二次收斂的效果。對于不能滿足的收斂性要求的初始值(在側影輪廓線附近),可以通過簡單的修改來達到保證收斂的效果。與之前的算法相比,該算法能提供在原始的物體空間中二次的收斂速度,收斂更快,而且更適合在現在的圖形卡上運行。我們的方法還可以一次處理大量的分段連續(xù)高次代數曲面,這是以前的算法沒有提到的,并給出了分段多片曲面的一些實驗性建議。該算法還可以簡單的推廣到任意次數的代數曲面的繪制。
      權利要求
      1.一種代數B樣條曲面的實時繪制方法,該方法包括以下七個步驟
      (1)輸入待繪制的代數B樣條曲面的相關信息,計算得到代數B樣條曲面的Lipschitz常數,并通過節(jié)點插入算法將代數B樣條曲面轉換為分片的Bezier曲面片;
      (2)使用Marching cubes算法抽取代數B樣條曲面的等值面,所述等值面的分辨率為所述的代數B樣條曲面的Lipschitz常數;
      (3)實時的計算代數B樣條曲面的極曲面;
      (4)使用DirectX流水線對步驟(2)中的MC算法得到的等值面進行繪制,利用其高效的硬件光柵化算法和Z-Culling技術,得到代數B樣條曲面的等值面及其側影輪廓線的初始值;
      (5)聚集步驟(4)中得到的等值面的側影輪廓線的初始值,根據代數B樣條曲面及其極曲面方程,使用NR迭代算法對初始的側影輪廓線進行計算,得到代數B樣條曲面的等值面的浮點精度的側影輪廓線,并對側影輪廓線附近的值進行矯正;
      (6)校正后的初始值按照其所屬的Bezier曲面片聚類使用NR迭代算法,得到每個像素的視線跟每個Bezier曲面的交點;
      (7)通過NR迭代算法利用鄰接的Bezier曲面信息重新進行迭代求精,得到所有光線與代數B樣條曲面的正確交點,然后再利用交點信息與光源、視點的相對位置以及曲面本身的材質計算光照。
      2.根據權利要求1所述的代數B樣條曲面的實時繪制方法,其特征在于所繪制的B樣條代數曲面為如下定義
      曲面定義于三維空間的一個矩形域R3=[a1,a2]×[b1,b2]×[c1,c2]上,令Y=[y0,y1,…,yn+N+1],Z=[z0,z1,…,zq+Q+1]表示在x、y和z方向上非遞減節(jié)點向量,則一個分段的代數張量積B樣條曲面表示如(1)式所示
      其中Nim(x),Njn(y),Nkq(z)分別表示在節(jié)點向量X、Y和Z上的m、n和q次的B樣條基函數;標量wijk是曲面的權值;該曲面是張量積的,各個方向都是獨立的,曲面的次數為X、Y和Z三個軸方向上的次數和為M+N+Q,M+N+Q通常會大于4,所以代數B樣條曲面具有次數高、各個方向上高階連續(xù)性等特點;代數B樣條曲面可以通過節(jié)點插入算法得到等價的分段連續(xù)的Bernstein基表示的Bezier曲面。
      3.根據權利要求1所述的代數B樣條曲面的實時繪制方法,其特征在于所述的代數B樣條曲面的Lipschitz常數如(4)式所示
      其中x*為系統的解,并且有γ,β>0,使得J(x*)-1為Jacobi矩陣,且||J(x*)-1||≤β,J∈Lipγ(N(x*,r));
      其中
      為代數B樣條代數曲面函數F(x,y,z)的梯度,HF為代數B樣條代數曲面函數F(x,y,z)的Hessian矩陣,d為繪制的時候相對于每一個像素的光線方向,是d的轉置矩陣,為視線方向與曲面法向的夾角,ε的設定通常會影響線性插值區(qū)域的大小,ε值越大,線性插值來逼近的區(qū)域也就越大,當視線方向與曲面垂直的時候ε為0,也就是側影輪廓線的位置。
      4.根據權利要求1所述的代數B樣條曲面的實時繪制方法,其特征在于根據代數B樣條曲面的極曲面和代數B樣條曲面得到的初始的側影輪廓線表達式如(6)式所示
      其中E為視點的坐標,
      為法向各個分量為曲面表達式在x、y、z三個方向上的偏導,Fw定義為曲面所對應的齊次曲面對于齊次坐標w的一階偏導。
      全文摘要
      本發(fā)明公開了一種基于NR迭代算法的ABS實時繪制方法,包括七步1)輸入待繪制ABS的相關信息并計算Lipschitz常數,將ABS轉換為分片的Bezier曲面片;2)使用MC算法抽取ABS的等值面;3)實時計算ABS的極曲面;4)對等值面進行繪制,得到等值面及其側影輪廓線的初始值;5)聚集等值面的側影輪廓線的初始值,根據ABS及其極曲面方程,使用NR迭代算法對初始側影輪廓線進行計算得到浮點精度的側影輪廓線,并對其進行校正;6)計算側影輪廓線的每個像素視線和Bezier曲面的交點;7)通過NR迭代算法利用鄰接的Bezier曲面信息重新進行迭代求精,得到所有光線與代數B樣條曲面的正確交點,然后再利用交點信息與光源、視點的相對位置以及曲面本身的材質計算光照。本發(fā)明方法能實現任意次數的代數曲面的繪制。
      文檔編號G06T15/00GK101599181SQ200910100228
      公開日2009年12月9日 申請日期2009年7月1日 優(yōu)先權日2009年7月1日
      發(fā)明者衛(wèi)飛飛, 馮結青 申請人:浙江大學
      網友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1