青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

【ZT】Direct3D幾何流水線

大家都知道,一個(gè)3D 場(chǎng)景中,我們見(jiàn)到的任何光輝燦爛的物體,


都是由一個(gè)一個(gè)面片組成的。而裝載面片位置信息的就是其各個(gè)定點(diǎn)的三維坐標(biāo)。這是用來(lái)在模型中存儲(chǔ)的,而要把物體顯示在屏幕上,還需要將它們轉(zhuǎn)換成顯示器上的二維坐標(biāo)。這就需要對(duì)每個(gè)點(diǎn)實(shí)施一套 3 to 2 的轉(zhuǎn)換公式,在Direct3D中叫做“幾何流水線”(Geometry Pipeline)。

每渲染一楨,我們都要用到這條流水線把所有定點(diǎn)的坐標(biāo)轉(zhuǎn)化成當(dāng)前要顯示的位置。不過(guò)放心,D3D不會(huì)改變你原有的頂點(diǎn)坐標(biāo),變換出的頂點(diǎn)數(shù)據(jù)會(huì)存放在新的地方用來(lái)渲染。想一想物體,也就是面片,也就是頂點(diǎn)要顯示在屏幕上,其位置取決于什么呢?首先它一定取決于該點(diǎn)在場(chǎng)景中的位置,然后還在于你從什么角度看,更詳細(xì)一點(diǎn)就是我的眼睛在哪兒,我注視著哪兒,以及我的視野寬窄等等。

對(duì)于每個(gè)獨(dú)立被引入程序的mesh物體,它們的坐標(biāo)系、坐標(biāo)原點(diǎn)理論上都應(yīng)該是不同的,其頂點(diǎn)也都是用局部坐標(biāo)表示的。那么要做統(tǒng)一的變換,首先應(yīng)將它們引入到同一個(gè)坐標(biāo)系下,也就是我們稱之為“世界坐標(biāo)系”的坐標(biāo)。這個(gè)變換也因此得名世界變換(World Transform)。對(duì)物體所需要做的移動(dòng)、旋轉(zhuǎn)等工作也是要在此時(shí)完成的(這些本質(zhì)上不就是坐標(biāo)的更改么)。


經(jīng)過(guò)了以上一些操作后,每個(gè)頂點(diǎn)(也就是每個(gè)物體)在整個(gè)場(chǎng)景中的位置就如你所愿確定下來(lái)了。要把它們映射到屏幕上,還要確定觀察者(你可以叫他玩 家、攝影機(jī)都無(wú)所謂)的位置和視角。我們是要把所有的點(diǎn)變換到新建立的以觀察者為基準(zhǔn)的坐標(biāo)系下。這個(gè)步驟就是“視圖變換”(View Transform)。實(shí)際上和后面要說(shuō)的射影變換相比,這兩種變換并沒(méi)有什么本質(zhì)區(qū)別。有時(shí)候?yàn)榱诵?,可以把世界變換與視圖變換合并為一個(gè)世界——視 圖變換。這不就是說(shuō)你一開(kāi)始就選擇觀察者的位置為世界坐標(biāo)系的原點(diǎn),并按照視角來(lái)確定坐標(biāo)軸么?

后面一步是“射影變換”(Projection Transform),有必要重點(diǎn)說(shuō)一下。很多教材(包括MSDN)上都是假裝讀者已經(jīng)知道為什么要有射影變換而給讀者講它的。實(shí)際上,我們要做的所有坐標(biāo)轉(zhuǎn)換歸根結(jié)蒂是要把三維的點(diǎn)投影到二維的屏幕上,如圖所示


經(jīng)過(guò)上述兩次坐標(biāo)轉(zhuǎn)換后,我們已經(jīng)讓屏幕平行于坐標(biāo)軸平面了,也就是說(shuō),經(jīng)過(guò)一些比例范圍的調(diào)整,理論上我們能從點(diǎn)的三維坐標(biāo)中的某兩個(gè)直接得到期 待已久的屏幕坐標(biāo)。但是別急,此時(shí)得到的坐標(biāo)繪出的圖就像我們小時(shí)候畫(huà)的那些畫(huà)一樣——沒(méi)有立體感。比如上圖那個(gè)矩形,因?yàn)榻筮h(yuǎn)小,在我們的視野中應(yīng)該 看起來(lái)像個(gè)梯形。但是如果我們不做任何處理就直接把它的頂點(diǎn)(已經(jīng)過(guò)前兩重變換)投影到顯示器上(假設(shè)平行于圖中的XY平面)這樣還是一個(gè)方方正正的矩 形。

