一種面向可編程著色器的多光源加速方法
【專利摘要】本發(fā)明提供了一種面向可編程著色器的多光源加速方法,在可編程著色器環(huán)境下實(shí)現(xiàn)了Lightcuts算法,通過將光源聚類成樹形結(jié)構(gòu),然后再對(duì)光源樹進(jìn)行裁剪,減少實(shí)際渲染的光源數(shù)目,能夠?qū)秩緯r(shí)間與光源數(shù)目的關(guān)系降為亞線性,而且穩(wěn)定性比較好,在大部分情況下都能有良好的加速效果。其次,實(shí)驗(yàn)發(fā)現(xiàn)對(duì)于場(chǎng)景中陰影部分的渲染,算法的加速效果并不理想,針對(duì)此問題進(jìn)行優(yōu)化。最后,本發(fā)明將同一物體上相近的點(diǎn)分組進(jìn)行渲染,進(jìn)一步提高效率。
【專利說明】一種面向可編程著色器的多光源加速方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及圖形學(xué)真實(shí)感渲染領(lǐng)域,具體涉及一種典型的基于層次結(jié)構(gòu)的多光源 加速方法。
【背景技術(shù)】
[0002] 在大規(guī)模場(chǎng)景的渲染中,光源數(shù)目的增長(zhǎng)會(huì)導(dǎo)致渲染時(shí)間隨之線性增長(zhǎng),對(duì)于一 些復(fù)雜的光照效果,這樣的渲染時(shí)間是不能接受的。本發(fā)明屬于真實(shí)感渲染系統(tǒng)中渲染引 擎研發(fā)部分的工作,引擎在渲染多光源場(chǎng)景時(shí),并沒有對(duì)多光源進(jìn)行優(yōu)化處理,導(dǎo)致渲染速 度難以接受。為了節(jié)約成本,提高效率,本發(fā)明針對(duì)基于Renderman規(guī)范的渲染引擎,實(shí)現(xiàn) 了多光源場(chǎng)景的加速方案。
[0003] 對(duì)于多光源場(chǎng)景渲染的優(yōu)化有多種方法,文章 [A general version of crow' s shadow volumes]中Bergeron提出了為光源設(shè)置一個(gè)影響半徑的方法,在影響半徑內(nèi)的物 體會(huì)受到光源照射,否則不去考慮該光源的影響,這樣會(huì)導(dǎo)致大量低亮度光源產(chǎn)生的光照 效果被忽視;文章 [Adaptive shadow testing for ray tracing]中 Ward 提出了為所有 光源建立一個(gè)貢獻(xiàn)表,只考慮貢獻(xiàn)比較大的光源。當(dāng)光源的數(shù)目很多的時(shí)候,求貢獻(xiàn)值將 耗費(fèi)大量時(shí)間;文章 [Monte carlo techniques for direct lighting calculation]中 Shirley把光源根據(jù)影響半徑分為重要和不重要兩類,對(duì)兩類光源分別采樣,不過采樣數(shù) 量不合適會(huì)帶來走樣的問題;文章 [A light hierarchy for fast rendering of scenes with many lights]中Paquette提出了基于樹形層次結(jié)構(gòu)的優(yōu)化算法,但是并不支持陰影 效果,極大的限制了其使用范圍。
[0004] 文章 [Lightcuts in blender]中 Davide 對(duì) Lightcuts 算法在 Blender 引擎中的 實(shí)現(xiàn)方式和應(yīng)用范圍作出了簡(jiǎn)要的介紹。但是Blender引擎的著色器是內(nèi)置的,不如可編 程著色器靈活易用。文獻(xiàn)中并沒有提出在可編程著色器環(huán)境下的算法的實(shí)現(xiàn)方案。而且文 獻(xiàn)也提出Blender中實(shí)現(xiàn)的Lightcuts算法在實(shí)際應(yīng)用中加速效果并不如預(yù)想的明顯。
[0005] 本發(fā)明在分析和對(duì)比了多種多光源優(yōu)化算法后,選擇了基于層級(jí)結(jié)構(gòu)的 Lightcuts算法作為研究基礎(chǔ)。該算法是基于二叉樹結(jié)構(gòu)的光源聚類優(yōu)化方法,具有良好的 加速效果,而且算法的普適性較強(qiáng),對(duì)大多數(shù)場(chǎng)景的渲染都可以優(yōu)化。算法能夠通過錯(cuò)誤閾 值參數(shù)的調(diào)節(jié)來對(duì)優(yōu)化程度進(jìn)行控制,便于實(shí)際工程使用。
[0006] Lightcuts算法基礎(chǔ)是韋伯原理,即人類可以感知到的最小的亮度變化大概為當(dāng) 前亮度的1 %,算法中一般選取〇. 02作為誤差閾值的參數(shù),光源集合產(chǎn)生的光照小于0. 02 倍的總亮度則可以認(rèn)為能夠簡(jiǎn)化計(jì)算。算法在每?jī)蓚€(gè)光源之間計(jì)算一個(gè)權(quán)值,該權(quán)值與兩 光源距離和亮度相關(guān)。然后根據(jù)權(quán)值把光源聚類成一棵二叉樹。在對(duì)點(diǎn)進(jìn)行渲染時(shí),從光 源樹的根節(jié)點(diǎn)開始,根據(jù)韋伯原理判斷是否對(duì)節(jié)點(diǎn)進(jìn)行分裂:如果當(dāng)前節(jié)點(diǎn)對(duì)渲染點(diǎn)亮度 的貢獻(xiàn)值大于誤差閾值而且其存在葉子節(jié)點(diǎn),則將該節(jié)點(diǎn)向下分裂為兩個(gè)子節(jié)點(diǎn),否則停 止分裂。當(dāng)所有路徑都停止分裂后,得到的所有節(jié)點(diǎn)的集合,就是一個(gè)光源割。之后的渲染 過程使用光源割代替原始光源進(jìn)行渲染。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明的目的就是為了解決上述問題,提出了一種面向可編程著色器的多光源加 速方法,該方法首先在可編程著色器環(huán)境下實(shí)現(xiàn)了 Lightcuts算法,通過將光源聚類成樹 形結(jié)構(gòu),然后再對(duì)光源樹進(jìn)行裁剪,減少實(shí)際渲染的光源數(shù)目,能夠?qū)秩緯r(shí)間與光源數(shù)目 的關(guān)系降為亞線性,而且穩(wěn)定性比較好,在大部分情況下都能有良好的加速效果。
[0008] 為了實(shí)現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
[0009] -種面向可編程著色器的多光源加速方法,包括:
[0010] (1)渲染引擎讀取場(chǎng)景文件中的光源信息,提取Lightcuts算法所需光照參數(shù),存 入光源鏈表;
[0011] (2)渲染場(chǎng)景前,利用Lightcuts算法對(duì)光源進(jìn)行聚類,遍歷光源鏈表,對(duì)每類光 源構(gòu)建全局的光源樹;
[0012] (3)渲染過程中,將幾何表面上待渲染點(diǎn)放置于緩沖區(qū)中;對(duì)緩沖區(qū)中的渲染點(diǎn) 聚類:同一物體上相近的點(diǎn)有相同材質(zhì),受相同的光源影響,因此下一步對(duì)同一物體上相近 的一組渲染點(diǎn)求一個(gè)公共的光源割,進(jìn)行渲染;
[0013] (4)對(duì)于每一組的渲染點(diǎn),利用全局的光源樹,對(duì)渲染點(diǎn)分組計(jì)算光源割;
[0014] (5)設(shè)定陰影域參數(shù)和背景亮度參數(shù)的值,如果當(dāng)前光源節(jié)點(diǎn)亮度L。小于陰影域 參數(shù)值,則取其背景亮度參數(shù)值作為當(dāng)前光源節(jié)點(diǎn)亮度的估計(jì)值,進(jìn)行求光源割的計(jì)算;
[0015] (6)渲染引擎識(shí)別此光源割中的著色器文件,使用光源割代替原始光源進(jìn)行照 明;
[0016] (7)重復(fù)渲染過程,直到所有渲染點(diǎn)渲染完成,輸出渲染結(jié)果圖像。
[0017] 所述步驟(3)中,對(duì)同一物體上相近的渲染點(diǎn)求公共光源割的具體方法如下:
[0018] a.每一組渲染點(diǎn)共享一個(gè)存儲(chǔ)光源割的堆棧;設(shè)置標(biāo)記位,標(biāo)記所執(zhí)行的是否為 該組渲染點(diǎn)的第一個(gè)點(diǎn);
[0019] b.如果執(zhí)行的是第一個(gè)點(diǎn),則正常執(zhí)行求光源割,結(jié)果存儲(chǔ)到堆棧;如果不是第 一個(gè)點(diǎn),則從堆棧中的上一次計(jì)算的光源割開始,執(zhí)行當(dāng)前點(diǎn)的求光源割過程,結(jié)果仍存放 在堆棧中;
[0020] c.不斷循環(huán)執(zhí)行步驟b,直到該組渲染點(diǎn)全部執(zhí)行完畢,堆棧中的結(jié)果就是該組 渲染點(diǎn)的公共光源割。
[0021] 所述步驟(4)中,對(duì)渲染點(diǎn)分組計(jì)算光源割的具體方法為:
[0022] 1)預(yù)估光源樹中光源節(jié)點(diǎn)的兩個(gè)值:L。和upperbound ;所述L。表示一個(gè)光源聚類 實(shí)際照射到渲染點(diǎn)的亮度的預(yù)估;upperbound表示理論上光源節(jié)點(diǎn)所代表的光源聚類照 射到渲染點(diǎn)產(chǎn)生的亮度的預(yù)計(jì)最大值;
[0023] 2)如果maxupperbound〈0· 02* Σ Lc,說明堆棧內(nèi)所有光源節(jié)點(diǎn)的upperbound值 都滿足小于〇. 02* Σ L。的條件,則堆棧內(nèi)光源節(jié)點(diǎn)即為最后求得的光源節(jié)點(diǎn),計(jì)算完畢;其 中,maxupperbound為棧內(nèi)所有節(jié)點(diǎn)的upperbound的最大值,0· 02為韋伯參數(shù);
[0024] 否則,分裂該光源節(jié)點(diǎn),將被分裂的節(jié)點(diǎn)出棧,其子節(jié)點(diǎn)入棧;計(jì)算新入棧節(jié)點(diǎn)的 upperbound 和 Lc〇
[0025] 所述步驟(5)中,如果使用了背景亮度后,在之后的計(jì)算過程中,預(yù)估的光源節(jié)點(diǎn) 亮度L。值又大于或等于了陰影域參數(shù)值時(shí),則恢復(fù)使用預(yù)估光源節(jié)點(diǎn)亮度L。進(jìn)行求光源割 的計(jì)算。
[0026] 所述陰影域參數(shù)默認(rèn)取絕對(duì)感覺閾限的中值0. 05,所述背景亮度參數(shù)大于或等于 陰影域參數(shù)值,默認(rèn)取絕對(duì)感覺閾限〇. 1。
[0027] 所述步驟(3)中對(duì)緩沖區(qū)中的渲染點(diǎn)聚類的方法為:
[0028] 第1步:對(duì)于同一組光源的集合,尋找其中權(quán)重最小的兩個(gè)光源;
[0029] 第2步:為權(quán)重最小的兩個(gè)光源構(gòu)建一個(gè)父節(jié)點(diǎn),在兩光源中隨機(jī)選擇一個(gè)光源 作為其代表光源,記錄包圍盒信息和總亮度值;
[0030] 第3步:將父節(jié)點(diǎn)加入光源集合,兩個(gè)子節(jié)點(diǎn)從光源集合中刪除;
[0031] 第4步:跳到第1步執(zhí)行,直到該組光源的集合中只剩一個(gè)節(jié)點(diǎn),即根節(jié)點(diǎn),光源樹 構(gòu)建完成;其中葉子節(jié)點(diǎn)為實(shí)際光源,內(nèi)部節(jié)點(diǎn)為代表光源。
[0032] 所述第1步中權(quán)重的計(jì)算方法如下式所示:
[0033] W = Ic (ac2+c2 (I - cos β c)2)
[0034] 其中,I。為兩個(gè)光源亮度的和,a。為兩光源軸對(duì)齊包圍盒的對(duì)角線長(zhǎng)度;對(duì)于點(diǎn)光 源和平行光c的值為0,對(duì)于聚光燈,c是一個(gè)聯(lián)系空間大小和聚光燈方向的常量,與場(chǎng)景包 圍盒的對(duì)角線長(zhǎng)度相關(guān);β。為這兩個(gè)光源綁定角的1/2。
[0035] 本發(fā)明的有益效果
[0036] 1.本發(fā)明針對(duì)Lightcuts算法對(duì)于場(chǎng)景中陰影部分的渲染加速效果并不理想這 一問題進(jìn)行了分析并改進(jìn)算法,提出了陰影域和背景亮度兩個(gè)參數(shù),對(duì)陰影部分的渲染過 程進(jìn)行控制,避免一些不必要的計(jì)算,加速了陰影處渲染的效率。
[0037] 2.本發(fā)明采用渲染點(diǎn)聚類的方法,對(duì)一組同材質(zhì)、空間距離近的渲染點(diǎn)求取 Lightcuts,減少的光源割的構(gòu)建時(shí)間,提升渲染效率。
[0038] 3.為了使算法支持可編程著色器下的渲染流程,本發(fā)明設(shè)計(jì)了相關(guān)的接口,使其 支持商業(yè)渲染普遍采用的可編程著色器,提高了算法可用性。
【專利附圖】
【附圖說明】
[0039] 圖1為四個(gè)光源的聚類過程示意圖;
[0040] 圖2為四個(gè)光源的求光源割過程示意圖;
[0041] 圖3為本發(fā)明實(shí)施例渲染時(shí)間對(duì)比柱狀圖。
【具體實(shí)施方式】
[0042] 下面結(jié)合具體實(shí)施例與附圖對(duì)本發(fā)明作進(jìn)一步說明。
[0043] Lightcuts算法主要分為光源聚類和求取光源割兩個(gè)部分。
[0044] a.光源聚類:
[0045] 光源聚類過程將場(chǎng)景中的光源聚類成為一棵二叉樹,如圖1所示。步驟如下:
[0046] 1)對(duì)于所有同類光源的集合,尋找其中權(quán)重最小的兩個(gè)光源,權(quán)重的計(jì)算方法如 公式⑴所示:
[0047] W = Ic (ac2+c2 (I - cos β c)2) 公式(I)
[0048] 其中I。為兩個(gè)光源亮度的和,a。為兩光源軸對(duì)齊包圍盒的對(duì)角線長(zhǎng)度。對(duì)于點(diǎn)光 源和平行光C的值為0。對(duì)于聚光燈,c是一個(gè)聯(lián)系空間大小和聚光燈方向的常量,與場(chǎng)景 包圍盒的對(duì)角線長(zhǎng)度相關(guān),β。為這兩個(gè)光源綁定角的1/2。
[0049] 2)為權(quán)重最小的兩個(gè)光源構(gòu)建一個(gè)父節(jié)點(diǎn),在兩光源中隨機(jī)選擇一個(gè)光源作為其 代表光源,記錄包圍盒信息和總亮度值。包圍盒的意思是用體積稍大且特性簡(jiǎn)單的幾何體 來近似地代替復(fù)雜的幾何對(duì)象。
[0050] 3)將父節(jié)點(diǎn)加入光源集合,兩個(gè)子節(jié)點(diǎn)從光源集合中刪除。
[0051] 4)跳到第一步執(zhí)行,直到光源集合中只剩一個(gè)節(jié)點(diǎn),即根節(jié)點(diǎn),光源樹構(gòu)建完成。 其中葉子節(jié)點(diǎn)為實(shí)際光源,內(nèi)部節(jié)點(diǎn)為代表光源。
[0052] b.求光源割:
[0053] 要在保證渲染結(jié)果質(zhì)量的前提下進(jìn)行多光源的簡(jiǎn)化,在求解光源割的過程中就需 要按照韋伯原理分裂節(jié)點(diǎn)。分裂過程中,對(duì)于光源樹中的代表光源節(jié)點(diǎn),都有兩個(gè)值:L。和 upperbound。這兩個(gè)值在查找到節(jié)點(diǎn)時(shí)才進(jìn)行計(jì)算:
[0054] L。表示一個(gè)光源聚類實(shí)際照射到渲染點(diǎn)的亮度的預(yù)估。其計(jì)算公式(2)如下:
[0055] Lc(x,w) ~ Mj(x,w)Gj(x)Vj(x) Σ iec Ii 公式⑵
[0056] 其中集合C表不一個(gè)光源聚類,X表不渲染點(diǎn)(包含位置,法向等信息),w表不視 點(diǎn)方向,M表不材質(zhì)因子,G表不幾何因子,V表不可見性,I表不光源亮度。i代表實(shí)際光 源,j是當(dāng)前聚類的代表光源。upperbound表示理論上節(jié)點(diǎn)所代表的光源聚類照射到渲染 點(diǎn)產(chǎn)生的亮度的預(yù)計(jì)最大值(假設(shè)光源全部可見)。其計(jì)算公式與L。的公式相同,只是計(jì) 算過程中材質(zhì)因子M、幾何因子G以及可見性因子V要取上限值。
[0057] 具體的求光源割的過程如圖2所示,包括:
[0058] 1)設(shè)立一個(gè)堆棧來存放結(jié)果。首先將根節(jié)點(diǎn)入棧,計(jì)算根節(jié)點(diǎn)的upperbound和 Lc。
[0059] 2)如果 maxupperbouncKO. 02* Σ Lc (maxupperbound 為棧內(nèi)所有節(jié)點(diǎn)的 upperbound的最大值,0. 02為韋伯參數(shù)),說明棧內(nèi)所有節(jié)點(diǎn)的upperbound值都滿足小于 0. 02* EL。的條件,則棧內(nèi)節(jié)點(diǎn)即為最后求得的節(jié)點(diǎn),計(jì)算完畢。否則分裂該節(jié)點(diǎn)(如果存 在子節(jié)點(diǎn)),將被分裂的節(jié)點(diǎn)出棧,其子節(jié)點(diǎn)入棧。計(jì)算新入棧節(jié)點(diǎn)的upperbound和L。。
[0060] 最終堆棧中存儲(chǔ)的就是經(jīng)過Lightcuts算法簡(jiǎn)化后的結(jié)果,即一個(gè)光源割。
[0061] 原始Lightcuts算法在場(chǎng)景中陰影較多的地方執(zhí)行效率比較低,在大量光源都 被遮擋的陰影處,光源割內(nèi)光源的數(shù)目基本等于實(shí)際光源數(shù)。這些陰影處預(yù)估亮度L。 很小(有可能為〇),從而韋伯參數(shù)〇. 02與L。的乘積也很小,而代表光源的上限估計(jì)值 upperbound由于不考慮遮擋,一般都會(huì)大于0. 02*L。。導(dǎo)致求光源割過程中節(jié)點(diǎn)不斷分裂, 直到葉子節(jié)點(diǎn)。
[0062] 為了加快實(shí)際渲染效率,本發(fā)明提出了陰影域和背景亮度兩個(gè)可選經(jīng)驗(yàn)參數(shù)。在 計(jì)算執(zhí)行的光源時(shí)候,當(dāng)預(yù)估的總光照值L。小于陰影域參數(shù)值(為保證渲染效果,中和預(yù) 估總光照時(shí)帶來的誤差,默認(rèn)取絕對(duì)感覺閾限的中值0.05)時(shí),認(rèn)為該渲染點(diǎn)處于陰影內(nèi), 對(duì)其取背景亮度參數(shù)值(一般大于或等于陰影域參數(shù)值,默認(rèn)為絕對(duì)感覺閾限〇. 1)作為當(dāng) 前預(yù)估亮度L。的值,進(jìn)行求光源割的計(jì)算。如果使用了背景亮度后,在之后的計(jì)算過程中, 預(yù)估的總光照值又大于或等于了陰影域參數(shù)值,則恢復(fù)使用預(yù)估亮度L。進(jìn)行計(jì)算,確保準(zhǔn) 確性。
[0063] 經(jīng)過適當(dāng)?shù)脑黾雨幱皡^(qū)域內(nèi)渲染點(diǎn)的預(yù)估亮度,可以合理減少光源割內(nèi)光源總 數(shù),提高陰影處渲染的效率,實(shí)際渲染的結(jié)果也符合預(yù)期,而且可以保證的圖像質(zhì)量。
[0064] 為了提高效率,將同一物體上相近的點(diǎn)分組進(jìn)行渲染,只需要執(zhí)行一遍材質(zhì) shader,就可以渲染最多256個(gè)點(diǎn)。相近的點(diǎn)一般法向和位置相差不大,計(jì)算得到的光源割 也大致相同,所以根據(jù)這個(gè)特點(diǎn),采用增量計(jì)算公共光源割的方法來適應(yīng)引擎對(duì)渲染點(diǎn)分 組處理的流程,并且加快了求光源割的速度。
[0065] 可編程著色器在渲染中被廣泛使用,但傳統(tǒng)Lightcuts算法普遍不支持可編程著 色器描述的光源。本發(fā)明從提取光源著色器提取Lightcuts算法所必要的參數(shù)進(jìn)行傳遞, 從而支持可編程著色器。提取的信息主要包括:光源類型、光源亮度、衰減模式、光源位置、 方向、照射范圍。
[0066] 在渲染引擎中實(shí)現(xiàn)Lightcuts算法,首先必須獲取光源信息,以建立光源樹。而且 建立光源樹的過程必須在渲染每個(gè)點(diǎn)之前進(jìn)行,建樹過程可以看做是一種預(yù)處理,全局只 執(zhí)行一次。渲染引擎會(huì)遍歷所有光源來計(jì)算渲染點(diǎn)處的光照值。要應(yīng)用Lightcuts算法進(jìn) 行加速,需要在遍歷之前加入求光源割的過程,用得到的光源割去取代原來的光源進(jìn)行渲 染,達(dá)到加速的目的。
[0067] 本發(fā)明的面向可編程著色器的多光源加速方法包括以下步驟:
[0068] 1)渲染引擎讀取場(chǎng)景文件中光源信息,Lightcuts解析提取所需光照參數(shù),存入 光源鏈表。
[0069] 2)渲染場(chǎng)景前,Lightcuts算法對(duì)光源進(jìn)行聚類,遍歷光源鏈表,對(duì)每類光源構(gòu)建 全局的光源樹。
[0070] 3)渲染過程中,渲染引擎計(jì)算點(diǎn)的光照時(shí),執(zhí)行Lightcuts算法:
[0071] 3. 1)渲染點(diǎn)的時(shí)候,將待渲染點(diǎn)放置于緩沖區(qū)中。
[0072] 3. 2)對(duì)緩沖區(qū)中的渲染點(diǎn)聚類,同一物體上相近的點(diǎn)有相同材質(zhì),受相同的光源 影響,將其聚類,進(jìn)行渲染。
[0073] 3.3) -組256個(gè)渲染點(diǎn),利用全局光源樹,求解一個(gè)光源割。
[0074] 3. 4)對(duì)光源割內(nèi)的光源進(jìn)行遍歷,根據(jù)陰影域或者背景亮度參數(shù)估算光源對(duì)場(chǎng)景 影響,忽略無影響光源。提交渲染執(zhí)行光源著色器
[0075] 4)渲染引擎執(zhí)行對(duì)應(yīng)的光源著色器,計(jì)算光照結(jié)果。選取下一批點(diǎn),重復(fù)步驟2, 直到渲染完成,輸出渲染結(jié)果圖像。
[0076] 實(shí)現(xiàn)細(xì)節(jié):
[0077] 1)可編程著色器定義的光源shader和材質(zhì)shader有很大靈活性,需要定義與 Lightcuts算法相配套的接口進(jìn)行約束。接口設(shè)計(jì)時(shí)只提取出必要的參數(shù)進(jìn)行傳遞,避免多 余的計(jì)算,同時(shí)也防止接口參數(shù)對(duì)著色器約束過多,影響可編程著色器的靈活性。
[0078] 在上述的設(shè)計(jì)方案中,求光源割需要預(yù)估直接光照的值(L。),這與材質(zhì)中直接光 照部分的計(jì)算有很多是重復(fù)的,兩遍計(jì)算導(dǎo)致效率降低。經(jīng)過實(shí)驗(yàn)證實(shí)重復(fù)計(jì)算中90%以 上的工作量源于可見性V的求解??梢娦缘挠?jì)算涉及到陰影線與整個(gè)場(chǎng)景求交(trace函 數(shù)),與場(chǎng)景中面片數(shù)目相關(guān),復(fù)雜度很高。所以設(shè)計(jì)了 tracejeuse接口參數(shù),將渲染引擎 計(jì)算Lc過程中得到的求交結(jié)果傳遞給材質(zhì)shader重用,提高加速效果。
[0079] 2)引擎渲染流程中,為了提高效率,將同一物體上相近的點(diǎn)分組進(jìn)行渲染,這樣只 需要執(zhí)行一遍材質(zhì)著色器,就可以渲染最多256個(gè)點(diǎn)。相近的點(diǎn)一般法向和位置相差不大, 計(jì)算得到的光源割也大致相同。根據(jù)這個(gè)特點(diǎn),本發(fā)明采用增量計(jì)算公共光源割的方法,對(duì) 渲染點(diǎn)分組計(jì)算光源割,加快了求光源割的速度。計(jì)算方法如下:
[0080] 1. 一組點(diǎn)共享一個(gè)存儲(chǔ)光源割的堆棧。設(shè)置標(biāo)記位,標(biāo)記所執(zhí)行的是否為一組點(diǎn) 的第一個(gè)點(diǎn)。
[0081] 2.如果執(zhí)行的是第一個(gè)點(diǎn),則正常執(zhí)行求光源割,結(jié)果存儲(chǔ)到堆棧。如果不是第一 個(gè)點(diǎn),則從堆棧中的上一次計(jì)算的光源割開始,執(zhí)行當(dāng)前點(diǎn)的求光源割過程,結(jié)果仍存放在 堆棧中。
[0082] 3.不斷循環(huán)執(zhí)行第二步,直到一組點(diǎn)全部執(zhí)行完畢,堆棧中的結(jié)果就是這組點(diǎn)的 公共光源割。
[0083] 對(duì)于一個(gè)渲染算法,即是將一個(gè)三維場(chǎng)景轉(zhuǎn)化為圖片的過程,場(chǎng)景中包括了攝像 機(jī),幾何體,光源,材質(zhì),貼圖紋理等信息。在渲染任務(wù)開始前,將一個(gè)三維場(chǎng)景在建模軟件 中的表達(dá)轉(zhuǎn)化為渲染引擎可以讀取和識(shí)別的數(shù)據(jù)表達(dá)方式,在轉(zhuǎn)化程序里,按照本發(fā)明所 述,在可編程著色器中實(shí)現(xiàn)Lightcuts算法以及相關(guān)改進(jìn)。之后用戶提交一個(gè)包含完整信 息的場(chǎng)景數(shù)據(jù)文件包,渲染引擎可以識(shí)別這些文件中所描述的攝像機(jī),幾何體,光源等信 息。在將整個(gè)場(chǎng)景數(shù)據(jù)讀入后,開始渲染,著色過程中執(zhí)行算法,輸出圖像。
[0084] 浦東夜色場(chǎng)景是一個(gè)渲染實(shí)例,該場(chǎng)景包含11萬三角面片,724個(gè)光源,所有幾何 體、光源、材質(zhì)均采用符合Renderman規(guī)范,光源、材質(zhì)使用可編程著色器描述。具體場(chǎng)景信 息數(shù)據(jù)如表1所示
[0085] 表 1
【權(quán)利要求】
1. 一種面向可編程著色器的多光源加速方法,其特征是,包括: (1) 撞染引擎讀取場(chǎng)景文件中的光源信息,提取Li曲tcuts算法所需光照參數(shù),存入光 源鏈表; (2) 撞染場(chǎng)景前,利用Li曲tcuts算法對(duì)光源進(jìn)行聚類,遍歷光源鏈表,對(duì)每類光源構(gòu) 建全局的光源樹; (3) 撞染過程中,將幾何表面上待撞染點(diǎn)放置于緩沖區(qū)中;對(duì)緩沖區(qū)中的撞染點(diǎn)聚類: 同一物體上相近的點(diǎn)有相同材質(zhì),受相同的光源影響,因此下一步對(duì)同一物體上相近的一 組撞染點(diǎn)求一個(gè)公共的光源割,進(jìn)行撞染; (4) 對(duì)于每一組的撞染點(diǎn),利用全局的光源樹,對(duì)撞染點(diǎn)分組計(jì)算光源割; (5) 設(shè)定陰影域參數(shù)和背景亮度參數(shù)的值,如果當(dāng)前光源節(jié)點(diǎn)亮度L。小于陰影域參數(shù) 值,則取其背景亮度參數(shù)值作為當(dāng)前光源節(jié)點(diǎn)亮度的估計(jì)值,進(jìn)行求光源割的計(jì)算; (6) 撞染引擎識(shí)別此光源割中的著色器文件,使用光源割代替原始光源進(jìn)行照明; (7) 重復(fù)撞染過程,直到所有撞染點(diǎn)撞染完成,輸出撞染結(jié)果圖像。
2. 如權(quán)利要求1所述的一種面向可編程著色器的多光源加速方法,其特征是,所述步 驟(3)中,對(duì)同一物體上相近的撞染點(diǎn)求公共光源割的具體方法如下: a. 每一組撞染點(diǎn)共享一個(gè)存儲(chǔ)光源割的堆找;設(shè)置標(biāo)記位,標(biāo)記所執(zhí)行的是否為該組 撞染點(diǎn)的第一個(gè)點(diǎn); b. 如果執(zhí)行的是第一個(gè)點(diǎn),則正常執(zhí)行求光源割,結(jié)果存儲(chǔ)到堆找;如果不是第一個(gè) 點(diǎn),則從堆找中的上一次計(jì)算的光源割開始,執(zhí)行當(dāng)前點(diǎn)的求光源割過程,結(jié)果仍存放在堆 找中; C.不斷循環(huán)執(zhí)行步驟b,直到該組撞染點(diǎn)全部執(zhí)行完畢,堆找中的結(jié)果就是該組撞染 點(diǎn)的公共光源割。
3. 如權(quán)利要求1所述的一種面向可編程著色器的多光源加速方法,其特征是,所述步 驟(4)中,對(duì)撞染點(diǎn)分組計(jì)算光源割的具體方法為: 1) 預(yù)估光源樹中光源節(jié)點(diǎn)的兩個(gè)值;L。和upperbound ;所述L。表示一個(gè)光源聚類實(shí)際 照射到撞染點(diǎn)的亮度的預(yù)估;upperbound表示理論上光源節(jié)點(diǎn)所代表的光源聚類照射到 撞染點(diǎn)產(chǎn)生的亮度的預(yù)計(jì)最大值; 2) 如果maxupperbouncKO. 02* E L。,說明堆找內(nèi)所有光源節(jié)點(diǎn)的upperbound值都滿 足小于0.02* E L。的條件,則堆找內(nèi)光源節(jié)點(diǎn)即為最后求得的光源節(jié)點(diǎn),計(jì)算完畢;其中, maxupperbound為找內(nèi)所有節(jié)點(diǎn)的upperbound的最大值,0. 02為韋伯參數(shù); 否則,分裂該光源節(jié)點(diǎn),將被分裂的節(jié)點(diǎn)出找,其子節(jié)點(diǎn)入找;計(jì)算新入找節(jié)點(diǎn)的 upperbound 和Lcd
4. 如權(quán)利要求1所述的一種面向可編程著色器的多光源加速方法,其特征是,所述步 驟巧)中,如果使用了背景亮度后,在之后的計(jì)算過程中,預(yù)估的光源節(jié)點(diǎn)亮度L。值又大于 或等于了陰影域參數(shù)值時(shí),則恢復(fù)使用預(yù)估光源節(jié)點(diǎn)亮度L。進(jìn)行求光源割的計(jì)算。
5. 如權(quán)利要求4所述的一種面向可編程著色器的多光源加速方法,其特征是,所述陰 影域參數(shù)默認(rèn)取絕對(duì)感覺闊限的中值0.05,所述背景亮度參數(shù)大于或等于陰影域參數(shù)值, 默認(rèn)取絕對(duì)感覺闊限0.1。
6. 如權(quán)利要求1所述的一種面向可編程著色器的多光源加速方法,其特征是,所述步 驟(3)中對(duì)緩沖區(qū)中的撞染點(diǎn)聚類的方法為: 第1步:對(duì)于同一組光源的集合,尋找其中權(quán)重最小的兩個(gè)光源; 第2步;為權(quán)重最小的兩個(gè)光源構(gòu)建一個(gè)父節(jié)點(diǎn),在兩光源中隨機(jī)選擇一個(gè)光源作為 其代表光源,記錄包圍盒信息和總亮度值; 第3步:將父節(jié)點(diǎn)加入光源集合,兩個(gè)子節(jié)點(diǎn)從光源集合中刪除; 第4步:跳到第1步執(zhí)行,直到該組光源的集合中只剩一個(gè)節(jié)點(diǎn),即根節(jié)點(diǎn),光源樹構(gòu)建 完成;其中葉子節(jié)點(diǎn)為實(shí)際光源,內(nèi)部節(jié)點(diǎn)為代表光源。
7.如權(quán)利要求6所述的一種面向可編程著色器的多光源加速方法,其特征是,所述第1 步中權(quán)重的計(jì)算方法如下式所示: W = I。(3。2+。2 (1 - cos 目 C) 2) 其中,I。為兩個(gè)光源亮度的和,a。為兩光源軸對(duì)齊包圍盒的對(duì)角線長(zhǎng)度;對(duì)于點(diǎn)光源和 平行光C的值為0,對(duì)于聚光燈,C是一個(gè)聯(lián)系空間大小和聚光燈方向的常量,與場(chǎng)景包圍盒 的對(duì)角線長(zhǎng)度相關(guān);目。為該兩個(gè)光源綁定角的1/2。
【文檔編號(hào)】G06T15/50GK104463943SQ201410636581
【公開日】2015年3月25日 申請(qǐng)日期:2014年11月12日 優(yōu)先權(quán)日:2014年11月12日
【發(fā)明者】孟祥雨, 王璐, 徐延寧 申請(qǐng)人:山東地緯數(shù)碼科技有限公司