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

天行健 君子當自強而不息

【ZT】Direct3D幾何流水線

大家都知道,一個3D 場景中,我們見到的任何光輝燦爛的物體,


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

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

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


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

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


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

想象一下,投影實際上就是把空間中的所有點都壓扁,扁到某一個平面上。這樣出來的圖形自然不會有透視效果。(之所以有近大遠小是因為人眼的凸透鏡成 像,其像高是物距的減函數(shù)。這里不多說了)你可能想到讓每個點像這樣斜著投影,但是仔細想想,如何斜著投影呢?等你想明白了再回答這樣做真的方便么?于是 另一種辦法就是把整個空間范圍變成一個棱臺(里面的點隨之進行放縮)。


相對來說把較遠端縮小會造成數(shù)據(jù)的不準確,因此采用放大較近端。對每個點,我們進行最后一步變換就是根據(jù)其遠近程度進行一下放縮。

D3D把剪切也納入此流水線中,盡管它沒對頂點作任何變換,只是剔出那些不用的點。

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

評論

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

真是通俗易懂啊。。。。。  回復  更多評論   

公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲手机在线| 欧美大片在线看| 久久久综合香蕉尹人综合网| 国产精品久久国产精品99gif | 一区二区三区四区国产| 国产亚洲毛片| 国内外成人免费视频| 国产精品激情av在线播放| 久久亚洲春色中文字幕| 欧美一区二区三区视频免费| 亚洲视频一二三| 亚洲一区视频在线| 亚洲午夜免费福利视频| 亚洲欧美日韩国产综合在线| 久久国产66| 欧美国产一区视频在线观看| 你懂的成人av| 欧美小视频在线观看| 国产情侣一区| 最新国产精品拍自在线播放| 这里只有精品视频| 性色av一区二区三区红粉影视| 久久精品首页| 国产视频在线观看一区二区三区 | 在线观看亚洲视频啊啊啊啊| 亚洲美女视频网| 久久久精品欧美丰满| 亚洲国产一区二区三区在线播| 美乳少妇欧美精品| 在线亚洲精品| 欧美成人性网| 在线播放精品| 另类激情亚洲| 欧美一区二视频| 国产精品推荐精品| aa日韩免费精品视频一| 欧美成人午夜激情在线| 午夜在线a亚洲v天堂网2018| 欧美sm视频| 亚洲精品一区中文| 亚洲国产天堂网精品网站| 久久久久久久999| 国产精品你懂的在线| 亚洲欧美激情精品一区二区| 亚洲免费av片| 国产精品视频福利| 欧美亚洲三区| 久久精品国产99国产精品澳门 | 香蕉国产精品偷在线观看不卡| 欧美视频日韩视频在线观看| 一区二区三区国产精品| 中国成人在线视频| 国产亚洲观看| 精品成人一区| 亚洲第一黄色| 国产精品亚洲成人| 久久久久久国产精品一区| 久久九九久久九九| av成人激情| 欧美中文字幕久久| 中日韩午夜理伦电影免费| 99热免费精品| 亚洲一级高清| 欧美色精品在线视频| 国产伦精品一区二区三| 久久国产手机看片| 亚洲精品护士| 欧美高清你懂得| 亚洲综合首页| 欧美91精品| 欧美日韩精品久久| 亚洲成人在线视频播放| 一本久久a久久精品亚洲| 久久精品国产亚洲aⅴ| 久久久久9999亚洲精品| 亚洲一区二区在线| 伊人成综合网伊人222| 亚洲天堂免费在线观看视频| 亚洲精品少妇30p| 久久综合久久综合久久综合| 亚洲一区影音先锋| 欧美性久久久| 亚洲欧美国产不卡| 99一区二区| 久久久久久久91| 能在线观看的日韩av| 最新69国产成人精品视频免费| 久久av二区| 欧美激情精品久久久久久久变态 | 亚洲综合欧美日韩| 欧美三级韩国三级日本三斤| 在线视频你懂得一区| 欧美一级二区| 亚洲国产精品久久人人爱蜜臀| 欧美成人精品| 亚洲视频免费在线| 久久手机精品视频| 9久re热视频在线精品| 欧美日韩网址| 久久激情一区| 日韩午夜在线视频| 国产一区二区三区四区老人| 狂野欧美一区| 亚洲私人影院在线观看| 欧美1区免费| 欧美在线观看视频在线| 亚洲免费黄色| 国外成人在线视频网站| 欧美日韩福利在线观看| 欧美在线免费视屏| 亚洲一区二区三区在线视频| 亚洲二区视频| 免费在线国产精品| 久久一区二区三区国产精品 | 老司机67194精品线观看| 亚洲欧美国产精品va在线观看| 日韩视频―中文字幕| 亚洲国产日韩在线一区模特| 久久久综合免费视频| 羞羞色国产精品| 久久精品一区二区三区不卡| 亚洲欧美精品伊人久久| 亚洲一区二区三区精品视频| 久久久另类综合| 欧美在线你懂的| 蜜臀91精品一区二区三区| 久久一区视频| 欧美日韩成人免费| 欧美性猛交视频| 国产精品麻豆va在线播放| 国产一区二区三区黄视频| 国产麻豆精品在线观看| 黄色一区二区在线| 亚洲精品一区二区三区av| 一本一本a久久| 久久成人人人人精品欧| 久久综合久久久久88| 亚洲乱码视频| 久久成人国产精品| 国产精品v片在线观看不卡| 国产欧美一区二区精品婷婷 | 午夜在线一区二区| 麻豆国产va免费精品高清在线| 欧美日韩国产色站一区二区三区| 国产精品日本| 亚洲视频中文字幕| 亚洲大片一区二区三区| 欧美与欧洲交xxxx免费观看 | 久热国产精品| 国产精品自拍网站| 一本色道久久综合狠狠躁的推荐| 久久国产婷婷国产香蕉| 亚洲一级在线观看| 欧美视频在线免费看| 亚洲人成在线影院| 亚洲国产精品成人精品| 久久久久国产精品一区三寸| 国产精品视频999| 欧美亚洲免费在线| 亚洲欧美日本国产有色| 国产精品久久7| 欧美专区亚洲专区| 久久久久免费| 久久久人成影片一区二区三区| 久久午夜影视| 一区二区精品国产| 一本色道久久88综合亚洲精品ⅰ | 亚洲精品久久久久| 国产精品久久久久久影院8一贰佰| 日韩午夜精品视频| 亚洲视频精品在线| 久久aⅴ国产欧美74aaa| 亚洲综合另类| 免费不卡欧美自拍视频| 91久久国产综合久久| 亚洲二区在线视频| 免费观看成人| 欧美一区综合| 欧美成人日本| 亚洲欧美日韩在线观看a三区| aaa亚洲精品一二三区| 亚洲欧美www| 免费成人美女女| 亚洲天天影视| 久久久久久电影| 欧美与黑人午夜性猛交久久久| 亚洲一区精品在线| 国产美女精品视频免费观看| 国产精品一区二区三区观看| 激情视频一区二区| 99精品99久久久久久宅男| 精品电影在线观看| 中国女人久久久| 日韩一区二区久久| 噜噜噜躁狠狠躁狠狠精品视频| 午夜免费日韩视频| 欧美系列亚洲系列| 亚洲视频视频在线| 一区二区日韩伦理片| 亚洲欧洲日夜超级视频|