本發(fā)明涉及一種大型三維場景的計(jì)算機(jī)集群分布式路徑跟蹤繪制方法,屬于三維場景繪制技術(shù)領(lǐng)域。
背景技術(shù):
路徑跟蹤是一種常見的三維場景繪制技術(shù),在影視制作、三維可視化、藝術(shù)設(shè)計(jì)等領(lǐng)域有著廣泛的應(yīng)用。J. F. Hughes等人2014年出版的《Computer Graphics: Principles and Practice, Third Edition》對路徑跟蹤技術(shù)作了詳細(xì)介紹,在本發(fā)明中稱之為單機(jī)版路徑跟蹤技術(shù)。利用路徑跟蹤繪制三維場景時,需要先把整個三維場景加載到計(jì)算機(jī)內(nèi)存之中,然后再按照路徑跟蹤流程繪制三維場景。對于大型三維場景,其中包含巨量的幾何數(shù)據(jù),普通的計(jì)算機(jī)圖形工作站內(nèi)存有可能難以容納整個三維場景模型數(shù)據(jù)。中小型影視制作企業(yè)通常都擁有一定數(shù)量的計(jì)算機(jī)圖形工作站,但未必有足夠的資金去購買更高端的計(jì)算機(jī)硬件設(shè)備。可以用高速網(wǎng)絡(luò)交換機(jī)把大量計(jì)算機(jī)圖形工作站連接起來,構(gòu)成一個計(jì)算機(jī)集群。計(jì)算機(jī)集群的總內(nèi)存容量可以比較容易地滿足大于加載大型三維場景所需存儲容量的要求。然而,由于計(jì)算機(jī)集群的內(nèi)存分散在不同計(jì)算機(jī)圖形工作站上,因此要想利用計(jì)算機(jī)集群來對大型三維場景進(jìn)行路徑跟蹤繪制,就必須設(shè)計(jì)適合于計(jì)算機(jī)集群體系結(jié)構(gòu)的分布式路徑跟蹤繪制方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種大型三維場景的計(jì)算機(jī)集群分布式路徑跟蹤繪制方法,通過把大型三維場景模型劃分成多個部分,并把不同部分加載到計(jì)算機(jī)集群的不同結(jié)點(diǎn)上,利用計(jì)算機(jī)集群來分布式地對大型三維場景進(jìn)行繪制。
本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:大型三維場景的計(jì)算機(jī)集群分布式路徑跟蹤繪制方法,其特征在于:使用計(jì)算機(jī)集群A001實(shí)現(xiàn)大型三維場景的分布式路徑跟蹤繪制,計(jì)算機(jī)集群A001由臺計(jì)算機(jī)圖形工作站通過網(wǎng)絡(luò)交換機(jī)連接在一起構(gòu)成,其中一臺計(jì)算機(jī)圖形工作站被用作主控結(jié)點(diǎn)A002,其他計(jì)算機(jī)圖形工作站被用作繪制結(jié)點(diǎn);換句話說,計(jì)算機(jī)集群A001包括主控結(jié)點(diǎn)A002和第1個繪制結(jié)點(diǎn)、第2個繪制結(jié)點(diǎn)、以此類推一直到第個繪制結(jié)點(diǎn);在建模時,對要繪制的三維場景中的幾何對象進(jìn)行劃分,把三維場景模型分成個部分,保證每部分包含的幾何對象對應(yīng)的幾何數(shù)據(jù)能夠全部被加載到單臺計(jì)算機(jī)圖形工作站的內(nèi)存中,并能在單臺計(jì)算機(jī)圖形工作站上正常執(zhí)行對該部分幾何對象構(gòu)成的子場景的路徑跟蹤繪制操作,每部分包含的幾何對象對應(yīng)的幾何數(shù)據(jù)構(gòu)成子場景模型。
提供一種數(shù)據(jù)結(jié)構(gòu)INPD,用于存儲與三維場景點(diǎn)相關(guān)的數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)INPD包括使用標(biāo)識INUT、場景點(diǎn)位置POS、場景點(diǎn)所在位置的法向量NORM、場景點(diǎn)所在幾何面片的材質(zhì)數(shù)據(jù)MAT共四個成員變量。
提供一種數(shù)據(jù)結(jié)構(gòu)SHDT,用于存儲遮擋測試結(jié)果,數(shù)據(jù)結(jié)構(gòu)SHDT包括遮擋標(biāo)識TO、使用標(biāo)識SHUT共兩個成員變量。
提供一種數(shù)據(jù)結(jié)構(gòu)RAY,用于表示光線,數(shù)據(jù)結(jié)構(gòu)RAY包括光線起點(diǎn)RS、光線方向RV、使用標(biāo)識RUT共三個成員變量。
提供一種數(shù)據(jù)結(jié)構(gòu)SEG,用于表示線段,數(shù)據(jù)結(jié)構(gòu)SEG包括線段起點(diǎn)GS、線段終點(diǎn)GE、使用標(biāo)識GUT共三個成員變量。
具體實(shí)現(xiàn)步驟如下:
Step101:在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組RAD,用于存儲通過路徑跟蹤計(jì)算得到的光照亮度值,M表示虛擬像素平面上的像素行數(shù),N表示虛擬像素平面上的像素列數(shù);把數(shù)組RAD的每個元素賦值為零;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURRAYA,數(shù)組CURRAYA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)RAY類型的變量;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURSEGA,數(shù)組CURSEGA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SEG類型的變量;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURINPDA,數(shù)組CURINPDA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)INPD類型的變量;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURSHDTA,數(shù)組CURSHDTA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量;
Step102:在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurRayA,數(shù)組CurRayA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)RAY類型的變量;在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurSegA,數(shù)組CurSegA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SEG類型的變量;在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurInpdA,數(shù)組CurInpdA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)INPD類型的變量;在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurShdtA,數(shù)組CurShdtA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量;把個子場景模型分別加載到計(jì)算機(jī)集群A001的個繪制結(jié)點(diǎn)A003的內(nèi)存中;
Step103:在主控結(jié)點(diǎn)A002上,使用光線投射技術(shù),根據(jù)觀察參數(shù),從視點(diǎn)出發(fā)投射穿過虛擬像素平面上的各個像素的光線A004,光線A004與虛擬像素平面上的像素一一對應(yīng);對于i = 1, 2, 3, ?, M,j = 1, 2, 3, ?, N,把數(shù)組CURRAYA的第i行、第j列的元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量賦值為虛擬像素平面上的第i行、第j列像素對應(yīng)的光線A004的起點(diǎn),把數(shù)組CURRAYA的第i行、第j列的元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RV成員變量賦值為虛擬像素平面上的第i行、第j列像素對應(yīng)的光線A004的方向,把數(shù)組CURRAYA的第i行、第j列的元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為1;
Step104:如果數(shù)組CURRAYA的所有元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量的值都為0,則轉(zhuǎn)步驟Step113,否則主控結(jié)點(diǎn)A002通過網(wǎng)絡(luò)把數(shù)組CURRAYA傳送給所有的繪制結(jié)點(diǎn)A003;每個繪制結(jié)點(diǎn)A003接收到數(shù)組CURRAYA后,把數(shù)組CURRAYA的值保存在各自的數(shù)組CurRayA中;
Step105:對每個繪制結(jié)點(diǎn)A003,執(zhí)行如下操作:
Step105-1:對繪制結(jié)點(diǎn)A003的數(shù)組CurRayA中的每個元素B001,計(jì)算元素B001在數(shù)組CurRayA中所對應(yīng)的行號irow和列號jcol,并執(zhí)行如下操作:
Step105-1-1:如果元素B001存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量的值不等于1,則轉(zhuǎn)子步驟Step105-1-2,否則根據(jù)元素B001存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量和RV成員變量確定一條光線B002,判斷光線B002與繪制結(jié)點(diǎn)A003的內(nèi)存中的子場景模型中的幾何對象是否相交,如果不相交,則轉(zhuǎn)子步驟Step105-1-2,否則找到離光線B002的起點(diǎn)最近的交點(diǎn)B003,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量賦值為1,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量賦值為交點(diǎn)B003所在位置,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的NORM成員變量賦值為交點(diǎn)B003所在位置的法向量,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的MAT成員變量賦值為交點(diǎn)B003所在幾何面片的材質(zhì)數(shù)據(jù);轉(zhuǎn)子步驟Step105-1-3;
Step105-1-2:把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量賦值為0;
Step105-1-3:對元素B001的操作結(jié)束;
Step105-2:通過網(wǎng)絡(luò)把數(shù)組CurInpdA發(fā)送給主控結(jié)點(diǎn)A002;
Step106:主控結(jié)點(diǎn)A002接收從所有繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA;主控結(jié)點(diǎn)A002把數(shù)組CURINPDA的每個元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量賦值為0;在主控結(jié)點(diǎn)A002上,對于n = 1, 2, 3, …, ,分別針對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA,執(zhí)行如下操作:
Step106-1:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA的每個元素C001,執(zhí)行如下操作:
Step106-1-1:計(jì)算元素C001在從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA中所對應(yīng)的行號I和列號J;令eCURInpdA表示數(shù)組CURINPDA的第I行、第J列的元素;令eCURRayA表示數(shù)組CURRAYA的第I行、第J列的元素;
Step106-1-2:如果eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量的值為0,則把元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的值賦給eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量,否則判斷元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量的值是否等于0,如果不等于0,則計(jì)算eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量表示的位置到eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量表示的點(diǎn)的位置的距離D1,計(jì)算元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量表示的位置到eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量表示的點(diǎn)的位置的距離D2,進(jìn)一步判斷D1是否大于D2,如果是,則把元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的值賦給eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量;
Step106-1-3:對元素C001的操作結(jié)束;
Step106-2:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA的操作結(jié)束;
Step107:在主控結(jié)點(diǎn)A002上,把數(shù)組CURSEGA的每個元素存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GUT成員變量賦值為0;對數(shù)組CURINPDA的每個元素C002,執(zhí)行如下操作:
Step107-1:計(jì)算元素C002在數(shù)組CURINPDA中對應(yīng)的行號I和列號J;令eCURSegA表示數(shù)組CURSEGA的第I行、第J列的元素;如果元素C002存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量的值為1,則在面光源上隨機(jī)產(chǎn)生一個采樣點(diǎn)Prs,把采樣點(diǎn)Prs賦給eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GE成員變量,把元素C002存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量的值賦給eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GS成員變量,把eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GUT成員變量賦值為1;
Step107-2:對元素C002的操作結(jié)束;
Step108:主控結(jié)點(diǎn)A002通過網(wǎng)絡(luò)把數(shù)組CURSEGA發(fā)給所有的繪制結(jié)點(diǎn)A003;每個繪制結(jié)點(diǎn)A003接收到數(shù)組CURSEGA后,把數(shù)組CURSEGA的值保存在各自的數(shù)組CurSegA中;
Step109:對每個繪制結(jié)點(diǎn)A003,執(zhí)行如下操作:
Step109-1:對繪制結(jié)點(diǎn)A003的數(shù)組CurSegA中的每個元素C003,計(jì)算元素C003在數(shù)組CurSegA中所對應(yīng)的行號irow和列號jcol,并執(zhí)行如下操作:
Step109-1-1:令eCurShdtA表示數(shù)組CurShdtA的第irow行、第jcol列的元素;把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量賦值為0;如果元素C003存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GUT成員變量的值為1,則首先把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量賦值為1,然后判斷由元素C003存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GS成員變量和GE成員變量的值確定的線段是否與繪制結(jié)點(diǎn)A003的內(nèi)存中的子場景模型中的幾何對象相交,如果相交,則把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量賦值為0,否則把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量賦值為1;
Step109-1-2:對元素C003的操作結(jié)束;
Step109-2:通過網(wǎng)絡(luò)把數(shù)組CurShdtA發(fā)送給主控結(jié)點(diǎn)A002;
Step110:主控結(jié)點(diǎn)A002接收從所有繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA;主控結(jié)點(diǎn)A002把數(shù)組CURSHDTA的每個元素存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量賦值為0;在主控結(jié)點(diǎn)A002上,對于n = 1, 2, 3, …, ,分別針對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA,執(zhí)行如下操作:
Step110-1:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA的每個元素C004,執(zhí)行如下操作:
Step110-1-1:計(jì)算元素C004在從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA中所對應(yīng)的行號I和列號J;令eCURShdtA表示數(shù)組CURSHDTA的第I行、第J列的元素;
Step110-1-2:如果eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量的值為0,則把元素C004存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的值賦給eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量,否則判斷元素C004存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量的值是否等于0,如果不等于0,則把eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量的值和元素C004存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量的值作“與”運(yùn)算的結(jié)果賦值給eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量;
Step110-1-3:對元素C004的操作結(jié)束;
Step110-2:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA的操作結(jié)束;
Step111:在主控結(jié)點(diǎn)A002上,對數(shù)組CURINPDA的每個元素C005,執(zhí)行如下操作:
Step111-1:計(jì)算元素C005在數(shù)組CURINPDA中所對應(yīng)的行號I和列號J;令eCURRAD表示數(shù)組RAD的第I行、第J列的元素;令eCURShdtA表示數(shù)組CURSHDTA的第I行、第J列的元素;令eCURSegA表示數(shù)組CURSEGA的第I行、第J列的元素;令eCURRayA表示數(shù)組CURRAYA的第I行、第J列的元素;令ePOS表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量,令eNORM表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的NORM成員變量,令eMAT表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的MAT成員變量,令eINUT表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量;令Plis表示eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GE成員變量;
Step111-2:如果eINUT的值為0,則把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為0并轉(zhuǎn)子步驟Step111-4,否則把Plis的值作為光源采樣點(diǎn)位置C006,把ePOS的值作為三維場景點(diǎn)位置Pscn,把eNORM的值作為三維場景點(diǎn)的法向量,把eMAT的值作為三維場景點(diǎn)所在幾何面片的材質(zhì)數(shù)據(jù),把eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量的值作為光源采樣點(diǎn)位置C006與三維場景點(diǎn)位置Pscn之間的可見性值,按照單機(jī)版路徑跟蹤技術(shù)使用的方法計(jì)算經(jīng)三維場景點(diǎn)位置Pscn表示的點(diǎn)散射后沿跟蹤的路徑反向傳到視點(diǎn)的直接光照亮度值DILLU;如果三維場景點(diǎn)位置Pscn表示的點(diǎn)在面光源上,則進(jìn)一步計(jì)算從三維場景點(diǎn)位置Pscn處主動發(fā)射的沿跟蹤的路徑反向傳到視點(diǎn)的主動發(fā)射光照亮度值EILLU,并把光照亮度值EILLU賦給變量Vei,否則令變量Vei等于0;把光照亮度值DILLU、變量Vei的值以及eCURRAD的值相加的結(jié)果賦給eCURRAD,以完成沿跟蹤的路徑反向傳到視點(diǎn)的光照亮度的累加收集;
Step111-3:根據(jù)eMAT的值計(jì)算三維場景點(diǎn)位置Pscn處的光散射概率ρ,生成一個在0至1之間服從均勻分布的隨機(jī)數(shù)μ,如果μ ≥ ρ,則把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為0,否則在單位球空間內(nèi)按均勻分布隨機(jī)生成一個方向Vu,把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量賦值為ePOS,把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RV成員變量賦值為方向Vu,把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為1;
Step111-4:針對元素C005的操作結(jié)束;
Step112:轉(zhuǎn)步驟Step104;
Step113:所有像素對應(yīng)的單條路徑跟蹤操作結(jié)束。
重復(fù)執(zhí)行NpathT次步驟Step101至步驟Step113的操作,把每次得到的數(shù)組RAD的值都保存在主控結(jié)點(diǎn)A002上;最后,在主控結(jié)點(diǎn)A002上,創(chuàng)建一個包含M行、N列的二維數(shù)組aRAD;對數(shù)組aRAD的每個元素D001,執(zhí)行如下操作:計(jì)算元素D001在數(shù)組aRAD中所對應(yīng)的行號I和列號J;把執(zhí)行第1次步驟Step101至步驟Step113的操作得到的數(shù)組RAD的第I行、第J列的元素,執(zhí)行第2次步驟Step101至步驟Step113的操作得到的數(shù)組RAD的第I行、第J列的元素,以此類推一直到執(zhí)行第NpathT次步驟Step101至步驟Step113的操作得到的數(shù)組RAD的第I行、第J列的元素之和賦給變量aSUM;把元素D001賦值為變量aSUM除以NpathT得到的結(jié)果。
在主控結(jié)點(diǎn)A002上,把數(shù)組aRAD存儲的光照亮度值轉(zhuǎn)換成像素顏色值,并顯示在計(jì)算機(jī)屏幕上。
本發(fā)明的積極效果是首先把大型三維場景劃分成多個部分,然后把每個部分加載到一個計(jì)算機(jī)集群繪制結(jié)點(diǎn)上,通過分布式路徑跟蹤方式實(shí)現(xiàn)對大型三維場景的繪制,可以解決單臺計(jì)算機(jī)圖形工作站不能把大型三維場景完全加載到內(nèi)存中的問題。只需用網(wǎng)絡(luò)交換機(jī)把多臺計(jì)算機(jī)圖形工作站連接起來就可以使用本發(fā)明方法,無需昂貴的計(jì)算機(jī)硬件投入。因此,本發(fā)明方法可以在中小型影視制作企業(yè)中推廣使用。
附圖說明
圖1為計(jì)算機(jī)集群示意圖。
具體實(shí)施方式
為了使本發(fā)明的特征和優(yōu)點(diǎn)更加清楚明白,下面結(jié)合具體實(shí)施例對本發(fā)明作進(jìn)一步的描述。
實(shí)施例1
如圖1所示,使用5臺計(jì)算機(jī)圖形工作站通過網(wǎng)絡(luò)交換機(jī)(101)連接來構(gòu)成計(jì)算機(jī)集群,包括主控結(jié)點(diǎn)(102)、第1個繪制結(jié)點(diǎn)(103)、第2個繪制結(jié)點(diǎn)(104)、第3個繪制結(jié)點(diǎn)(105)和第4個繪制結(jié)點(diǎn)(106)。三維場景為一個室內(nèi)場景,在天花板上有一個矩形面光源向下照射三維場景。虛擬像素平面上的像素行數(shù)為768,虛擬像素平面上的像素列數(shù)為1024。
本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:大型三維場景的計(jì)算機(jī)集群分布式路徑跟蹤繪制方法,其特征在于:使用計(jì)算機(jī)集群A001實(shí)現(xiàn)大型三維場景的分布式路徑跟蹤繪制,計(jì)算機(jī)集群A001由臺計(jì)算機(jī)圖形工作站通過網(wǎng)絡(luò)交換機(jī)連接在一起構(gòu)成,其中一臺計(jì)算機(jī)圖形工作站被用作主控結(jié)點(diǎn)A002,其他計(jì)算機(jī)圖形工作站被用作繪制結(jié)點(diǎn);換句話說,計(jì)算機(jī)集群A001包括主控結(jié)點(diǎn)A002和第1個繪制結(jié)點(diǎn)、第2個繪制結(jié)點(diǎn)、一直到第個繪制結(jié)點(diǎn);在建模時,對要繪制的三維場景中的幾何對象進(jìn)行劃分,把三維場景模型分成個部分,保證每部分包含的幾何對象對應(yīng)的幾何數(shù)據(jù)能夠全部被加載到單臺計(jì)算機(jī)圖形工作站的內(nèi)存中,并能在單臺計(jì)算機(jī)圖形工作站上正常執(zhí)行對該部分幾何對象構(gòu)成的子場景的路徑跟蹤繪制操作,每部分包含的幾何對象對應(yīng)的幾何數(shù)據(jù)構(gòu)成子場景模型。
提供一種數(shù)據(jù)結(jié)構(gòu)INPD,用于存儲與三維場景點(diǎn)相關(guān)的數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)INPD包括使用標(biāo)識INUT、場景點(diǎn)位置POS、場景點(diǎn)所在位置的法向量NORM、場景點(diǎn)所在幾何面片的材質(zhì)數(shù)據(jù)MAT共四個成員變量。
提供一種數(shù)據(jù)結(jié)構(gòu)SHDT,用于存儲遮擋測試結(jié)果,數(shù)據(jù)結(jié)構(gòu)SHDT包括遮擋標(biāo)識TO、使用標(biāo)識SHUT共兩個成員變量。
提供一種數(shù)據(jù)結(jié)構(gòu)RAY,用于表示光線,數(shù)據(jù)結(jié)構(gòu)RAY包括光線起點(diǎn)RS、光線方向RV、使用標(biāo)識RUT共三個成員變量。
提供一種數(shù)據(jù)結(jié)構(gòu)SEG,用于表示線段,數(shù)據(jù)結(jié)構(gòu)SEG包括線段起點(diǎn)GS、線段終點(diǎn)GE、使用標(biāo)識GUT共三個成員變量。
技術(shù)方案的具體實(shí)現(xiàn)步驟如下:
Step101:在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組RAD,用于存儲通過路徑跟蹤計(jì)算得到的光照亮度值,M表示虛擬像素平面上的像素行數(shù),N表示虛擬像素平面上的像素列數(shù);把數(shù)組RAD的每個元素賦值為零;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURRAYA,數(shù)組CURRAYA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)RAY類型的變量;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURSEGA,數(shù)組CURSEGA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SEG類型的變量;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURINPDA,數(shù)組CURINPDA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)INPD類型的變量;在主控結(jié)點(diǎn)A002的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CURSHDTA,數(shù)組CURSHDTA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量;
Step102:在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurRayA,數(shù)組CurRayA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)RAY類型的變量;在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurSegA,數(shù)組CurSegA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SEG類型的變量;在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurInpdA,數(shù)組CurInpdA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)INPD類型的變量;在計(jì)算機(jī)集群A001的每個繪制結(jié)點(diǎn)A003的內(nèi)存中,創(chuàng)建一個包含M行、N列的二維數(shù)組CurShdtA,數(shù)組CurShdtA的每個元素保存一個數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量;把個子場景模型分別加載到計(jì)算機(jī)集群A001的個繪制結(jié)點(diǎn)A003的內(nèi)存中;
Step103:在主控結(jié)點(diǎn)A002上,使用光線投射技術(shù),根據(jù)觀察參數(shù),從視點(diǎn)出發(fā)投射穿過虛擬像素平面上的各個像素的光線A004,光線A004與虛擬像素平面上的像素一一對應(yīng);對于i = 1, 2, 3, ?, M,j = 1, 2, 3, ?, N,把數(shù)組CURRAYA的第i行、第j列的元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量賦值為虛擬像素平面上的第i行、第j列像素對應(yīng)的光線A004的起點(diǎn),把數(shù)組CURRAYA的第i行、第j列的元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RV成員變量賦值為虛擬像素平面上的第i行、第j列像素對應(yīng)的光線A004的方向,把數(shù)組CURRAYA的第i行、第j列的元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為1;
Step104:如果數(shù)組CURRAYA的所有元素存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量的值都為0,則轉(zhuǎn)步驟Step113,否則主控結(jié)點(diǎn)A002通過網(wǎng)絡(luò)把數(shù)組CURRAYA傳送給所有的繪制結(jié)點(diǎn)A003;每個繪制結(jié)點(diǎn)A003接收到數(shù)組CURRAYA后,把數(shù)組CURRAYA的值保存在各自的數(shù)組CurRayA中;
Step105:對每個繪制結(jié)點(diǎn)A003,執(zhí)行如下操作:
Step105-1:對繪制結(jié)點(diǎn)A003的數(shù)組CurRayA中的每個元素B001,計(jì)算元素B001在數(shù)組CurRayA中所對應(yīng)的行號irow和列號jcol,并執(zhí)行如下操作:
Step105-1-1:如果元素B001存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量的值不等于1,則轉(zhuǎn)子步驟Step105-1-2,否則根據(jù)元素B001存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量和RV成員變量確定一條光線B002,判斷光線B002與繪制結(jié)點(diǎn)A003的內(nèi)存中的子場景模型中的幾何對象是否相交,如果不相交,則轉(zhuǎn)子步驟Step105-1-2,否則找到離光線B002的起點(diǎn)最近的交點(diǎn)B003,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量賦值為1,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量賦值為交點(diǎn)B003所在位置,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的NORM成員變量賦值為交點(diǎn)B003所在位置的法向量,把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的MAT成員變量賦值為交點(diǎn)B003所在幾何面片的材質(zhì)數(shù)據(jù);轉(zhuǎn)子步驟Step105-1-3;
Step105-1-2:把數(shù)組CurInpdA的第irow行、第jcol列的元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量賦值為0;
Step105-1-3:對元素B001的操作結(jié)束;
Step105-2:通過網(wǎng)絡(luò)把數(shù)組CurInpdA發(fā)送給主控結(jié)點(diǎn)A002;
Step106:主控結(jié)點(diǎn)A002接收從所有繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA;主控結(jié)點(diǎn)A002把數(shù)組CURINPDA的每個元素存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量賦值為0;在主控結(jié)點(diǎn)A002上,對于n = 1, 2, 3, …, ,分別針對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA,執(zhí)行如下操作:
Step106-1:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA的每個元素C001,執(zhí)行如下操作:
Step106-1-1:計(jì)算元素C001在從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA中所對應(yīng)的行號I和列號J;令eCURInpdA表示數(shù)組CURINPDA的第I行、第J列的元素;令eCURRayA表示數(shù)組CURRAYA的第I行、第J列的元素;
Step106-1-2:如果eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量的值為0,則把元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的值賦給eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量,否則判斷元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量的值是否等于0,如果不等于0,則計(jì)算eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量表示的位置到eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量表示的點(diǎn)的位置的距離D1,計(jì)算元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量表示的位置到eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量表示的點(diǎn)的位置的距離D2,進(jìn)一步判斷D1是否大于D2,如果是,則把元素C001存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的值賦給eCURInpdA存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量;
Step106-1-3:對元素C001的操作結(jié)束;
Step106-2:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurInpdA的操作結(jié)束;
Step107:在主控結(jié)點(diǎn)A002上,把數(shù)組CURSEGA的每個元素存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GUT成員變量賦值為0;對數(shù)組CURINPDA的每個元素C002,執(zhí)行如下操作:
Step107-1:計(jì)算元素C002在數(shù)組CURINPDA中對應(yīng)的行號I和列號J;令eCURSegA表示數(shù)組CURSEGA的第I行、第J列的元素;如果元素C002存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量的值為1,則在面光源上隨機(jī)產(chǎn)生一個采樣點(diǎn)Prs,把采樣點(diǎn)Prs賦給eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GE成員變量,把元素C002存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量的值賦給eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GS成員變量,把eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GUT成員變量賦值為1;
Step107-2:對元素C002的操作結(jié)束;
Step108:主控結(jié)點(diǎn)A002通過網(wǎng)絡(luò)把數(shù)組CURSEGA發(fā)給所有的繪制結(jié)點(diǎn)A003;每個繪制結(jié)點(diǎn)A003接收到數(shù)組CURSEGA后,把數(shù)組CURSEGA的值保存在各自的數(shù)組CurSegA中;
Step109:對每個繪制結(jié)點(diǎn)A003,執(zhí)行如下操作:
Step109-1:對繪制結(jié)點(diǎn)A003的數(shù)組CurSegA中的每個元素C003,計(jì)算元素C003在數(shù)組CurSegA中所對應(yīng)的行號irow和列號jcol,并執(zhí)行如下操作:
Step109-1-1:令eCurShdtA表示數(shù)組CurShdtA的第irow行、第jcol列的元素;把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量賦值為0;如果元素C003存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GUT成員變量的值為1,則首先把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量賦值為1,然后判斷由元素C003存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GS成員變量和GE成員變量的值確定的線段是否與繪制結(jié)點(diǎn)A003的內(nèi)存中的子場景模型中的幾何對象相交,如果相交,則把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量賦值為0,否則把eCurShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量賦值為1;
Step109-1-2:對元素C003的操作結(jié)束;
Step109-2:通過網(wǎng)絡(luò)把數(shù)組CurShdtA發(fā)送給主控結(jié)點(diǎn)A002;
Step110:主控結(jié)點(diǎn)A002接收從所有繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA;主控結(jié)點(diǎn)A002把數(shù)組CURSHDTA的每個元素存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量賦值為0;在主控結(jié)點(diǎn)A002上,對于n = 1, 2, 3, …, ,分別針對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA,執(zhí)行如下操作:
Step110-1:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA的每個元素C004,執(zhí)行如下操作:
Step110-1-1:計(jì)算元素C004在從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA中所對應(yīng)的行號I和列號J;令eCURShdtA表示數(shù)組CURSHDTA的第I行、第J列的元素;
Step110-1-2:如果eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量的值為0,則把元素C004存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的值賦給eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量,否則判斷元素C004存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的SHUT成員變量的值是否等于0,如果不等于0,則把eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量的值和元素C004存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量的值作“與”運(yùn)算的結(jié)果賦值給eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量;
Step110-1-3:對元素C004的操作結(jié)束;
Step110-2:對從第n個繪制結(jié)點(diǎn)A003發(fā)來的數(shù)組CurShdtA的操作結(jié)束;
Step111:在主控結(jié)點(diǎn)A002上,對數(shù)組CURINPDA的每個元素C005,執(zhí)行如下操作:
Step111-1:計(jì)算元素C005在數(shù)組CURINPDA中所對應(yīng)的行號I和列號J;令eCURRAD表示數(shù)組RAD的第I行、第J列的元素;令eCURShdtA表示數(shù)組CURSHDTA的第I行、第J列的元素;令eCURSegA表示數(shù)組CURSEGA的第I行、第J列的元素;令eCURRayA表示數(shù)組CURRAYA的第I行、第J列的元素;令ePOS表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的POS成員變量,令eNORM表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的NORM成員變量,令eMAT表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的MAT成員變量,令eINUT表示元素C005存儲的數(shù)據(jù)結(jié)構(gòu)INPD類型的變量的INUT成員變量;令Plis表示eCURSegA存儲的數(shù)據(jù)結(jié)構(gòu)SEG類型的變量的GE成員變量;
Step111-2:如果eINUT的值為0,則把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為0并轉(zhuǎn)子步驟Step111-4,否則把Plis的值作為光源采樣點(diǎn)位置C006,把ePOS的值作為三維場景點(diǎn)位置Pscn,把eNORM的值作為三維場景點(diǎn)的法向量,把eMAT的值作為三維場景點(diǎn)所在幾何面片的材質(zhì)數(shù)據(jù),把eCURShdtA存儲的數(shù)據(jù)結(jié)構(gòu)SHDT類型的變量的TO成員變量的值作為光源采樣點(diǎn)位置C006與三維場景點(diǎn)位置Pscn之間的可見性值,按照單機(jī)版路徑跟蹤技術(shù)使用的方法計(jì)算經(jīng)三維場景點(diǎn)位置Pscn表示的點(diǎn)散射后沿跟蹤的路徑反向傳到視點(diǎn)的直接光照亮度值DILLU;如果三維場景點(diǎn)位置Pscn表示的點(diǎn)在面光源上,則進(jìn)一步計(jì)算從三維場景點(diǎn)位置Pscn處主動發(fā)射的沿跟蹤的路徑反向傳到視點(diǎn)的主動發(fā)射光照亮度值EILLU,并把光照亮度值EILLU賦給變量Vei,否則令變量Vei等于0;把光照亮度值DILLU、變量Vei的值以及eCURRAD的值相加的結(jié)果賦給eCURRAD,以完成沿跟蹤的路徑反向傳到視點(diǎn)的光照亮度的累加收集;
Step111-3:根據(jù)eMAT的值計(jì)算三維場景點(diǎn)位置Pscn處的光散射概率ρ,生成一個在0至1之間服從均勻分布的隨機(jī)數(shù)μ,如果μ ≥ ρ,則把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為0,否則在單位球空間內(nèi)按均勻分布隨機(jī)生成一個方向Vu,把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RS成員變量賦值為ePOS,把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RV成員變量賦值為方向Vu,把eCURRayA存儲的數(shù)據(jù)結(jié)構(gòu)RAY類型的變量的RUT成員變量賦值為1;
Step111-4:針對元素C005的操作結(jié)束;
Step112:轉(zhuǎn)步驟Step104;
Step113:所有像素對應(yīng)的單條路徑跟蹤操作結(jié)束。
重復(fù)執(zhí)行NpathT次步驟Step101至步驟Step113的操作,把每次得到的數(shù)組RAD的值都保存在主控結(jié)點(diǎn)A002上;最后,在主控結(jié)點(diǎn)A002上,創(chuàng)建一個包含M行、N列的二維數(shù)組aRAD;對數(shù)組aRAD的每個元素D001,執(zhí)行如下操作:計(jì)算元素D001在數(shù)組aRAD中所對應(yīng)的行號I和列號J;把執(zhí)行第1次步驟Step101至步驟Step113的操作得到的數(shù)組RAD的第I行、第J列的元素,執(zhí)行第2次步驟Step101至步驟Step113的操作得到的數(shù)組RAD的第I行、第J列的元素,以此類推一直到執(zhí)行第NpathT次步驟Step101至步驟Step113的操作得到的數(shù)組RAD的第I行、第J列的元素之和賦給變量aSUM;把元素D001賦值為變量aSUM除以NpathT得到的結(jié)果。
在主控結(jié)點(diǎn)A002上,把數(shù)組aRAD存儲的光照亮度值轉(zhuǎn)換成像素顏色值,并顯示在計(jì)算機(jī)屏幕上。