想象一下,投影實(shí)際上就是把空間中的所有點(diǎn)都?jí)罕猓獾侥骋粋€(gè)平面上。這樣出來(lái)的圖形自然不會(huì)有透視效果。(之所以有近大遠(yuǎn)小是因?yàn)槿搜鄣耐雇哥R成 像,其像高是物距的減函數(shù)。這里不多說(shuō)了)你可能想到讓每個(gè)點(diǎn)像這樣斜著投影,但是仔細(xì)想想,如何斜著投影呢?等你想明白了再回答這樣做真的方便么?于是 另一種辦法就是把整個(gè)空間范圍變成一個(gè)棱臺(tái)(里面的點(diǎn)隨之進(jìn)行放縮)。


相對(duì)來(lái)說(shuō)把較遠(yuǎn)端縮小會(huì)造成數(shù)據(jù)的不準(zhǔn)確,因此采用放大較近端。對(duì)每個(gè)點(diǎn),我們進(jìn)行最后一步變換就是根據(jù)其遠(yuǎn)近程度進(jìn)行一下放縮。

D3D把剪切也納入此流水線中,盡管它沒(méi)對(duì)頂點(diǎn)作任何變換,只是剔出那些不用的點(diǎn)。

以上就是D3D中的幾何流水線。幸運(yùn)的是,我們并不需要自己去寫(xiě)代碼來(lái)完成這些轉(zhuǎn)換。實(shí)際上我們只需要設(shè)計(jì)好參數(shù),調(diào)用相應(yīng)的D3D函數(shù)設(shè)置上面提 到的各種決定因素,它會(huì)在渲染畫(huà)面的時(shí)候把每個(gè)頂點(diǎn)自動(dòng)轉(zhuǎn)化成所需的屏幕坐標(biāo)的。正因?yàn)檫@一套流水線操作的通用性和規(guī)范性,各種3D渲染引擎都將它封裝 了,而當(dāng)代很多先進(jìn)的顯卡都將其固化到硬件線路上,這樣大大提高了渲染速度。

下面我們來(lái)看看一些具體的實(shí)施。在計(jì)算機(jī)圖形學(xué)中,坐標(biāo)的變換通常是通過(guò)與一個(gè)矩陣(Matrix)相乘來(lái)實(shí)現(xiàn)的?;咀儞Q包括平移、縮放、旋轉(zhuǎn)都 用此方法完成,其他任何的變換,包括不同坐標(biāo)系之間的互化,也都是通過(guò)這三種基本轉(zhuǎn)換完成的。因此說(shuō),Matrix無(wú)處不在 , 在我們的周圍,就在這間屋子里。你能在窗戶往外看到它,在電視里看到它。當(dāng)你上班,去教堂或者繳稅你可以感覺(jué)到它。你眼前的世界讓你看不到真實(shí)……(和我 們說(shuō)的Matrix不大一樣,不過(guò)多少有點(diǎn)這個(gè)意思吧)。具體到三維坐標(biāo)系中,定義某點(diǎn)的坐標(biāo)為(X,Y,Z)則用(X,Y,Z,W)乘以一個(gè)相應(yīng)的 4X4矩陣就可以得到新的坐標(biāo)(X',Y',Z',W'),這里的W自有用處,一般是1。還有一點(diǎn)很重要,一個(gè)矩陣就代表著一重變換,而幾個(gè)矩陣的乘積就代表著多重變換的合變換。這點(diǎn)用處很大,讀者會(huì)慢慢體會(huì)到。

那么在這條流水線中,按規(guī)范我們至少需要三個(gè)矩陣來(lái)實(shí)現(xiàn)以上三步變換,也就是世界矩陣(World Matrix)、視矩陣(View Matrix)以及射影矩陣(Projection Matirx)。

