一種基于3d場(chǎng)景gpu端軟件遮擋查詢(xún)的圖形繪制方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及3D場(chǎng)景圖形繪制領(lǐng)域,尤其涉及一種基于3D場(chǎng)景GPU端軟件遮擋查詢(xún)的圖形繪制方法。
【背景技術(shù)】
[0002]在大規(guī)模3D場(chǎng)景中有大量的模型和地形需要繪制,其中大部分是非透明的,在這些非透明的物體后大量物體被遮擋,真正能看到的物體并不多。比如,當(dāng)位于大樓前,大樓后面的建筑不可見(jiàn),當(dāng)位于房屋內(nèi)部時(shí),除了透過(guò)門(mén)窗外,其外部的模型和地形都不可見(jiàn),因此在大規(guī)模3D場(chǎng)景的模型和地形繪制中,首先需要對(duì)每一個(gè)批次、每一幀圖像進(jìn)行遮擋查詢(xún),然后進(jìn)行繪制。
[0003]現(xiàn)有技術(shù)中,遮擋查詢(xún)一般分為硬件遮擋查詢(xún)和軟件遮擋查詢(xún),其中,
硬件遮擋查詢(xún)可以提供某個(gè)批次有多少個(gè)像素會(huì)被繪制出,從而當(dāng)像素個(gè)數(shù)小于某值時(shí),我們認(rèn)為該批次被遮擋了。然而此技術(shù)根據(jù)硬件環(huán)境的不同,只能在提交查詢(xún)后的下一幀,或幾幀后才能知道該批次結(jié)果,甚至無(wú)法返回結(jié)果,即便物體不需要繪制,為了查詢(xún)也必須提交繪制。
[0004]基于深度圖的軟件遮擋查詢(xún)通常需要預(yù)先繪制遮擋體(遮擋其他物件標(biāo)記物體)深度圖,該深度圖可以由CPU軟件光柵化得出,也可以由GPU預(yù)渲染,但必然導(dǎo)致大量額外的性能開(kāi)銷(xiāo)(CPU端光線追蹤/GPU預(yù)渲染的遮擋體),且遮擋體需要預(yù)先標(biāo)記。
【發(fā)明內(nèi)容】
[0005]為了解決現(xiàn)有技術(shù)存在的不足,本發(fā)明的目的在于提供一種基于3D場(chǎng)景GPU端軟件遮擋查詢(xún)的圖形繪制方法,從而實(shí)現(xiàn)通過(guò)軟件模擬來(lái)判斷遮擋關(guān)系進(jìn)而繪制圖形。
[0006]為實(shí)現(xiàn)上述目的,本發(fā)明提供的基于3D場(chǎng)景GPU端軟件遮擋查詢(xún)的圖形繪制方法,包括以下步驟:
1)獲取上一幀的遮擋查詢(xún)結(jié)果;
2)根據(jù)上一幀結(jié)果,把上一幀可見(jiàn)的批次繪制深度圖;
3)把所有批次跟第二步產(chǎn)生的深度圖比較,形成目標(biāo)渲染對(duì)象;
4)獲取當(dāng)前幀的遮擋查詢(xún)結(jié)果;
5)把上一幀不可見(jiàn)的,但當(dāng)前幀可見(jiàn)的批次補(bǔ)充繪制深度圖;
6)繪制當(dāng)前幀可見(jiàn)的所有物體。
[0007]進(jìn)一步地,所述步驟1)進(jìn)一步包括以下步驟:獲取上一幀的遮擋查詢(xún)結(jié)果后,將遮擋查詢(xún)結(jié)果記錄在批次收集器里,對(duì)每個(gè)批次都增加了一個(gè)“是否遮擋”的布爾屬性。
[0008]進(jìn)一步地,客戶端啟動(dòng)后,第一幀初始化為不遮擋,且每一幀結(jié)束不立刻清空遮擋查詢(xún)結(jié)果。
[0009]進(jìn)一步地,所述步驟2)進(jìn)一步包括以下步驟:在當(dāng)前幀渲染的過(guò)程中,即遍歷批次收集器的時(shí)候,獲取批次里面的“是否遮擋”布爾屬性,并加以判斷,如果此屬性是不遮擋,則關(guān)閉寫(xiě)入Color Buffer,開(kāi)啟寫(xiě)入Z-Buffer,僅僅繪制此批次的深度信息到深度圖里。
[0010]進(jìn)一步地,所述步驟3)進(jìn)一步包括以下步驟:取出所有批次的幾何體包圍盒的8個(gè)頂點(diǎn),并轉(zhuǎn)化到屏幕空間,獲得在屏幕空間下所述8個(gè)頂點(diǎn)所覆蓋的最大長(zhǎng)方形區(qū)域,最后把結(jié)果數(shù)據(jù)傳入到一張紋理里,傳遞給GPU進(jìn)行比較。
[0011]進(jìn)一步地,在GPU中比較的時(shí)候,將所述結(jié)果數(shù)據(jù)與所述深度圖進(jìn)行像素級(jí)的深度比較,如果發(fā)現(xiàn)存在一個(gè)像素可見(jiàn),則認(rèn)為此批次可見(jiàn),最后把GPU返回的結(jié)果信息,寫(xiě)入一張紋理里,形成目標(biāo)渲染對(duì)象。
[0012]進(jìn)一步地,所述步驟4)是從所述目標(biāo)渲染對(duì)象中讀取出結(jié)果信息,并將其寫(xiě)入到批次搜集器里對(duì)應(yīng)的是否遮擋布爾屬性當(dāng)中。
[0013]進(jìn)一步地,所述步驟6)進(jìn)一步包括以下步驟:依次遍歷所有的批次,如果可見(jiàn),就繪制此批次,把看得到的物體呈現(xiàn)在客戶端上。
[0014]本發(fā)明的基于3D場(chǎng)景GPU端軟件遮擋查詢(xún)的圖形繪制方法,其技術(shù)效果主要包括:不需要預(yù)先繪制遮擋體深度圖,削減了性能開(kāi)銷(xiāo),且不需要專(zhuān)門(mén)標(biāo)記用于遮擋的物體,無(wú)錯(cuò)誤遮擋引起的閃爍;不可見(jiàn)的批次就不走進(jìn)Direct3D的渲染管線里,從而減低了 GPU渲染壓力,增強(qiáng)了渲染效率。
[0015]本發(fā)明的其它特征和優(yōu)點(diǎn)將在隨后的說(shuō)明書(shū)中闡述,并且,部分地從說(shuō)明書(shū)中變得顯而易見(jiàn),或者通過(guò)實(shí)施本發(fā)明而了解。
【附圖說(shuō)明】
[0016]附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,并且構(gòu)成說(shuō)明書(shū)的一部分,并與本發(fā)明的實(shí)施例一起,用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的限制。在附圖中:
圖1為根據(jù)本發(fā)明的基于3D場(chǎng)景GPU端軟件遮擋查詢(xún)的圖形繪制方法流程圖。
【具體實(shí)施方式】
[0017]以下結(jié)合附圖對(duì)本發(fā)明的優(yōu)選實(shí)施例進(jìn)行說(shuō)明,應(yīng)當(dāng)理解,此處所描述的優(yōu)選實(shí)施例僅用于說(shuō)明和解釋本發(fā)明,并不用于限定本發(fā)明。
[0018]圖1為根據(jù)本發(fā)明的基于3D場(chǎng)景GPU端軟件遮擋查詢(xún)的圖形繪制方法流程圖。下面將參考圖1,對(duì)本發(fā)明的基于3D場(chǎng)景GPU端軟件遮擋查詢(xún)的圖形繪制方法進(jìn)行詳細(xì)描述。
[0019]首先,在步驟101,獲取上一幀的遮擋查詢(xún)結(jié)果,并將遮擋查詢(xún)結(jié)果記錄在批次收集器里,對(duì)每個(gè)批次都增加了一個(gè)“是否遮擋”的布爾屬性。
[0020]其中,客戶端啟動(dòng)后,第一幀初始化為不遮擋,之后每一幀結(jié)束都不會(huì)立刻清空遮擋查詢(xún)的結(jié)果,因?yàn)樾栌糜谙乱粠拇瞬襟E使用。
[0021]在步驟102,根據(jù)上一幀結(jié)果,把上一幀可見(jiàn)的批次繪制深度圖。
[0022]其中,在當(dāng)前幀渲染的過(guò)程中,即遍歷批次收集器的時(shí)候,獲取批次里面的“是否遮擋”布爾屬性,并加以判斷。如果此屬性是不遮擋,則關(guān)閉寫(xiě)入Color Buffer,開(kāi)啟寫(xiě)入Z-Buffer,僅僅繪制此批次的深度信息到深度圖里。
[0023]在步驟103,把所有批次跟第二步產(chǎn)生的深度圖比較,形成目標(biāo)渲染對(duì)象。先取出所有批次的幾何體包圍盒的8個(gè)頂點(diǎn),并轉(zhuǎn)化到屏幕空間,獲得屏幕空間下的8個(gè)點(diǎn)所覆蓋的最大長(zhǎng)方形區(qū)域,最后把結(jié)果數(shù)據(jù)傳入到一張紋理里,用于傳遞給GPU使用。