創(chuàng)建3D圖形引擎(4) 摘要:
盲目地繪制成千的物體而沒(méi)有執(zhí)行任何的剪切,是導(dǎo)致在圖形-渲染通道中時(shí)間延遲的一個(gè)主要原因。需要再次使用視錐以快速確定哪些物體位于視野中,為了確定哪些物體是可見(jiàn)的,可將每個(gè)三維物體包圍到一個(gè)可見(jiàn)的球體中,稱(chēng)之為框界球體(bounding
sphere)。
下圖演示了框界球體和視錐的運(yùn)用,它展示了一個(gè)場(chǎng)景,其中有三個(gè)物體和一個(gè)視錐,每個(gè)網(wǎng)格模型都有一個(gè)可見(jiàn)的框界球體圍繞著它。當(dāng)一個(gè)球體位于構(gòu)成視錐的6個(gè)平面前時(shí),它就被認(rèn)為是可見(jiàn)的。可以看出僅兩個(gè)位于視錐中的物體是可見(jiàn)的,而另一個(gè)物體完全位于視錐外,繪制時(shí)能完全跳過(guò)那個(gè)位于視錐之外的物體。為了實(shí)現(xiàn)這一點(diǎn),必須計(jì)算每個(gè)物體的框界球體,然后檢測(cè)球體是否位于視錐之內(nèi)。
創(chuàng)建3D圖形引擎(3) 摘要:
在每幀中繪制所有的多邊形是非常低效的,為了提高處理的速度,可以僅渲染那些位于視野內(nèi)的多邊形,同時(shí)應(yīng)避免掃描場(chǎng)景中的每個(gè)多邊形來(lái)確定哪些多邊形是可見(jiàn)的。如果不每幀進(jìn)行搜索,又如何知道哪些多邊形是位于視野內(nèi)呢?解決的方法就是將一個(gè)三維模型分解為一些較小的塊(稱(chēng)為節(jié)點(diǎn)nodes),其容納較少的多邊形。然后將節(jié)點(diǎn)排列到一個(gè)特定的結(jié)構(gòu)中(一棵樹(shù)),以便進(jìn)行快速搜索,并確定哪個(gè)節(jié)點(diǎn)是可見(jiàn)的,然后渲染這些可見(jiàn)的節(jié)點(diǎn),通過(guò)使用視錐,可以找出哪些節(jié)點(diǎn)是可見(jiàn)的。取代搜索數(shù)千個(gè)多邊形,通過(guò)搜索一個(gè)小小的節(jié)點(diǎn)集合,就能決定怎樣進(jìn)行繪制。節(jié)點(diǎn)樹(shù)引擎適用于任何的網(wǎng)格模型,并將它拆分為節(jié)點(diǎn),以便快速渲染網(wǎng)格模型(網(wǎng)格模型代表了游戲的層次)。
創(chuàng)建3D圖形引擎(2) 摘要: 本篇是創(chuàng)建3D圖形引擎(1)的續(xù)篇,3D圖形引擎的代碼以創(chuàng)建游戲內(nèi)核中編寫(xiě)的代碼為基礎(chǔ)進(jìn)行開(kāi)發(fā)。
視錐(viewing frustum)是6個(gè)平面的集合,它從觀察點(diǎn)向外擴(kuò)展,以確定某個(gè)多邊形是否能夠被觀察到。
首先,可以將視錐看作是一個(gè)以觀察者開(kāi)始擴(kuò)展的金字塔。
創(chuàng)建3D圖形引擎(1) 摘要:
使用單一的網(wǎng)格模型雖然可以同時(shí)渲染整個(gè)層次,但卻意味著那些沒(méi)有被看到的部分在通過(guò)渲染管道時(shí)會(huì)被裁剪掉,也就是說(shuō)這樣做會(huì)浪費(fèi)時(shí)間。不要沮喪,因?yàn)槭褂靡粋€(gè)單獨(dú)的網(wǎng)格模型進(jìn)行層次的渲染仍然有一些非常好的方法。比如說(shuō),在游戲世界中包括了單獨(dú)的地牢,每個(gè)地牢包含不同的房間,所有的房間通過(guò)走廊連接到一起。其實(shí),每個(gè)房間和走廊就是一個(gè)單獨(dú)的網(wǎng)格模型,所要做的就是在游戲的處理過(guò)程中加載以及釋放那些代表地牢房間的網(wǎng)格模型。