世界矩陣有時(shí)候需要我們自己填寫(xiě),根據(jù)我們的各種變換需要來(lái)填寫(xiě)一個(gè)D3DXMATRIX結(jié)構(gòu)體(其成員就是各行各列的數(shù)值),具體方法MSDN上有詳細(xì)講解,這里不多做贅述了。之后通過(guò)調(diào)用IDirect3DDevice9::SetTransform( D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX *pMatrix )設(shè)置世界矩陣為你填好的那個(gè)。參數(shù)意義如下:

D3DTRANSFORMSTATETYPE State 代表你要設(shè)置的變換類型。D3DTS_WORLD,D3DTS_VIEW,D3DTS_PROJECTION分別表示世界、視圖、射影三種變換
CONST D3DMATRIX *pMatrix 指向一個(gè)矩陣結(jié)構(gòu)的指針,就是你所要用到的矩陣。

后面的兩個(gè)矩陣也要通過(guò)此函數(shù)設(shè)置。D3D中,三個(gè)變換矩陣是要存放在固定位置的,每次執(zhí)行流水線,D3D就依次從這三個(gè)位置讀取矩陣信息,并乘以 所有的點(diǎn),得到新的點(diǎn)的坐標(biāo),這個(gè)過(guò)程是不用我們操心的。我們調(diào)用SetTransform()就是要把填充好的矩陣放進(jìn)這三個(gè)位置中的某一個(gè),第一個(gè)參 數(shù)表示了哪一個(gè)。

在設(shè)置視矩陣時(shí),我們先要很清楚地(在腦子里或紙上)建立好“視坐標(biāo)系”。這個(gè)坐標(biāo)系以觀察著為原點(diǎn),沿著視線方向(觀察著——注視點(diǎn)方向)為縱深 方向(也就是Z軸方向)。僅有兩個(gè)點(diǎn)還不足以確定一個(gè)三維坐標(biāo)系,我們還需要一個(gè)參考點(diǎn),能與另兩個(gè)點(diǎn)構(gòu)成某一個(gè)坐標(biāo)平面。這樣的坐標(biāo)系構(gòu)件起來(lái)后,就可 以根據(jù)兩個(gè)坐標(biāo)系的變換填充視矩陣了。D3D提供了函數(shù)

D3DXMATRIX *D3DXMatrixLookAtLH(
D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pEye,
CONST D3DXVECTOR3 *pAt,
CONST D3DXVECTOR3 *pUp
);

或 D3DXMATRIX *D3DXMatrixLookAtLH( 參數(shù)同 ),區(qū)別僅在于前者用于左手系而后者用于右手系。該函數(shù)自動(dòng)填充一個(gè)矩陣,參數(shù)依次是將要填充的矩陣以及上面說(shuō)到的三個(gè)點(diǎn),這里三個(gè)點(diǎn)構(gòu)成視坐標(biāo)系的 YoZ平面。別忘了調(diào)用SetTransform()把這個(gè)矩陣交給D3D。經(jīng)過(guò)上一步被統(tǒng)一了坐標(biāo)的各個(gè)頂點(diǎn)將被這個(gè)矩陣轉(zhuǎn)到視坐標(biāo)中。

第三步要將點(diǎn)乘上一個(gè)射影矩陣,這個(gè)矩陣將越近的點(diǎn)放得越大。填充這個(gè)矩陣我們用函數(shù)

D3DXMATRIX *D3DXMatrixPerspectiveFovLH(
D3DXMATRIX *pOut,
FLOAT fovY,
FLOAT Aspect,
FLOAT zn,
FLOAT zf
);

或 D3DXMATRIX *D3DXMatrixPerspectiveFovLH( 參數(shù)同 ),區(qū)別同上面一樣。第一個(gè)參數(shù)仍然是輸出矩陣。第二個(gè)描述了在Y軸上的視角,弧度制表示,可以想象,視角越大,近端被抻拉的比例就越大。下一個(gè)參數(shù)是視 圖區(qū)的長(zhǎng)寬比。后面兩個(gè)參數(shù)就是最近視平面和最遠(yuǎn)視平面的位置,用它們的Z坐標(biāo)(Z坐標(biāo)的值在射影變換前后是不變的)表示。這兩個(gè)平面的意義將在下一步說(shuō) 到。

