国产精品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>

      以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法

      文檔序號:6633732閱讀:336來源:國知局
      以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法
      【專利摘要】本發(fā)明公開了以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,利用已有直接光照的場景數(shù)據(jù)經(jīng)過采樣生成包含直接光照數(shù)據(jù)的點云文件,點云文件是由內(nèi)存分塊逐步寫出到外存中儲存;將生成的點云文件進行編碼;將編碼后的點云數(shù)據(jù),三維空間的點對應(yīng)三維Z-curve曲線,構(gòu)建一棵八叉樹,存儲到外存文件中;利用構(gòu)建的八叉樹來渲染帶有全局光照效果的場景。本發(fā)明參考Kontkanen提出的核外基于點的一致性全局光照效果渲染的理論方法,對其進行改進、擴充和實踐,優(yōu)化了渲染著色階段的數(shù)據(jù)調(diào)度,使最終能夠在有限的內(nèi)存空間限制下,取得正確的全局光照渲染結(jié)果。
      【專利說明】以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法

      【技術(shù)領(lǐng)域】
      [0001]本發(fā)明涉及圖形學(xué)真實感渲染領(lǐng)域,具體涉及一種以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法。

      【背景技術(shù)】
      [0002]在計算機體系結(jié)構(gòu)的發(fā)展過程中,存儲結(jié)構(gòu)逐漸形成了一種類似于金字塔的結(jié)構(gòu)。上層的存儲部件,空間少,價格高,但速度快;下層的存儲部件,空間大,價格低,但速度慢。通常,計算機內(nèi)存處于“金字塔”的上層,空間小、速度快,外存處于“金字塔”下層,空間大、速度慢。優(yōu)秀的內(nèi)存和外存調(diào)度算法是解決計算機內(nèi)存瓶頸的有效途徑。
      [0003]三維影視動畫作品,帶給觀眾置身于其中的真實感受。在作品的制作過程中,藝術(shù)家們不斷追求場景中接近真實的光照效果?,F(xiàn)實世界中很多物體大部分或者全部被其他物體反射的光照亮,這部分光照被稱為間接光照。全局光照效果是指由直接光照和間接光照共同產(chǎn)生的光照效果,這種光照效果更加符合現(xiàn)實中的場景。比如人物皮膚的次表面散射效果,墻壁上的光影等。全局光照效果比直接光照展示的細(xì)節(jié)更豐富和真實。隨著人們對真實感的追求,以及計算機中復(fù)雜場景模型的出現(xiàn),渲染時間和計算機內(nèi)存占用空間成為制約三維影視作品創(chuàng)作的瓶頸。如何在渲染的效果與時間上找到平衡點,從而加快制作周期,成為影視動畫制作的關(guān)鍵問題。
      [0004]Kajiya于1986年提出渲染方程[The rendering equat1n],描述原始光能傳遞方程。公式(I)描述了如何計算三維場景中某點X處的直接光照值和間接光照值。
      [0005]Lr (x, wr) = Le (x, wr) + f fiLr (x1 , -Wi) f (x, Wi, wr) cos Θ ^wi 公式(I)
      [0006]Le (x, wr)表示點X在方向W1^上對外福射的總能量,f (X,Wi, wr)表示光線發(fā)生變化的方程,描述了光源處發(fā)射的光線與場景中的物體相互作用,Qi表示入射光線與點X所在表面的夾角,是已知量;L1Xx' , -Wi)表不從周圍表面?zhèn)鬟f來的光照,是求解全局光照的關(guān)鍵;LJX,k)為點X處的最終全局光照值。但此方程是無法通過直接求解得到全局光照結(jié)果O
      [0007]Christensen 在文章[Point-based approximate color bleeding]中提出基于點的全局光照方法。該方法分為兩步進行,第一步生成點云文件,點云文件保存了帶有直接光照的三維場景信息;第二步利用前面生成的點云文件計算全局光照效果。由于計算簡單,該算法與傳統(tǒng)的計算全局光照的算法相比,在時間及內(nèi)存方面占有很大優(yōu)勢,被廣泛應(yīng)用于影視動畫的制作中。但隨著大規(guī)模復(fù)雜場景的出現(xiàn),所使用的點云文件會越來越大,是該算法的內(nèi)存瓶頸。在電影《功夫熊貓2》的制作過程中,一個復(fù)雜場景生成的點云文件達到了 88G。
      [0008]為了在有限的內(nèi)存空間,正確有效的進行全局光照的計算,Kontkanen在文章[Coherent Out-of-Core Point-Based Global Illuminat1n]中提出了核外基于點的一致性全局光照渲染方法。采用特殊的方法來構(gòu)建八叉樹的數(shù)據(jù)結(jié)構(gòu),利用這樣的數(shù)據(jù)結(jié)構(gòu)組織點云文件,將三維空間中的點進行編碼壓縮到一維空間,以最少的內(nèi)存將點云文件的數(shù)據(jù)組織成一棵八叉樹,并采用分塊的方法將八叉樹存儲在磁盤上,在渲染時采用類似于緩存的方法,對點云文件進行有效的內(nèi)外存調(diào)度。
      [0009]基于內(nèi)外存調(diào)度的渲染方法成為將來渲染的必要選擇,但這種渲染方式,需要大量的I/o操作。聚類點云數(shù)據(jù)時,傳統(tǒng)的自頂向下的八叉樹構(gòu)建方式效率非常低。如何以最少的I/o操作正確構(gòu)建八叉樹,并提高內(nèi)外存調(diào)度的命中率,成為提高渲染效率的關(guān)鍵。


      【發(fā)明內(nèi)容】

      [0010]為解決現(xiàn)有技術(shù)存在的不足,本發(fā)明公開了以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,當(dāng)渲染大規(guī)模場景時,生成中間文件的大小遠遠大于內(nèi)存空間,參考Kontkanen提出的核外基于點的一致性全局光照效果渲染的理論方法,對該項功能進行擴充和實踐,優(yōu)化了渲染著色階段的數(shù)據(jù)調(diào)度,使最終能夠在有限的內(nèi)存空間限制下,取得正確的全局光照渲染結(jié)果。
      [0011]為實現(xiàn)上述目的,本發(fā)明的具體方案如下:
      [0012]以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,包括以下步驟:
      [0013]步驟一:利用已有直接光照的場景數(shù)據(jù)經(jīng)過采樣生成包含直接光照數(shù)據(jù)的點云文件,點云文件是由內(nèi)存分塊逐步寫出到外存中儲存;
      [0014]步驟二:將步驟一中生成的點云文件進行Morton編碼,使外存中存放的點云文件是有序的Morton編碼;
      [0015]步驟三:步驟二中Morton編碼后的點云文件,其數(shù)據(jù)點三維空間的信息對應(yīng)三維Z-curve曲線,以內(nèi)外存交換的方式構(gòu)建一棵八叉樹,最后整棵點云樹層次結(jié)構(gòu)存儲到外存文件中;
      [0016]步驟四:利用步驟三中構(gòu)建的八叉樹來渲染帶有全局光照效果的場景。
      [0017]所述步驟一具體包括如下步驟:
      [0018]步驟(1.1):使用的建模工具導(dǎo)出物體幾何信息被細(xì)分成了小面片,利用渲染引擎渲染三維場景,場景中物體幾何的小面片信息擁有了直接光照效果后對小面片進行采樣,保存采樣點的法向、面積、位置即取中心點以及直接光照值;
      [0019]步驟(1.2):將保存到內(nèi)存中的采樣點信息存儲到外存中,以點云文件的形式存放。
      [0020]所述步驟二具體包括如下步驟:
      [0021]步驟(2.1):首先將步驟一中生成的點云文件中的點進行Morton編碼預(yù)處理,將點云文件中緩存的點的位置是浮點類型進行空間映射變換為正整數(shù);
      [0022]步驟(2.2):將點云坐標(biāo)轉(zhuǎn)換到正整數(shù)空間后,依次沿著x,y,z方向,轉(zhuǎn)化為二進制表示形式,然后將三維數(shù)據(jù)轉(zhuǎn)化為一維空間中二進制數(shù)據(jù);
      [0023]步驟(2.3):將點云數(shù)據(jù)轉(zhuǎn)化為Morton編碼后,對編碼后的點云數(shù)據(jù)進行排序,得到有序的Morton編碼。
      [0024]所述步驟三中:得到Morton編碼有序的點云文件后,三維空間的點對應(yīng)三維Z-curve曲線,隱含了一棵空間八叉樹,邊讀入有序的點,邊通過深度優(yōu)先遍歷的方法自底向上構(gòu)建八叉樹。
      [0025]所述步驟四包括以下步驟:
      [0026]步驟(4.1):在進行渲染著色時,可利用多核處理器的多線程同時進行多個著色點的渲染著色;
      [0027]步驟(4.2):在多個線程在遍歷八叉樹時,同時訪問葉子結(jié)點和中間結(jié)點,由于只能加載八叉樹的部分區(qū)域到內(nèi)存中,葉子結(jié)點和中間結(jié)點被分別進行隱式分頁處理,各個線程訪問時,需要保證同一時刻只有一個線程能訪問該內(nèi)存頁;
      [0028]步驟(4.3):在內(nèi)存的調(diào)度方式上,采用二級緩存的思想進行調(diào)度,即共享緩存之上每個線程有自己的局部緩存,當(dāng)一個線程需要訪問某一頁,首先從其本身的局部緩存進行查找,如果該頁沒有找到,訪問共享緩存進行查找,共享緩存或者直接提供查找的頁,或者從磁盤中加載到共享緩存中,由于在著色時,訪問的中間結(jié)點次數(shù)要多于葉子結(jié)點,所以將3/4的內(nèi)存分配給中間結(jié)點,1/4的內(nèi)存分配給葉子中的點。
      [0029]所述步驟(2.1)中將點云文件中緩存的點的位置是浮點類型進行空間映射變換為正整數(shù),具體為:根據(jù)三維場景按坐標(biāo)軸對齊的包圍盒,將點云中的點轉(zhuǎn)換到正整數(shù)空間,在引擎構(gòu)建場景樹時,獲取整個場景空間的包圍盒,對X,y,Z方向的數(shù)據(jù)均擴大221整數(shù)倍,使用64-bit的二進制數(shù)來表示點云文件中的點,變換方法如公式(2)所示:
      [0030]coordinate[i] = (unsigned int)(p[i]-worldB min[i])/
      [0031](worldB max [i] -worldB min[i])*221 公式(2)
      [0032]其中,p[i]是所要轉(zhuǎn)換的浮點數(shù)坐標(biāo),i = 0,1,2下標(biāo)表示點位置的X、y、z坐標(biāo),wordB max和wordB min分別表示場景按坐標(biāo)軸對齊包圍盒的兩個最大點和最小點,coordinate是映射得到的整數(shù)坐標(biāo)。
      [0033]所述步驟(2.3)中對編碼后的點云數(shù)據(jù)進行排序,使用外部排序,采用一種N-路歸并的方法,具體:首先將點數(shù)據(jù)劃分為幾個塊,保證每塊能完全加載到內(nèi)存中,先將每一塊中的Morton編碼排序,最后將所有的塊合并比較,進行整體排序,得到整體有序的Morton 編碼。
      [0034]所述自底向上構(gòu)建八叉樹時,處理葉子結(jié)點,具體為:
      [0035]首先加載8個點到一個隊列中,隊列具有先進先出的性質(zhì),從根節(jié)點進行深度優(yōu)先遍歷,遞歸分解八叉樹,直到找到一個結(jié)點不包含隊列中的所有點,隨著遞歸分解八叉樹的同時,父節(jié)點被壓入棧中,為了找到滿足條件的結(jié)點,只需要測試隊列中的最后一個點是否在這個結(jié)點中,如果最后一個點在則隊列中的所有點都在,此時需要進一步分解八叉樹,始終從這棵樹的左下角進行查找,因為當(dāng)找到第一個不包含最后一個點的結(jié)點,這個點即為葉子結(jié)點,將葉子點寫入磁盤文件中,并記錄葉子結(jié)點中第一個點的索引信息和葉子結(jié)點中點的數(shù)量,一旦葉子點構(gòu)建完成葉子結(jié)點中包含的點不會再被訪問到,讀入余下的點到處理隊列中,繼續(xù)訪問該葉子點的兄弟,如果包含的點小于等于8個點,兄弟結(jié)點成為下一個葉子結(jié)點,否則繼續(xù)遞歸分解八叉樹,直到找到一個結(jié)點包含的隊列中的點小于等于8個。
      [0036]所述自底向上構(gòu)建八叉樹時,當(dāng)處理完葉子結(jié)點,逐步向上遞歸,構(gòu)建中間結(jié)點,根據(jù)其葉子結(jié)點進行聚類計算,計算點的位置、法向、顏色、面積信息的平均值,并將構(gòu)建好的中間結(jié)點寫入磁盤文件中,并將其直接孩子結(jié)點從內(nèi)存中釋放,當(dāng)所有點被處理完時,所有的中間結(jié)點也被寫入磁盤文件中。
      [0037]所述步驟(4.1)中:控制是否繼續(xù)向下遍歷如公式(3)所示:
      [0038]solidAngle = S2/distance 公式(3)
      [0039]其中solidAngle表示閾值,S2是結(jié)點面積的平方,distance是結(jié)點位置到著色點位置的距離。
      [0040]如果solidAngle小于等某個閾值,則判斷該八叉樹結(jié)點的光照能否傳遞到著色點上,如果能,則將其光照值累加到著色點的全局光照值中,否則忽略,solidAngle大于某個閾值時,需要繼續(xù)向下遍歷八叉樹,遍歷新的結(jié)點,重復(fù)此項判斷,直到葉子結(jié)點,葉子結(jié)點直接判斷該結(jié)點是否能傳遞到著色點,如果能,則將其光照值累加到著色點的全局光照值中,否則忽略它。
      [0041 ] 本發(fā)明的有益效果:
      [0042]1.本發(fā)明提出了內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果渲染的具體實施方法。當(dāng)渲染大規(guī)模場景時,生成中間文件的大小遠遠大于內(nèi)存空間,參考Kontkanen提出的核外基于點的一致性全局光照效果渲染的理論方法,對其進行改進、擴充和實踐,優(yōu)化了渲染著色階段的數(shù)據(jù)調(diào)度,使最終能夠在有限的內(nèi)存空間限制下,取得正確的全局光照渲染結(jié)果。
      [0043]2.本發(fā)明提出的內(nèi)外存調(diào)度策略和方法能夠有效的提升內(nèi)外存交換實現(xiàn)基于點的全局光照效果的渲染速度。

      【具體實施方式】
      :
      [0044]下面對本發(fā)明進行詳細(xì)說明:
      [0045]采用大規(guī)模點云進行全局光照渲染時,內(nèi)外存之間的互相交換是渲染速度的瓶頸。整個渲染周期中,內(nèi)外存數(shù)據(jù)的調(diào)度可分為三個階段。首先,第一階段的內(nèi)外存交換數(shù)據(jù)發(fā)生在第一步生成點云文件,從內(nèi)存中將點的數(shù)據(jù)以分塊的形式寫出到外存的文件中。
      [0046]第二階段的內(nèi)外存交換發(fā)生在生成點云文件后,將點云數(shù)據(jù)從外存讀入到內(nèi)存中,點數(shù)量很大時,構(gòu)建八叉樹過程中內(nèi)外存之間的交換非常耗時,如何盡可能的減少內(nèi)外存的交換,成為我們優(yōu)先需要考慮的問題。由于有序的Morton編碼能映射到空間Z-curve曲線,而Z-curve曲線又隱含了一顆八叉樹,可以實現(xiàn)一邊從外存的點云文件讀入數(shù)據(jù)到內(nèi)存,一邊自底向上在內(nèi)存中構(gòu)建八叉樹的方法。并在構(gòu)建樹的過程中,將這棵八叉樹的葉子結(jié)點和中間結(jié)點分別隱含分頁的形式換到磁盤文件中,及時釋放暫時不用的內(nèi)存。
      [0047]最后一階段內(nèi)外存交換發(fā)生在利用點云文件計算全局光照。進行全局光照渲染時,需要計算著色點的全局光照值。全局光照值存放在前一步構(gòu)建好的八叉樹中,按照樹節(jié)點與著色點間的距離和樹結(jié)點代表的面積這兩者作為影響因子,調(diào)整八叉樹的遍歷程度??紤]到整個內(nèi)存大小是一定的,構(gòu)建好的八叉樹不能全部放入到內(nèi)存中。而八叉樹的中間結(jié)點比葉子結(jié)點的訪問量大,我們將內(nèi)存的3/4分配給中間結(jié)點,1/4分配給葉子結(jié),按照最近最少使用的調(diào)度策略,即:把最近一段時間使用次數(shù)最少的結(jié)點切換到外存中,把需要的結(jié)點換入到內(nèi)存中。
      [0048]一種以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法包括以下幾個步驟:
      [0049]步驟(I):基于點的全局光照效果渲染方法分兩步進行,第一步是利用已有直接光照的場景數(shù)據(jù)經(jīng)過采樣生成包含直接光照數(shù)據(jù)的點云文件。第二步根據(jù)點云文件進行全局光照效果的計算。由于點云文件是由內(nèi)存分塊逐步寫出到外存中儲存。
      [0050]步驟⑵:將步驟(I)中生成好的點云文件進行Morton編碼;
      [0051]步驟⑶:將步驟⑵中Morton編碼后的點云數(shù)據(jù)對應(yīng)三維Z-curve曲線,構(gòu)建一棵八叉樹,存儲到外存(如磁盤)文件中;
      [0052]步驟(4):利用步驟(3)中構(gòu)建的八叉樹來渲染帶有全局光照效果的場景。
      [0053]所述步驟(I)包括如下步驟:
      [0054]步驟(1.1):利用渲染引擎渲染三維場景,場景中物體幾何的小面片信息擁有了直接光照效果后(這里要求所使用的建模工具導(dǎo)出的物體幾何信息被細(xì)分成了小面片),對小面片進行采樣,保存采樣點的法向、面積、位置(取中心點)以及直接光照值。
      [0055]步驟(1.2):將保存到內(nèi)存中的采樣點信息存儲到外存中,以點云文件的形式存放。
      [0056]所述步驟(2)包括如下步驟:
      [0057]步驟(2.1):Morton編碼:首先將步驟(I)中生成的點云文件中的點進行Morton編碼預(yù)處理,Morton編碼的對象需要是正整數(shù),點云文件中緩存的點的位置是浮點類型,需要進行空間映射。根據(jù)場景的包圍盒,將點云中的點轉(zhuǎn)換到正整數(shù)空間。在引擎構(gòu)建場景樹時,獲取整個場景空間的包圍盒。對X,y, z方向的數(shù)據(jù)均擴大221整數(shù)倍,使用64-bit的二進制數(shù)來表示點云文件中的點,變換方法如公式(2)所示:
      [0058]coordinate [i] = (unsigned int) (p[i]-worldB min[i])/
      [0059](worldB max [i] -worldB min[i])*221 公式(2)
      [0060]其中,p[i]是所要轉(zhuǎn)換的浮點數(shù)坐標(biāo),i = 0,1,2下標(biāo)表示點位置的X、y、z坐標(biāo),wordB max和wordB min分別表示場景按坐標(biāo)軸對齊包圍盒的兩個最大點和最小點,coordinate是映射得到的整數(shù)坐標(biāo)。
      [0061]步驟(2.2):將點云坐標(biāo)轉(zhuǎn)換到正整數(shù)空間后,依次沿著x,y,z方向,轉(zhuǎn)化為二進制表示形式,然后將三維數(shù)據(jù)轉(zhuǎn)化為一維空間中64bit長度的二進制數(shù)據(jù)。轉(zhuǎn)化方式以2-bit表示的點(X1X0,Y1Y0, Z1Z0),轉(zhuǎn)換為6-bit表示的Morton編碼為例,結(jié)果是一個二進制整數(shù):Z1Y1X1Z0Y0X0。
      [0062]步驟(2.3):將點云數(shù)據(jù)轉(zhuǎn)化為Morton編碼后,對編碼后的點云數(shù)據(jù)進行排序,得到有序的Morton編碼。但在處理大規(guī)模點云數(shù)據(jù)時,內(nèi)存通常不夠,所以我們需要使用外部排序。這里采用一種N-路歸并的方法。首先將點數(shù)據(jù)劃分為幾個塊,保證每塊能完全加載到內(nèi)存中,先將每一塊中的Morton編碼排序,最后將所有的塊合并比較,進行整體排序,得到整體有序的Morton編碼。
      [0063]所述步驟(3)包括如下步驟:
      [0064]步驟(3.1):得到Morton編碼有序的點云文件后,三維空間的點對應(yīng)三維Z-curve曲線,隱含了一棵空間八叉樹,我們邊讀入有序的點,邊通過深度優(yōu)先遍歷的方法自底向上構(gòu)建八叉樹。首先加載8個點到一個隊列(隊列具有先進先出的性質(zhì))中,從根節(jié)點進行深度優(yōu)先遍歷,遞歸分解八叉樹,直到找到一個結(jié)點不包含隊列中的所有點,隨著遞歸分解八叉樹的同時,父節(jié)點被壓入棧中。為了找到滿足條件的結(jié)點,只需要測試隊列中的最后一個點是否在這個結(jié)點中,如果最后一個點在則隊列中的所有點都在,此時需要進一步分解八叉樹,始終從這棵樹的左下角進行查找,因為當(dāng)找到第一個不包含最后一個點的結(jié)點,這個點即為葉子結(jié)點。將葉子點寫入磁盤文件中,并記錄葉子結(jié)點中第一個點的索引信息和葉子結(jié)點中點的數(shù)量。一旦葉子點構(gòu)建完成葉子結(jié)點中包含的點不會再被訪問到。讀入余下的點到處理隊列中,繼續(xù)訪問該葉子點的兄弟,如果包含的點小于等于8個點,兄弟結(jié)點成為下一個葉子結(jié)點。否則繼續(xù)遞歸分解八叉樹,直到找到一個結(jié)點包含的隊列中的點小于等于8個。
      [0065]步驟(3.2)當(dāng)處理完葉子結(jié)點,逐步向上遞歸,構(gòu)建中間結(jié)點,根據(jù)其葉子結(jié)點進行聚類計算,計算點的位置、法向、顏色、面積等信息的平均值,并將構(gòu)建好的中間結(jié)點寫入磁盤文件中,并將其孩子結(jié)點從內(nèi)存中釋放。當(dāng)所有點被處理完時,所有的中間結(jié)點也被寫入磁盤文件中。只需按Morton編碼的順序訪問點一遍,便可按照深度優(yōu)先遍歷的方式,自底向上后序構(gòu)建起八叉樹。
      [0066]所述步驟(4)包括如下步驟:
      [0067]步驟(4.1):在進行渲染著色時,可利用多核處理器的多線程同時進行多個著色點的渲染著色。根據(jù)著色點與八叉樹中各個結(jié)點距離distance和結(jié)點面積S作為影響因子,控制遍歷八叉樹的遍歷深度??刂剖欠窭^續(xù)向下遍歷如公式(3)所示:
      [0068]solidAngle = S2/distance 公式(3)
      [0069]其中solidAngle表示閾值,S2是結(jié)點面積的平方,distance是結(jié)點位置到著色點位置的距離;
      [0070]如果so I i dAngle小于等某個閾值(如0.05),則判斷該八叉樹結(jié)點的光照能否傳遞到著色點上,如果能,則將其光照值累加到著色點的全局光照值中,否則忽略。solidAngle大于某個閾值時,我們需要繼續(xù)向下遍歷八叉樹,遍歷新的結(jié)點,重復(fù)此項判斷,直到葉結(jié)點。葉子結(jié)點直接判斷該結(jié)點是否能傳遞到著色點,如果能,則將其光照值累加到著色點的全局光照值中,否則忽略它。
      [0071]步驟(4.2):在多個線程在遍歷八叉樹時,同時訪問葉子結(jié)點和中間結(jié)點,由于只能加載八叉樹的部分區(qū)域到內(nèi)存中,葉子結(jié)點和中間結(jié)點被分別進行隱式分頁處理。各個線程訪問時,需要保證同一時刻只有一個線程能訪問該內(nèi)存頁。
      [0072]步驟(4.3):在內(nèi)存的調(diào)度方式上,我們采用二級緩存的思想進行調(diào)度,即共享緩存之上每個線程有自己的局部緩存。當(dāng)一個線程需要訪問某一頁,首先從其本身的局部緩存進行查找,如果該頁沒有找到,訪問共享緩存進行查找,共享緩存或者直接提供查找的頁,或者從磁盤中加載到共享緩存中,由于在著色時,訪問的中間結(jié)點次數(shù)要多于葉子結(jié)點,所以將3/4的內(nèi)存分配給中間結(jié)點,1/4的內(nèi)存分配給葉子中的點,將內(nèi)存平均分為兩部分,一半分給共享緩存,另一半平均分給每個線程。
      [0073]考慮到整個內(nèi)存大小是一定的,如果分出一半作為共享緩存,每個局部線程的緩存大小會減少,而且每個線程緩存之間不能互相訪問,內(nèi)存資源沒有被充分利用。我們將內(nèi)存的3/4分配給中間結(jié)點,1/4分配給葉子中的點,根據(jù)最近最少使用者換出的調(diào)度策略(LRU),進行內(nèi)外存調(diào)度。在對葉結(jié)點緩存及中間結(jié)點緩存加鎖時,只對當(dāng)前需要換入換出的內(nèi)存頁面進行加鎖。記錄每個內(nèi)存頁面當(dāng)前訪問的線程數(shù),當(dāng)沒有線程訪問且符合LRU策略時,將該頁換出。
      【權(quán)利要求】
      1.以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,包括以下步驟: 步驟一:利用已有直接光照的場景數(shù)據(jù)經(jīng)過采樣生成包含直接光照數(shù)據(jù)的點云文件,點云文件是由內(nèi)存分塊逐步寫出到外存中儲存; 步驟二:將步驟一中生成的點云文件進行Morton編碼,使外存中存放的點云文件是有序的Morton編碼; 步驟三:步驟二中Morton編碼后的點云文件,其數(shù)據(jù)點三維空間的信息對應(yīng)三維Z-curve曲線,以內(nèi)外存交換的方式構(gòu)建一棵八叉樹,最后整棵點云樹層次結(jié)構(gòu)存儲到外存文件中; 步驟四:利用步驟三中構(gòu)建的八叉樹來渲染帶有全局光照效果的場景。
      2.如權(quán)利要求1所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述步驟一具體包括如下步驟: 步驟(1.1):使用的建模工具導(dǎo)出物體幾何信息被細(xì)分成了小面片,利用渲染引擎渲染三維場景,場景中物體幾何的小面片信息擁有了直接光照效果后對小面片進行采樣,保存采樣點的法向、面積、位置即取中心點以及直接光照值; 步驟(1.2):將保存到內(nèi)存中的采樣點信息存儲到外存中,以點云文件的形式存放。
      3.如權(quán)利要求1所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述步驟二具體包括如下步驟: 步驟(2.1):首先將步驟一中生成的點云文件中的點進行Morton編碼預(yù)處理,將點云文件中緩存的點的位置是浮點類型進行空間映射變換為正整數(shù); 步驟(2.2):將點云坐標(biāo)轉(zhuǎn)換到正整數(shù)空間后,依次沿著x,y,z方向,轉(zhuǎn)化為二進制表示形式,然后將三維數(shù)據(jù)轉(zhuǎn)化為一維空間中二進制數(shù)據(jù); 步驟(2.3):將點云數(shù)據(jù)轉(zhuǎn)化為Morton編碼后,對編碼后的點云數(shù)據(jù)進行排序,得到有序的Morton編碼。
      4.如權(quán)利要求1所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述步驟三中:得到Morton編碼有序的點云文件后,三維空間的點對應(yīng)三維Z-curve曲線,隱含了一棵空間八叉樹,邊讀入有序的點,邊通過深度優(yōu)先遍歷的方法自底向上構(gòu)建八叉樹。
      5.如權(quán)利要求1所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述步驟四包括以下步驟: 步驟(4.1):在進行渲染著色時,可利用多核處理器的多線程同時進行多個著色點的渲染著色; 步驟(4.2):在多個線程在遍歷八叉樹時,同時訪問葉子結(jié)點和中間結(jié)點,由于只能加載八叉樹的部分區(qū)域到內(nèi)存中,葉子結(jié)點和中間結(jié)點被分別進行隱式分頁處理,各個線程訪問時,需要保證同一時刻只有一個線程能訪問該內(nèi)存頁; 步驟(4.3):在內(nèi)存的調(diào)度方式上,采用二級緩存的思想進行調(diào)度,即共享緩存之上每個線程有自己的局部緩存,當(dāng)一個線程需要訪問某一頁,首先從其本身的局部緩存進行查找,如果該頁沒有找到,訪問共享緩存進行查找,共享緩存或者直接提供查找的頁,或者從磁盤中加載到共享緩存中,由于在著色時,訪問的中間結(jié)點次數(shù)要多于葉子結(jié)點,所以將3/4的內(nèi)存分配給中間結(jié)點,1/4的內(nèi)存分配給葉子中的點。
      6.如權(quán)利要求3所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述步驟(2.1)中將點云文件中緩存的點的位置是浮點類型進行空間映射變換為正整數(shù),具體為:根據(jù)場景的包圍盒,將點云中的點轉(zhuǎn)換到正整數(shù)空間,在引擎構(gòu)建場景樹時,獲取整個場景空間的包圍盒,對X,y, z方向的數(shù)據(jù)均擴大221整數(shù)倍,使用64-bit的二進制數(shù)來表示點云文件中的點,變換方法如公式(2)所示:
      coordinate[i] = (unsigned int)(p[i]-worldB min[i])/
      (worldB max [i] -worldB min[i])*221 公式(2) 其中,P[i]是所要轉(zhuǎn)換的浮點數(shù)坐標(biāo),i = 0,1,2下標(biāo)表示點位置的x、y、z坐標(biāo),wordBmax和wordB min分別表示場景按坐標(biāo)軸對齊包圍盒的兩個最大點和最小點,coordinate是映射得到的整數(shù)坐標(biāo)。
      7.如權(quán)利要求3所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述步驟(2.3)中對編碼后的點云數(shù)據(jù)進行排序,使用外部排序,采用一種N-路歸并的方法,具體:首先將點數(shù)據(jù)劃分為幾個塊,保證每塊能完全加載到內(nèi)存中,先將每一塊中的Morton編碼排序,最后將所有的塊合并比較,進行整體排序,得到整體有序的Morton編碼。
      8.如權(quán)利要求4所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述自底向上構(gòu)建八叉樹時,處理葉子結(jié)點,具體為: 首先加載8個點到一個隊列中,隊列具有先進先出的性質(zhì),從根節(jié)點進行深度優(yōu)先遍歷,遞歸分解八叉樹,直到找到一個結(jié)點不包含隊列中的所有點,隨著遞歸分解八叉樹的同時,父節(jié)點被壓入棧中,為了找到滿足條件的結(jié)點,只需要測試隊列中的最后一個點是否在這個結(jié)點中,如果最后一個點在則隊列中的所有點都在,此時需要進一步分解八叉樹,始終從這棵樹的左下角進行查找,因為當(dāng)找到第一個不包含最后一個點的結(jié)點,這個點即為葉子結(jié)點,將葉子點寫入磁盤文件中,并記錄葉子結(jié)點中第一個點的索引信息和葉子結(jié)點中點的數(shù)量,一旦葉子點構(gòu)建完成葉子結(jié)點中包含的點不會再被訪問到,讀入余下的點至1J處理隊列中,繼續(xù)訪問該葉子點的兄弟,如果包含的點小于等于8個點,兄弟結(jié)點成為下一個葉子結(jié)點,否則繼續(xù)遞歸分解八叉樹,直到找到一個結(jié)點包含的隊列中的點小于等于8個。
      9.如權(quán)利要求8所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述自底向上構(gòu)建八叉樹時,當(dāng)處理完葉子結(jié)點,逐步向上遞歸,構(gòu)建中間結(jié)點,根據(jù)其葉子結(jié)點進行聚類計算,計算點的位置、法向、顏色、面積信息的平均值,并將構(gòu)建好的中間結(jié)點寫入磁盤文件中,并將其直接孩子結(jié)點從內(nèi)存中釋放,當(dāng)所有點被處理完時,所有的中間結(jié)點也被寫入磁盤文件中。
      10.如權(quán)利要求5所述的以內(nèi)外存交換方式實現(xiàn)基于點的全局光照效果的渲染方法,其特征是,所述步驟(4.1)中:控制是否繼續(xù)向下遍歷如公式(3)所示: solidAngle = S2/distance 公式(3) 其中,用solidAngle表示閾值,S2是結(jié)點面積的平方,distance是結(jié)點位置到著色點位置的距離; 如果閾值solidAngle小于等某個閾值,則判斷該八叉樹結(jié)點的光照能否傳遞到著色點上,如果能,則將其光照值累加到著色點的全局光照值中,否則忽略,solidAngle大于某個閾值時,需要繼續(xù)向下遍歷八叉樹,遍歷新的結(jié)點,重復(fù)此項判斷,直到葉子結(jié)點,葉子結(jié)點直接判斷該結(jié)點是否能傳遞到著色點,如果能,則將其光照值累加到著色點的全局光照值中,否則忽略它。
      【文檔編號】G06T15/50GK104392480SQ201410634696
      【公開日】2015年3月4日 申請日期:2014年11月12日 優(yōu)先權(quán)日:2014年11月12日
      【發(fā)明者】王佩, 王璐, 徐延寧 申請人:山東地緯數(shù)碼科技有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1