<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評(píng)論 :: 0 Trackbacks

    原文:ExtremeTech 3D Pipeline Tutoria

    June 13, 2001 - By Dave Salvator

    轉(zhuǎn)載請(qǐng)注明出處

    介紹

    從令人著迷的電影特效,到醫(yī)學(xué)成像、電子游戲和更多的領(lǐng)域,3D圖形所帶來的沖擊不亞于一場革命。這項(xiàng)從五年前(1996年)開始,帶來了個(gè)人電腦消費(fèi)風(fēng)暴的技術(shù),根源于學(xué)術(shù)界和軍事。其實(shí)從某種程度上來說,我們今天在個(gè)人電腦上所享受的3D圖形算是一種“和平紅利”,許多最初設(shè)計(jì)軍事模擬器的專家如今在從事3D圖形芯片,電影和游戲開發(fā)產(chǎn)業(yè)的工作。

    除娛樂之外,3D圖形技術(shù)在計(jì)算機(jī)輔助設(shè)計(jì)(CAD)上為工業(yè)設(shè)計(jì)帶來了巨大的飛躍。制造商不但可以不使用任何材料設(shè)計(jì)并“構(gòu)造”出他們的產(chǎn)品,還可以通過連接擁有電腦輔助建造(CAM)系統(tǒng)的制造機(jī)械來使用這些3D模型。但對(duì)我們大多數(shù)人來說,3D圖形技術(shù)給娛樂產(chǎn)業(yè)帶來的沖擊最大,包括電影和游戲,正因?yàn)槿绱耍覀冊(cè)S多人都對(duì)3D圖形相關(guān)的技術(shù)和術(shù)語有所了解。

    記住不是所有的渲染系統(tǒng)都有著相同的目標(biāo)。對(duì)于離線渲染系統(tǒng),像CAD程序中所使用的,精確度比幀速要重要得多。例如,這種模型有可能用來制造飛機(jī)部件。實(shí)時(shí)渲染器,像游戲引擎和模擬器,趨向于強(qiáng)調(diào)固定的幀速來得到平滑流暢的動(dòng)畫效果,為了這一目的寧愿犧牲掉圖形和紋理的細(xì)節(jié)。

    有些渲染器是混合型的,比如電影《玩具總動(dòng)員》所使用的。藝術(shù)家和程序員們使用Pixar的Renderman技術(shù)來創(chuàng)造眩目的視覺場景,但動(dòng)畫的每一幀在服務(wù)器場——一個(gè)計(jì)算機(jī)集群,渲染工作可以在其中分布式進(jìn)行——上要耗費(fèi)數(shù)小時(shí)進(jìn)行渲染。這些離線渲染的幀之后被排成標(biāo)準(zhǔn)電影的每秒24幀的序列,來制作電影的最終剪輯。

    隨著急速增長的對(duì)3D芯片渲染能力的需求,“消費(fèi)級(jí)3D”和“工作站級(jí)3D”之間的界線已經(jīng)非常模糊了。然而,實(shí)時(shí)游戲引擎仍然做了許多折衷來保持幀速,一些甚至設(shè)計(jì)了“油門”來控制當(dāng)幀速降低到規(guī)定的水平之下時(shí)自動(dòng)打開和關(guān)閉某些特性。相比之下,工作站級(jí)3D需要一些當(dāng)今游戲不需要的高級(jí)特性。

    3D圖形領(lǐng)域廣大而復(fù)雜。我們的目標(biāo)是寫出一系列相當(dāng)技術(shù)性的,但通俗易懂的,有關(guān)3D圖形技術(shù)的文章。我們從用來創(chuàng)建3D圖形的,被稱作3D管線的多步處理流程開始。我們會(huì)遍歷整個(gè)3D管線,從場景中一個(gè)三角形開始,到最終一個(gè)像素被畫出。我們會(huì)提到一些與渲染3D場景相關(guān)的數(shù)學(xué),盡管對(duì)3D算法只是做簡單的介紹(如果你想深入學(xué)習(xí),在本文最后我們列出了相當(dāng)數(shù)量的參考)。

    在管線中,準(zhǔn)備就緒

    因?yàn)?D圖形渲染本身的有序特性,因?yàn)橛腥绱硕嗟挠?jì)算要做,大量的數(shù)據(jù)要處理,整個(gè)處理過程被拆分成不同的步驟,有時(shí)被稱作階段(Stage)。這些階段被依次送入前面提到的3D圖形管線中。

    創(chuàng)建場景所需的巨大工作量使得3D渲染系統(tǒng)的設(shè)計(jì)者們(包括硬件和軟件)尋找一切可能的方法來去除不必要的工作。有設(shè)計(jì)師這么諷刺過,“3D圖形學(xué)是欺騙而不被抓住的藝術(shù)”解釋一下,這句話的意思是說,3D圖形學(xué)中的一種藝術(shù)形式就是優(yōu)雅地通過降低場景中的顯示細(xì)節(jié)來獲得更好的性能,但卻不讓觀察者注意到顯示質(zhì)量上的損失。處理器和內(nèi)存帶寬是寶貴的資源,因此設(shè)計(jì)師為節(jié)約它們所做的任何努力都會(huì)對(duì)性能非常有利。一個(gè)重要的例子就是揀選,它用來告訴渲染器,“如果觀察攝像機(jī)(觀察者的眼睛)看不到它,別自找麻煩去處理它,只操心攝像機(jī)能看到的東西吧。”

    伴隨著相關(guān)處理步驟的數(shù)量和復(fù)雜度,這些階段(Stage)在管線中的次序可以在執(zhí)行時(shí)改變。之后我們很快會(huì)更加詳細(xì)地檢閱這些階段中所做的操作,概括地說,一個(gè)常規(guī)的3D管線順序拆分為四個(gè)片段:應(yīng)用/場景,幾何圖元,三角形設(shè)置和光柵化/渲染。雖然下面的片段草圖可能看起來比較嚇人,當(dāng)你讀完這篇文章時(shí),你會(huì)成為極少數(shù)真正理解3D圖形工作原理的人中的一員,我們認(rèn)為你將會(huì)想要理解得更加深入。

    操作在哪里完成

    3D世界的大多數(shù)高層次方面操作由管線中應(yīng)用階段部分(有爭論認(rèn)為它技術(shù)上不屬于3D管線的一部分)的應(yīng)用軟件負(fù)責(zé)管理,余下的三個(gè)主要階段通常由一套應(yīng)用程序接口(API)負(fù)責(zé)管理,例如SGI的OpenGL,微軟的Direct3D,或Pixar的Renderman。API通過調(diào)用圖形驅(qū)動(dòng)程序和硬件來在硬件中執(zhí)行絕大多數(shù)的圖形操作。

    圖形API實(shí)際上是為應(yīng)用提供了硬件抽象,反過來說,為應(yīng)用提供了真正的設(shè)備無關(guān)性。因而,這些API通常被稱作硬件抽象層(HALs)。它們的設(shè)計(jì)目標(biāo)非常簡明——應(yīng)用開發(fā)者一旦為某個(gè)API寫出了程序,這個(gè)程序就可以(而且應(yīng)該)運(yùn)行在任何支持這個(gè)API的硬件上。相反的,硬件制造者為這些API編寫驅(qū)動(dòng)程序,這樣為這些API寫的應(yīng)用就可以在它們的硬件上運(yùn)行了(圖1)。說明一下,添加“應(yīng)該”這個(gè)詞是因?yàn)橛行r(shí)候因?yàn)榧嫒菪詥栴}會(huì)導(dǎo)致API的不正確使用(被稱作違規(guī)),這會(huì)導(dǎo)致應(yīng)用依賴于某個(gè)特定的硬件特性,或者導(dǎo)致在某個(gè)硬件驅(qū)動(dòng)下API特性被錯(cuò)誤地執(zhí)行,最終產(chǎn)生了錯(cuò)誤的或不可預(yù)知的結(jié)果。

    空間入侵者

    深入管線細(xì)節(jié)之前,我們首先要從高層了解3D物體和3D世界是如何定義,物體如何被定義,放置,定位,如何在更大的3D空間內(nèi),或者就在它們自己的邊界內(nèi)進(jìn)行控制。在一個(gè)3D渲染系統(tǒng)中,多個(gè)笛卡爾坐標(biāo)系(x-(左/右),y-(上/下),z-(遠(yuǎn)/近))被應(yīng)用在管線的不同階段。被運(yùn)用在互相關(guān)聯(lián)但各不相同的目的的同時(shí),每個(gè)坐標(biāo)系都提供了精確的數(shù)學(xué)方法來在空間中定位和描述物體。毫無意外的,每個(gè)這樣的坐標(biāo)系都被稱作“空間”。

    3D場景中的物體和場景本身在經(jīng)過3D管線時(shí)被連續(xù)地進(jìn)行轉(zhuǎn)換或者變換,一共要通過五個(gè)空間。下面是這些空間的簡單概述:

    模型空間(Model Space)模型在它們自己的坐標(biāo)系中,原點(diǎn)是模型上的某個(gè)點(diǎn),比如在一個(gè)英式足球運(yùn)動(dòng)員模型的右腳上。而且,模型有一個(gè)控制點(diǎn)或者“把手”。用來移動(dòng)模型,3D渲染器只需要移動(dòng)控制點(diǎn),因?yàn)槟P涂臻g中模型的坐標(biāo)與它的控制點(diǎn)保持固定的關(guān)聯(lián)關(guān)系。此外,同樣的“把手”也可以用來旋轉(zhuǎn)物體。

    世界空間(World Space)在這里模型被放置在實(shí)際的3D世界中,使用一個(gè)統(tǒng)一的世界坐標(biāo)系。事實(shí)上許多3D程序跳過了世界空間而直接轉(zhuǎn)到了裁剪空間或視圖空間。OpenGL中并不真正有世界空間這個(gè)概念。

    視圖空間(View Space - 也被稱作攝像機(jī)空間 Camera Space):這個(gè)空間中,當(dāng)前觀察攝像機(jī)被程序定位在3D世界坐標(biāo)的某個(gè)點(diǎn)上(通過圖形API)。世界坐標(biāo)系被執(zhí)行變換(使用矩陣數(shù)學(xué),我們稍后會(huì)探討),從而使攝像機(jī)(你的眼睛)處在坐標(biāo)系的原點(diǎn),沿著z軸朝向場景。如果世界空間的變換被跳過了,場景就被直接變換到視圖空間,攝像機(jī)同樣被放在原點(diǎn)沿著z軸方向。沿著z軸遠(yuǎn)離攝像機(jī)深入場景時(shí)z坐標(biāo)的值是增加還是減少由程序員決定的,但我們現(xiàn)假設(shè)你沿著z軸看過去的坐標(biāo)是增加的。注意揀選,背面剔除和光照操作是在視圖空間進(jìn)行的。

    視圖體實(shí)際上由投影(Projection)來創(chuàng)建的,就像名字所暗示的那樣,“投影場景”到攝像機(jī)的前面。從這個(gè)意義上來說,這是種角色倒轉(zhuǎn),攝像機(jī)現(xiàn)在變成了放映機(jī),場景的視圖體通過關(guān)聯(lián)攝像機(jī)進(jìn)行定義。把攝像機(jī)想象成某種全息放映機(jī),但它不是把3D圖像放映到空氣中,而是把場景投影“進(jìn)”你的顯示器。這個(gè)視圖體的形狀可以是矩形(稱作平行投影)也可以是棱錐形(稱作透視投影),后者被稱作平截視圖體(View Frustum)(通常也叫做視圖體(Frustum),雖然視圖體這個(gè)名字更常用)。

    視圖體定義了攝像機(jī)可以看到的部分,同樣重要的是,它也定義了攝像機(jī)看不到的部分,這樣一來,許多物體模型和世界的某些部分都可以被丟棄,以節(jié)約3D芯片的運(yùn)算周期和內(nèi)存帶寬。

    視圖體看起來像是個(gè)頂部被切掉的棱錐。棱錐的頂部緊貼攝像機(jī)的視點(diǎn)并向外發(fā)散。視圖體的頂部被稱作近(前)截面,另一面被稱作遠(yuǎn)(后)截面。整個(gè)被渲染的3D場景必須處在近截面和遠(yuǎn)截面之間,同時(shí)被視圖體的側(cè)面和頂部限制。如果模型中的三角形(或者世界的一部分)超出了視圖體,它們就不會(huì)被處理。同樣的,如果一個(gè)三角形有一部分在視圖體里面一部分在外面,超出的部分會(huì)被視圖體截掉,因此這里才會(huì)使用“裁剪”(Clipping)這個(gè)術(shù)語。盡管視圖空間中的視圖體有裁剪面,裁剪的實(shí)際操作是在視圖體變換到裁剪空間時(shí)執(zhí)行的。 

    深入空間

    裁剪空間(Clip Space):與視圖空間相似,但是視圖體被“壓扁”成了一個(gè)單位立方體,x和y坐標(biāo)被規(guī)格化到了-1到1之間,z坐標(biāo)在0到1之間,這可以簡化裁剪計(jì)算。“透視分割”執(zhí)行規(guī)格化操作,通過用一個(gè)特殊的“w”值除所有的x,y和z頂點(diǎn)坐標(biāo),這個(gè)值就是我們后面將會(huì)詳細(xì)說明的縮放因子。透視分割使近處的物體變大,遠(yuǎn)處的物體變小,跟你所期望看到的真實(shí)場景一樣。

    屏幕空間(Screen Space):在這里3D圖像被轉(zhuǎn)換為x和y的二維屏幕坐標(biāo)來做二維顯示。注意z和w坐標(biāo)依然被圖形系統(tǒng)保留,用于最終渲染之前的深度/Z緩存(參見下面的Z緩存一節(jié))和背面剔除中。注意場景到像素的轉(zhuǎn)換,也就是光柵化的操作,還沒有開始。

    因?yàn)檫@些不同空間之間的變換絕大多數(shù)實(shí)質(zhì)上都是改變參照系,很容易混淆。3D管線容易把人搞暈的一部分原因就是沒有一個(gè)“確定的”路線來執(zhí)行所有這些操作,因?yàn)檠芯咳藛T和程序員們各自發(fā)現(xiàn)了一些有用的技巧和優(yōu)化方法,而且通常都會(huì)有多個(gè)方法可以解決一個(gè)給定的3D/數(shù)學(xué)問題。但是,通常空間變換的處理步驟都按照我們前面介紹的順序來進(jìn)行。

    要對(duì)這些不同空間之間如何相互影響有個(gè)概念,考慮一下下面這個(gè)例子:

    拿幾塊樂高玩具,把它們拼在一起做個(gè)模型。想象一下把單獨(dú)的塊認(rèn)作物體的邊緣,塊與塊的連接部分看作頂點(diǎn)(雖然樂高建筑并不使用3D模型常用的三角形圖元,但我們的例子用四邊形也很合適)。把這個(gè)物體放在你面前,模型空間的原點(diǎn)坐標(biāo)應(yīng)該是左下方離你最近的那個(gè)角,模型的所有坐標(biāo)都由這個(gè)點(diǎn)來衡量。原點(diǎn)實(shí)際上可以是模型的任意一部分,但左下方最近的角是最常用的。當(dāng)你在房間里(3D世界空間或者視圖空間,由3D系統(tǒng)決定)移動(dòng)這個(gè)物體,塊與塊之間的相對(duì)位置是固定不變的(模型空間),雖然它們相對(duì)房間的坐標(biāo)在變化(世界空間或視圖空間)。

    3D管線數(shù)據(jù)流

    某種意義上來說,3D芯片就是物理具體化的3D管線,數(shù)據(jù)在這里從一個(gè)階段(Stage)“順流”到另一個(gè)階段。有一處需要注意,管線中的大多數(shù)應(yīng)用/場景階段和早期的圖元階段的操作是對(duì)每頂點(diǎn)進(jìn)行的,然而揀選和裁剪是對(duì)每三角形進(jìn)行的,渲染操作是對(duì)每像素進(jìn)行的。為提高性能,管線中不同階段的計(jì)算可以重疊。例如,頂點(diǎn)和像素操作在Direct3D和OpenGL中都相互獨(dú)立,所以可以做到一個(gè)三角形在圖元階段時(shí),另一個(gè)在光柵化階段。而且,圖元階段對(duì)兩個(gè)或多個(gè)頂點(diǎn)的計(jì)算和光柵化階段對(duì)兩個(gè)或多個(gè)頂點(diǎn)的計(jì)算(來自相同的三角形)可以同時(shí)執(zhí)行。

    管線的另一個(gè)優(yōu)勢是,因?yàn)樵趫D元階段不會(huì)有數(shù)據(jù)在頂點(diǎn)間傳遞,渲染階段像素間也沒有數(shù)據(jù)傳遞,芯片制造者可以實(shí)現(xiàn)多個(gè)像素管線,通過并行處理這些獨(dú)立實(shí)體來獲得可觀的性能提升。還有需要注意的一處是實(shí)時(shí)渲染中管線的使用,盡管有許多好處,也不是沒有缺點(diǎn)。舉個(gè)例子,一旦一個(gè)三角形被送入管線,程序員幾乎就跟它揮手道別了。要獲取管線中頂點(diǎn)的狀態(tài)或者顏色/透明度信息要付出非常高的性能代價(jià),還可能導(dǎo)致管道阻塞,這是絕對(duì)不該做的事。 

    管線階段——深入探討

    1. 應(yīng)用/場景

    3D應(yīng)用程序自身可以認(rèn)作是3D管線的開始,盡管它并不真的是圖形子系統(tǒng)的一部分,但卻是由它來啟動(dòng)圖形生成處理以生成最終的場景或者動(dòng)畫幀。應(yīng)用程序還設(shè)置觀察攝像機(jī)的位置,也就是你在3D世界中的“眼睛”。物體,包括動(dòng)的和不動(dòng)的首先在應(yīng)用程序中以幾何圖元或者基本的構(gòu)造塊來描述。其中三角形是最常用的圖元。它們簡單易用因?yàn)槿齻€(gè)頂點(diǎn)恰好描述一個(gè)平面,但四個(gè)或更多頂點(diǎn)的多邊形不一定位于同一個(gè)平面上。更復(fù)雜的系統(tǒng)支持被稱作高次表面,它們是不同類型的曲面圖元,這些我們很快會(huì)講到。

    3D世界和其中的物體是在程序中創(chuàng)建的,像3D Studio Max,Maya,AutoDesk 3D Studio,Lightwave和Softimage我們僅舉這幾個(gè)例子。3D藝術(shù)家們通過這些程序不但可以創(chuàng)建模型,還可以讓它們動(dòng)起來。模型首先用大量的三角形構(gòu)建,然后進(jìn)行著色和貼紋理。接下來,依賴于渲染引擎的約束——離線的或者實(shí)時(shí)的——藝術(shù)家可以降低這些高精度模型的三角形數(shù)量來適合給定的性能限制。

    應(yīng)用程序控制物體從一幀移動(dòng)到另一幀,無論是離線渲染器還是游戲引擎。應(yīng)用程序遍歷幾何數(shù)據(jù)庫收集必要的物體信息(幾何數(shù)據(jù)庫包含了構(gòu)成物體的所有幾何圖元),移動(dòng)所有下一幀動(dòng)畫中要變化的物體。以一個(gè)游戲引擎為例,渲染器不會(huì)完成所有的工作。游戲引擎同樣必須處理AI(人工智能),碰撞檢測和物理特性,聲音,以及網(wǎng)絡(luò)(如果游戲在網(wǎng)絡(luò)多人模式下進(jìn)行)。

    所有的模型都有一個(gè)默認(rèn)的“姿勢”,比如人物模型,默認(rèn)姿勢是所謂的“達(dá)芬奇姿勢”,因?yàn)檫@個(gè)姿勢很像達(dá)芬奇著名的“維特魯威人”。一旦應(yīng)用程序指定了模型的新“姿勢”,模型就準(zhǔn)備好了下一步處理。

    維特魯威人一些應(yīng)用程序會(huì)在這里執(zhí)行一個(gè)操作,叫做“遮擋剔除”,可見測試測定物體是部分還是全部被它前方的其他物體遮擋(蓋住)。如果被擋住了,被擋住的物體,或者物體被擋住的部分會(huì)被丟棄。節(jié)省下的計(jì)算代價(jià)值得考慮,否則這些計(jì)算要在管線中執(zhí)行,尤其是有著復(fù)雜深度的場景,也就是處在場景后面的物體有多“層”物體在它們前面,在觀察攝像機(jī)前擋住了它們。

    如果這些被遮擋的物體可以提早被剔除,它們就不必在管道中繼續(xù)前進(jìn),這就節(jié)省了不必要的光照、著色和紋理計(jì)算。例如,在一個(gè)你跟哥斯拉對(duì)抗的游戲中,那個(gè)大家伙藏在你正走向的一幢大樓后面,你看不到他(卑鄙的家伙)。這時(shí)游戲引擎不必繪制哥斯拉的模型,因?yàn)榇髽堑哪P蛽踉诹怂那懊妫@就可以節(jié)約下硬件在這一幀動(dòng)畫中渲染哥斯拉模型的消耗。

    一個(gè)更重要的步驟是對(duì)每個(gè)物體的一個(gè)簡單的可見檢查。這可以通過檢查對(duì)象是否在視圖體中(全部或者部分)來完成。一些引擎還嘗試測量視圖體中的一個(gè)物體是否完全被另一個(gè)物體擋住了。這些操作典型地使用簡單的概念如入口(Portal)和可見集(Visibility Sets)來完成,特別是室內(nèi)場景。這是在3D游戲引擎中實(shí)現(xiàn)的兩種簡單的技術(shù),使引擎不必再繪制3D世界在攝像機(jī)中看不到的部分。[Eberly, p. 413]最初Quake中使用的是稱作潛在可視集(PVS)的技術(shù),它把世界劃分為小塊。本質(zhì)上就是,如果玩家處在世界的一個(gè)特定部分,看不到其他區(qū)域時(shí),游戲引擎就不必處理其他部分的數(shù)據(jù)。

    另一個(gè)程序員們喜歡的降低工作量的技巧是使用綁定盒(Bounding Box)。例如你有個(gè)10000個(gè)三角面的殺手兔模型,與其測試模型的每個(gè)三角形,程序員可以把模型用一個(gè)綁定盒包住,綁定盒由12個(gè)三角形組成(六面體的每個(gè)面兩個(gè)三角形)。然后就可以測試剔除條件(基于綁定盒的頂點(diǎn)而不是兔子模型的頂點(diǎn))來確定殺手兔在場景中是否可見。在你通過指定殺手兔模型中的共享頂點(diǎn)(相鄰三角形可以共享的頂點(diǎn),我們后面會(huì)詳細(xì)探究的一個(gè)概念)來進(jìn)一步減少頂點(diǎn)數(shù)之前,針對(duì)于這個(gè)測試你已經(jīng)把總頂點(diǎn)數(shù)從30000(殺手兔模型)個(gè)減少到了36個(gè)(綁定盒)。如果檢測表明綁定盒在場景中不可見,殺手兔模型就可以簡單地被丟棄,你就為自己省了一大堆工作。

    你LOD了沒有?

    另一個(gè)消除額外工作的方法就是所謂的物體細(xì)節(jié)等級(jí)(Level of Detail),被稱為LOD。這項(xiàng)技術(shù)是有損的,但對(duì)于它的一般應(yīng)用來說,損失的模型細(xì)節(jié)通常是覺察不到的。物體模型由數(shù)個(gè)不同的細(xì)節(jié)等級(jí)構(gòu)造。很恰當(dāng)?shù)睦邮且粋€(gè)最高細(xì)節(jié)等級(jí)的戰(zhàn)斗機(jī)模型使用10000個(gè)三角形,附帶的低精度細(xì)節(jié)等級(jí)分別由5000,2500,1000和500個(gè)三角形組成。具體使用哪一個(gè)細(xì)節(jié)等級(jí)由戰(zhàn)斗機(jī)距離觀察攝像機(jī)的距離決定。如果很近,就使用最高的細(xì)節(jié)等級(jí),如果是剛剛能在攝像機(jī)中看到而已,就使用最低的細(xì)節(jié)等級(jí),在這兩種情況之間,就使用其它的細(xì)節(jié)等級(jí)。

    細(xì)節(jié)等級(jí)的選擇總是由應(yīng)用程序在將物體送入管線做進(jìn)一步處理之前完成。為了決定使用哪一個(gè)細(xì)節(jié)等級(jí),應(yīng)用程序把物體的一個(gè)簡化版本(通常只是中心點(diǎn))映射到視圖空間,以測定到物體的距離。這項(xiàng)操作獨(dú)立于管線執(zhí)行。必須確定具體的細(xì)節(jié)等級(jí)以決定將哪個(gè)三角形的集合(不同細(xì)節(jié)等級(jí))送入管線。

    幾何專用技巧

    一般來說,三角形多的模型看起來更加真實(shí)。這些三角形的信息——它們?cè)?D世界中的位置,顏色等——保存在每個(gè)三角形的頂點(diǎn)描述中。這些3D世界中的頂點(diǎn)集合被稱作場景數(shù)據(jù)庫,跟上面提到的把動(dòng)物模型做為幾何數(shù)據(jù)庫非常相像。模型中的彎曲部分,比如汽車上的輪子,需要許多三角形來近似形成一個(gè)光滑曲面。在一個(gè)圓形中努力減少頂點(diǎn)/三角形數(shù)量會(huì)造成不利影響,例如,使用低細(xì)節(jié)等級(jí)將造成一個(gè)“崎嶇不平”的圓,構(gòu)成圓的三角形頂點(diǎn)都可以看到。如果用更多的三角形來表現(xiàn)這個(gè)圓,它的邊緣看起來會(huì)平滑得多。我們可以進(jìn)行優(yōu)化來減少實(shí)際送入管線的三角形數(shù)量卻不必降低模型細(xì)節(jié),因?yàn)橄噙B的三角形頂點(diǎn)是共享的。程序員可以使用連接的三角形繪制模式來降低頂點(diǎn)數(shù),即三角帶和扇形。例如:

    在三角帶模式下,最簡單的例子就是由兩個(gè)三角形拼成的矩形,它擁有一條共享的斜邊。通常,單獨(dú)繪制兩個(gè)這樣的三角形會(huì)產(chǎn)生六個(gè)頂點(diǎn)。但是,由于兩個(gè)三角形連在一起,它們形成了一個(gè)簡單的,由四個(gè)頂點(diǎn)描述的三角帶,把平均每個(gè)三角形需要的頂點(diǎn)數(shù)減少到了兩個(gè),優(yōu)于原先的三個(gè)。看起來減少得并不多,隨著三角形數(shù)目的增多(頂點(diǎn)數(shù)也同樣變化)優(yōu)勢也會(huì)愈加明顯,平均每個(gè)三角形單獨(dú)擁有的頂點(diǎn)數(shù)降低到了一個(gè)。[RTR, p. 234]以下是計(jì)算平均頂點(diǎn)數(shù)的公式,給定m個(gè)三角形:

    1+2m

    因此,在一個(gè)有100個(gè)三角形的三角帶中,平均每個(gè)三角形頂點(diǎn)數(shù)是1.02個(gè),或者說總共有102個(gè)頂點(diǎn),相比獨(dú)立三角形的300個(gè)頂點(diǎn)是相當(dāng)可觀的節(jié)約。在這個(gè)例子中,我們通過把m個(gè)三角形改用三角帶達(dá)到最大限度節(jié)約了成本,一共是m+2個(gè)頂點(diǎn)。這些節(jié)約可以積少成多,當(dāng)考慮Direct3D中使用32個(gè)字節(jié)的數(shù)據(jù)來描述一個(gè)頂點(diǎn)的屬性(如位置,顏色,透明度等)。當(dāng)然,整個(gè)場景不可能只由三角帶和扇形組成,但為了相應(yīng)節(jié)約的成本,開發(fā)人員會(huì)盡量使用它們。

    在扇形情況下,程序員可能使用20個(gè)三角形排列在一個(gè)扇形區(qū)來描述一個(gè)半圓。正常情況下由60個(gè)頂點(diǎn)組成,但通過使用扇形來描述,頂點(diǎn)數(shù)量可以降低到22個(gè)。第一個(gè)三角形有三個(gè)頂點(diǎn),但接下來每個(gè)新增的三角形只需要增加一個(gè)頂點(diǎn),扇形的中心有一個(gè)所有三角形共享的頂點(diǎn)。同樣達(dá)到了使用三角帶/扇形最大限度的節(jié)約。

    使用三角帶和扇形的另一大優(yōu)勢是,它們是“無損”的數(shù)據(jù)壓縮,這意味著并沒有任何信息和圖形精度為了數(shù)據(jù)壓縮和速度提升而損失掉。此外,以三角帶和扇形向硬件傳送三角形可以提高頂點(diǎn)緩存的效率,這可以加速幾何處理的性能。另一個(gè)程序員可以使用的工具是索引過的三角形列表,可以用來描述巨量的三角形,m個(gè)三角形,使用m/2個(gè)頂點(diǎn),大約是使用三角帶和扇形壓縮量的兩倍。這個(gè)代表性的方法是大多數(shù)硬件架構(gòu)的首選方法。

    曲面簡介

    與其使用大量三角形來表現(xiàn)一個(gè)曲面,3D藝術(shù)家和程序員還可以使用另一個(gè)工具:高次曲面。這些曲面圖元有著更為復(fù)雜的數(shù)學(xué)描述,但在一些情況下,這些額外的復(fù)雜性仍然比用大量三角形來描述物體更加廉價(jià)。這些圖元有一些相當(dāng)古怪的名字:參數(shù)多項(xiàng)式(稱為樣條),非均勻有理B樣條(NURBs),貝塞爾曲線(Bezier),參數(shù)雙三次曲面和N-Patches。因?yàn)?D硬件對(duì)三角形理解得最好,這些在應(yīng)用層定義的曲面會(huì)被柵格化,或者被轉(zhuǎn)換為三角形,轉(zhuǎn)換由API運(yùn)行時(shí),顯卡驅(qū)動(dòng)或者硬件執(zhí)行,以通過3D管線做進(jìn)一步處理。如果曲面從CPU送入3D圖形卡做變換和光照處理時(shí)由硬件執(zhí)行柵格化,性能還有可能進(jìn)一步提升,但這會(huì)給AGP接口帶來少量負(fù)載,是一個(gè)潛在的瓶頸。 

    2. 幾何處理

    繼續(xù)前進(jìn):四種主要變換

    物體在幀與幀之間變化位置來產(chǎn)生運(yùn)動(dòng)的假象,在3D世界中,物體通過四種操作被移動(dòng)和操作,統(tǒng)稱為變換。變換實(shí)際上是把不同類型的“變換矩陣”以矩陣數(shù)學(xué)作用在物體頂點(diǎn)上。這些變換操作都屬于仿射幾何(Affine),意味著它們發(fā)生在仿射空間中——一個(gè)包含點(diǎn)和向量的數(shù)學(xué)空間。仿射變換保留了線的平行關(guān)系,但點(diǎn)與點(diǎn)之間的距離可以變化。(看下面的例子,顯示了一個(gè)正方體變成了一個(gè)長方體,邊與邊的平行關(guān)系被保留下來,但物體內(nèi)的角度發(fā)生了變化?)。當(dāng)物體在一個(gè)特定的坐標(biāo)系或空間中移動(dòng),或者從一個(gè)空間轉(zhuǎn)到另一個(gè)空間時(shí)使用這些變換操作。

    平移:物體沿著三個(gè)坐標(biāo)軸的任意一個(gè)到另一個(gè)位置的移動(dòng)。數(shù)學(xué)操作:通常是加法或減法(加一個(gè)負(fù)數(shù)),不過為了提高效率做了一些轉(zhuǎn)換,所以這項(xiàng)操作通過矩陣乘法來完成,跟旋轉(zhuǎn)和縮放操作一樣。

    旋轉(zhuǎn):就像名字暗示的那樣,一個(gè)物體可以沿任意的軸旋轉(zhuǎn)。數(shù)學(xué)操作:最簡單的旋轉(zhuǎn)例子就是物體在坐標(biāo)系的原點(diǎn),頂點(diǎn)的每個(gè)坐標(biāo)值乘上θ角(物體旋轉(zhuǎn)的角度)的sin或cos值就得到了旋轉(zhuǎn)后的坐標(biāo)。如果一個(gè)物體要同時(shí)繞幾個(gè)坐標(biāo)軸旋轉(zhuǎn),旋轉(zhuǎn)的計(jì)算順序就非常重要,不同的順序會(huì)得到不同的結(jié)果。繞任意軸旋轉(zhuǎn)需要一些額外的工作。可能首先需要進(jìn)行一個(gè)變換移動(dòng)到原點(diǎn),接著做一些旋轉(zhuǎn)操作使旋轉(zhuǎn)軸對(duì)齊坐標(biāo)系的z軸。然后做想要的旋轉(zhuǎn),然后對(duì)齊z軸的操作要被撤銷,然后把物體移回原位。

    縮放:模型的大小變化,在透視投影(我們很快會(huì)詳細(xì)討論的一種變換)中用來產(chǎn)生場景深度效果。數(shù)學(xué)操作:乘一個(gè)縮放因子,如每個(gè)坐標(biāo)乘2,物體會(huì)大一倍。縮放可以被歸一化,這樣三個(gè)軸向的縮放比例相同,或者每個(gè)頂點(diǎn)做不同程度的縮放。負(fù)的縮放因子會(huì)產(chǎn)生物體的鏡像。

    斜切:(又稱錯(cuò)位變換)沿著一個(gè)或多個(gè)軸向操作使模型的形狀產(chǎn)生變化。例如一盒方形果凍盛在一個(gè)盤子里放在桌上,把盤子的一邊提起成45度,果凍因?yàn)橹亓?huì)變成偏菱形。果凍模型的頂部會(huì)向著3D世界的地面歪斜。數(shù)學(xué)操作:把一個(gè)坐標(biāo)值的函數(shù)加在另一個(gè)上,比如把x的值加在y上而x不變。

    請(qǐng)看下圖:

    就像前面所講,3D變換計(jì)算大量使用矩陣數(shù)學(xué)來描述。矩陣為變換條件提供了簡便的表示,3D矩陣數(shù)學(xué)通常是些簡單的乘法和加法。

    變換處理的效率來自于以下事實(shí):多次矩陣操作可以連接組成一個(gè)單獨(dú)的矩陣,把這個(gè)矩陣應(yīng)用在頂點(diǎn)上作為一次單獨(dú)的矩陣操作。這就把矩陣操作的設(shè)置消耗分散到了整個(gè)場景中。有人可能會(huì)認(rèn)為要給出使用笛卡爾坐標(biāo)系的各種空間的三個(gè)坐標(biāo)值,應(yīng)該是個(gè)3x3的矩陣。然而這里用的是“齊次坐標(biāo)”,是個(gè)4x4矩陣。使用齊次坐標(biāo)可以把需要加法的變換用乘法來處理,比如平移。多個(gè)不同變換也可以通過齊次坐標(biāo)連接為乘法運(yùn)算。第四項(xiàng)實(shí)際上就是縮放因子“w”。最初設(shè)置為1,用來在裁剪空間中做投影變換時(shí)計(jì)算深度值,并且在光柵化階段作為像素值的透視修正插值。

    從空間到空間

    繼續(xù)進(jìn)入到幾何圖元部分,我們很可能把物體從模型空間變換到世界空間,然后從世界空間到視圖空間,或者有些時(shí)候直接變換到視圖空間,我們前面提到過。從一個(gè)坐標(biāo)空間轉(zhuǎn)換到另一個(gè)時(shí),要用到許多基本的變換。有些可能像一個(gè)翻轉(zhuǎn)變換一樣簡單,也有復(fù)雜得多的,比如包括兩個(gè)平移和一個(gè)旋轉(zhuǎn)的組合。舉個(gè)例子,世界空間變換到視圖空間通常包括一個(gè)平移和一個(gè)旋轉(zhuǎn)。轉(zhuǎn)換到視圖空間之后,許多有趣的事情就開始發(fā)生了。

    第一部分就講到這里。在下一部分我們將概括幾何圖元部分,并且涉及光照,裁剪,三角形設(shè)置以及渲染相關(guān)的許多方面。

    posted on 2008-12-05 18:07 seal 閱讀(758) 評(píng)論(0)  編輯  收藏 所屬分類: Flex+ActionScript
    主站蜘蛛池模板: 亚洲综合一区二区国产精品| 国产亚洲一区二区三区在线不卡| 成人免费无码大片a毛片| 成人特黄a级毛片免费视频| 日本成人在线免费观看| 伊在人亚洲香蕉精品区麻豆| 亚洲人午夜射精精品日韩| 亚洲AV无码国产精品麻豆天美| 1区1区3区4区产品亚洲 | 亚洲AV伊人久久青青草原| 中文字幕不卡亚洲| 2022年亚洲午夜一区二区福利| 亚洲综合在线一区二区三区| 四虎成人精品国产永久免费无码| a级片免费在线观看| 桃子视频在线观看高清免费完整| 国产亚洲精品免费| 亚洲精品无码mv在线观看网站| 亚洲激情视频网站| 香蕉97碰碰视频免费| 嫩草在线视频www免费观看| 欧美最猛性xxxxx免费| 亚洲日韩国产一区二区三区| 久久久久亚洲AV成人片| 亚洲av成人中文无码专区| 97人妻精品全国免费视频| 在人线av无码免费高潮喷水| 亚洲真人日本在线| 亚洲小说区图片区| xxxx日本在线播放免费不卡| 国产在线观看麻豆91精品免费 | 亚洲欧美日韩国产成人| 久久久久免费视频| 成人免费无码视频在线网站| 亚洲午夜国产精品无码| 亚洲真人无码永久在线观看| 免费无码作爱视频| 成在线人永久免费视频播放| 亚洲成人在线网站| 一级毛片正片免费视频手机看| 噼里啪啦免费观看高清动漫4|