最后說(shuō)一下這條流水線的倒數(shù)第一步——剪切。剪切就是把理論上根本不該看到的點(diǎn)從渲染元中剔除掉(這里不包括因遮擋關(guān)系產(chǎn)生的圖形的剪切以及隱面消 除),用過(guò)DirectDraw的朋友很容易想到屏幕范圍以外的就是這樣的點(diǎn)。在3D世界里,還存在一個(gè)最近視平面和一個(gè)最遠(yuǎn)視平面,它們共同組成了一個(gè) 視圖截錐(Viewing Frustum)。對(duì)于這個(gè)東西,微軟有個(gè)很好的說(shuō)法:就好像你在一間黑屋子里向外看,窗戶的四個(gè)邊圈定了視圖范圍,并且窗戶所在平面之前的物體是看不見(jiàn) 的(黑屋子里的東西是看不見(jiàn)的),窗戶所在的平面就是最近視平面;而且我們并不能看到無(wú)限遠(yuǎn),總要有個(gè)最遠(yuǎn)視平面。這六個(gè)平面視可以根據(jù)需要設(shè)定的,它們 組成了視截錐——下圖中的藍(lán)色范圍。


可以想象,剛才進(jìn)行的射影變換也可以說(shuō)是把視圖截錐這個(gè)棱臺(tái)擠壓成長(zhǎng)方體的過(guò)程。讀者還能發(fā)現(xiàn),上述D3DXMatrixPerspectiveFovLH( )的參數(shù)實(shí)際上是描述視截錐的。你會(huì)覺(jué)得這個(gè)藍(lán)色的東西很有用,它與射影變換以及剪切都有著異常緊密的聯(lián)系。


以上,如圖所示,就是一個(gè)頂點(diǎn)要被真正用于渲染所經(jīng)歷的四重門(mén)。

posted on 2007-05-03 23:20 lovedday 閱讀(1208) 評(píng)論(1)  編輯 收藏 引用 所屬分類: ■ DirectX 9 Program

評(píng)論

# re: 【ZT】Direct3D幾何流水線[未登錄](méi) 2009-04-17 13:46 cloud

真是通俗易懂啊。。。。。  回復(fù)  更多評(píng)論   

公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线视频欧美精品| 欧美成人自拍视频| 欧美精品日韩综合在线| 在线免费观看日本欧美| 久久色中文字幕| 欧美一区二区在线| 国产一区三区三区| 久久青青草综合| 国产精品美女999| 久久经典综合| 久久久夜精品| 亚洲激情偷拍| 99国产精品久久久久久久成人热| 免费亚洲网站| 国产精品99久久久久久宅男 | 一本综合久久| 亚洲天堂av在线免费观看| 国产精品日韩久久久| 久久久久久精| 免费影视亚洲| 欧美激情一区二区三区在线| 欧美高清在线视频| 午夜亚洲一区| 久久久综合香蕉尹人综合网| 久久九九有精品国产23| 国产日韩欧美在线看| 女同一区二区| 国产精品mm| 久久久久看片| 精品999网站| 亚洲乱码国产乱码精品精天堂 | 欧美三区在线| 久久久国产精品一区二区中文| 国产精品嫩草99a| 亚洲欧美日韩人成在线播放| 亚洲第一福利社区| 欧美成人国产va精品日本一级| 欧美电影在线| 国产私拍一区| 久久久蜜桃精品| 亚洲高清不卡一区| 亚洲午夜精品久久| 欧美一区免费视频| 欧美日韩你懂的| 蜜臀va亚洲va欧美va天堂 | 久久久久久亚洲综合影院红桃| 麻豆精品在线视频| 国产精品无码专区在线观看| 亚洲主播在线观看| 99视频有精品| 国产精品视频免费在线观看| 欧美伊人久久久久久午夜久久久久| 一本在线高清不卡dvd| 欧美特黄一区| 久久精品99久久香蕉国产色戒| 亚洲男同1069视频| 欧美激情bt| 亚洲一区在线观看视频 | 亚洲欧美综合v| 欧美另类一区| 亚洲二区视频| 亚洲欧美一区在线| 亚洲大胆美女视频| 国产精品入口福利| 另类专区欧美制服同性| 一区二区日韩欧美| 国产一区二区精品久久91| 亚洲婷婷国产精品电影人久久| 久久九九久精品国产免费直播| 91久久在线视频| 久久婷婷久久| 欧美国产精品劲爆| 香蕉亚洲视频| 日韩视频免费在线| 欧美人交a欧美精品| 久久精品国产精品 | 亚洲电影第1页| 久久www免费人成看片高清| 国产精品私房写真福利视频| 蜜臀99久久精品久久久久久软件| 亚洲欧美日韩国产中文| 亚洲日韩中文字幕在线播放| 日韩一级裸体免费视频| 欧美日韩网址| 久久一区二区三区四区五区| 亚洲欧美日韩一区| 日韩视频中午一区| 欧美在线3区| 亚洲午夜一区| 国产亚洲人成网站在线观看| 欧美视频你懂的| 欧美国产日韩视频| 免费成人性网站| 久久综合九色欧美综合狠狠| 欧美在线亚洲综合一区| 亚洲一级黄色片| 一区二区日韩欧美| 久久久久久久欧美精品| 午夜日韩av| 亚洲免费在线视频一区 二区| 艳妇臀荡乳欲伦亚洲一区| 91久久精品www人人做人人爽 | 一区二区三区亚洲| 国产视频精品va久久久久久| 国产精品入口福利| 国产精品入口尤物| 国产精品一二三四区| 久久尤物视频| 久久色在线播放| 美女999久久久精品视频| 久久久久在线观看| 蜜桃av一区二区| 欧美凹凸一区二区三区视频| 欧美黄色精品| 欧美日韩一卡二卡| 国产精品久久久久久久久果冻传媒 | 久久精品国产91精品亚洲| 久久av一区二区三区漫画| 久久成人一区| 免费不卡亚洲欧美| 亚洲电影免费在线| 亚洲激情在线视频| 久久久久久噜噜噜久久久精品 | 先锋亚洲精品| 久久久久久国产精品mv| 美女国产精品| 亚洲欧洲日产国产网站| 99精品国产99久久久久久福利| 亚洲线精品一区二区三区八戒| 亚洲欧美怡红院| 久久综合999| 欧美精品国产精品| 国产精品久久久久久久浪潮网站 | 亚洲欧美视频在线观看| 久久国产精品免费一区| 美女主播精品视频一二三四| 亚洲国产欧美在线人成| 老司机免费视频久久| 亚洲国产精品va在线观看黑人 | 一区二区三区视频在线观看| 亚洲欧美日韩国产另类专区| 久久视频国产精品免费视频在线| 欧美国产91| 国产精品一区2区| 亚洲黄色成人久久久| 亚洲专区一区| 在线视频欧美一区| 久久久精品日韩欧美| 亚洲欧洲另类国产综合| 性色av一区二区三区在线观看| 亚洲精品乱码视频| 校园春色国产精品| 欧美精品九九99久久| 国产日韩欧美成人| 一本一本久久a久久精品牛牛影视| 午夜影视日本亚洲欧洲精品| 亚洲福利视频在线| 午夜在线播放视频欧美| 欧美日韩高清区| 欧美日韩免费高清| 一区免费视频| 欧美在现视频| 一本色道久久精品| 免费久久99精品国产自在现线| 国产精品一区久久| 在线亚洲激情| 亚洲国产精品一区二区www在线| 亚洲欧美精品中文字幕在线| 欧美精品一区二区三区在线看午夜| 国产日韩视频| 亚洲欧美日本国产专区一区| 亚洲国产成人91精品| 久久久99久久精品女同性| 久久亚洲视频| 国产日韩在线亚洲字幕中文| 亚洲视频在线观看| 亚洲欧洲一区二区三区| 久久影视三级福利片| 国产一区二区三区在线观看网站| 亚洲一区二区av电影| 亚洲人www| 欧美福利视频在线观看| 尤妮丝一区二区裸体视频| 亚洲欧洲日产国码二区| 免费成人高清视频| 久久成人羞羞网站| 含羞草久久爱69一区| 亚洲美女精品久久| 亚洲电影在线免费观看| 久久久一本精品99久久精品66| 国产一区激情| 久久久青草婷婷精品综合日韩| 亚洲欧美日韩在线综合| 国产欧美日韩亚洲精品| 亚洲三级视频在线观看| 午夜老司机精品| 亚洲综合日韩在线| 国产情侣久久| 久久一区二区三区超碰国产精品| 亚洲乱码国产乱码精品精|