• <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>

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

            繪制流水線(1)

            這次主題是渲染管線。它是用來(lái)創(chuàng)建為3D世界進(jìn)行幾何描述的2D圖形并設(shè)定一個(gè)虛擬照相機(jī)確定這個(gè)世界中哪一部分將被透視投影到屏幕上。

            \

            2.1表現(xiàn)模型

            一個(gè)場(chǎng)景是多個(gè)物體或模型的集合。一個(gè)物體可以用三角形網(wǎng)格(triangle mesh)來(lái)近似表示,如圖2.2所示。由三角形網(wǎng)格建立一個(gè)物體,我們稱之為建模。3D世界中最基本的圖元就是三角形,但是Direct3D也支持點(diǎn)圖元和線圖元但我們都不常用到。

             

             

            一個(gè)多邊形的兩邊相交的點(diǎn)叫做頂點(diǎn)。為了描述一個(gè)三角形,我們通常指定三個(gè)點(diǎn)的位置來(lái)對(duì)應(yīng)三角形的三個(gè)頂點(diǎn)(如圖2.3),這樣我們就能夠很明確的表示出這個(gè)三角形了。

             

            2.1.1 頂點(diǎn)格式

            我們以前定義的點(diǎn)在數(shù)學(xué)上來(lái)說(shuō)是正確的,但是當(dāng)我們?cè)贒irect3D環(huán)境中使用它的時(shí)候就會(huì)覺得很不完善。這是因?yàn)樵贒irect3D中的頂點(diǎn)包含了許多附加的屬性,而不再單純的只有空間位置的信息了。例如:一個(gè)頂點(diǎn)可以有顏色和法線向量屬性。Direct3D讓我們可以靈活的構(gòu)造自己的頂點(diǎn)格式。換句話說(shuō),我們可以自己定義頂點(diǎn)的成員。

            為了創(chuàng)建一個(gè)自定義的頂點(diǎn)結(jié)構(gòu),我們首先要?jiǎng)?chuàng)建一個(gè)包含能存放我們選擇的頂點(diǎn)數(shù)據(jù)的結(jié)構(gòu)。例如,下面我們舉出兩種不同頂點(diǎn)數(shù)據(jù)類型的例子,一種包含了位置和顏色信息,第二種則包含了位置,法線向量,紋理坐標(biāo)信息。

             

            struct ColorVertex

            {

                   float _x, _y, _z; // 位置

                   DWORD _color; // 顏色

            };

             

            struct NormalTexVertex

            {

                   float _x, _y, _z; // 位置

                   float _nx, _ny, _nz; // 法線向量

                   float _u, _v; // 紋理坐標(biāo)

            };

            一旦我們有了完整的頂點(diǎn)格式,我們就要使用靈活頂點(diǎn)格式(FVF)的組合標(biāo)志來(lái)描述它。例如第一個(gè)頂點(diǎn)結(jié)構(gòu),我們要使用如下的頂點(diǎn)格式:

            #define FVF_COLOR (D3DFVF_XYZ | D3DFVF_DIFFUSE)

            上面的頂點(diǎn)結(jié)構(gòu)表明它包含位置和顏色屬性。

             

            而第二種結(jié)構(gòu)則要使用:

            #define FVF_NORMAL_TEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)

            上面的頂點(diǎn)結(jié)構(gòu)表明它包含了位置,法線向量,紋理坐標(biāo)的屬性(這些常量是D3D內(nèi)置的)。

             

            有一點(diǎn)要注意,你的標(biāo)志的順序必須要和你的頂點(diǎn)結(jié)構(gòu)的順序一一對(duì)應(yīng)。如果想知道所有的D3DFVF標(biāo)志,請(qǐng)查閱SDK文檔。

             

            2.1.2 三角形

            三角形是構(gòu)建3D物體的基本圖形。為了構(gòu)造物體,我們創(chuàng)建了三角形列表(triangle list)來(lái)描述物體的形狀和輪廓。三角形列包含了我們將要畫的每一個(gè)三角形的數(shù)據(jù)信息。例如為了構(gòu)造一個(gè)矩形,我們把它分成兩個(gè)三角形,如圖2.4所示,最后指定每個(gè)三角形的頂點(diǎn)。

             

             

            Vertex rect[6] = {v0, v1, v2, // 三角形0

                                        v0, v2, v3}; // 三角形1

            注意:指定三角形頂點(diǎn)的順序是很重要的,將會(huì)按一定順序環(huán)繞排列。

             

            2.1.3 索引

            3D物體中的三角形經(jīng)常會(huì)有許多共用頂點(diǎn)。如圖2.4所表示的矩形。雖然現(xiàn)在僅有兩個(gè)點(diǎn)被重復(fù)使用,但是當(dāng)要表現(xiàn)一個(gè)更精細(xì)更復(fù)雜的模型的時(shí)候,重復(fù)的頂點(diǎn)數(shù)將會(huì)變得很大。例如圖2.5所示的立方體,僅有八個(gè)頂點(diǎn),但是當(dāng)用三角形列表示它的時(shí)候,所有的點(diǎn)都被重復(fù)使用。

             

             

            為了解決這個(gè)問(wèn)題,我們引入索引(indices)這個(gè)概念。它的工作方式是:我們創(chuàng)建一個(gè)頂點(diǎn)列表和一個(gè)索引列表(index list)。頂點(diǎn)列表包含所有不重復(fù)的頂點(diǎn),索引列中則用頂點(diǎn)列中定義的值來(lái)表示每一個(gè)三角形的構(gòu)造方式。回到那個(gè)矩形的示例上來(lái),它的頂點(diǎn)列表的構(gòu)造方式如下:

            Vertex vertexList[4] = {v0, v1, v2, v3};

             

            索引列表則定義頂點(diǎn)列中的頂點(diǎn)是如何構(gòu)造這兩個(gè)三角形的:

            WORD indexList[6] = {0, 1, 2, //三角形0

                                        0, 2, 3}; //三角形1

            也就是說(shuō),用頂點(diǎn)列表中的0(vertexList[0])、1(vertexList[1])和2(vertexList[2])頂點(diǎn)構(gòu)成三角形0;用頂點(diǎn)列表中的0(vertexList[0])、2(vertexList[2])和3(vertexList[3])頂點(diǎn)構(gòu)成三角形1。

             

            2.2虛擬照相機(jī)

            照相機(jī)確定3D世界中的哪部分是可見的,因而需要將哪部分轉(zhuǎn)換為2D圖形。在3D世界中照相機(jī)被放置和定向,并且定義其可視體,圖2.6展示了我們的照相機(jī)模型。

            可視體是由可視角度和前裁剪面(Near Plane)與后裁剪面(Far Plane)定義的一個(gè)平截頭體。之所以要選擇平截頭體構(gòu)造可視體,是因?yàn)槲覀兊娘@示器都是矩形的。在可視體中不能被看見的物體都會(huì)被刪除,刪除這種數(shù)據(jù)的過(guò)程就叫做“裁剪”。

            投影窗口(Projection Window)是可視體內(nèi)的3D幾何圖形投影生成的用來(lái)顯示3D場(chǎng)景的2D圖像的2D區(qū)域。重要的是要知道,我們使用min=(-1,-1)和max=(1,1)來(lái)定義投影窗口的大小。

            為了簡(jiǎn)化繪制,我們使前裁剪面與投影窗口在同一平面上。并且,注意Direct3D中定義的投影平面(即投影窗口所在的平面)是Z = 1的平面。


            posted on 2008-03-13 19:18 lovedday 閱讀(1173) 評(píng)論(1)  編輯 收藏 引用

            評(píng)論

            # re: 繪制流水線(1)[未登錄](méi) 2009-07-21 12:30

            請(qǐng)問(wèn),可視體為什么要有兩個(gè)裁剪面  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            精品国产青草久久久久福利| 丁香色欲久久久久久综合网| 精品久久久久久国产| 99久久精品无码一区二区毛片 | 久久精品国产2020| 精品国产综合区久久久久久| 日韩久久久久中文字幕人妻| 久久久精品免费国产四虎| 中文字幕热久久久久久久| 精品久久久久久国产潘金莲| 亚洲午夜久久久影院伊人| 国产V综合V亚洲欧美久久| 免费精品久久久久久中文字幕| 久久综合九色综合欧美狠狠| 久久996热精品xxxx| 久久亚洲春色中文字幕久久久 | 伊人色综合久久天天人手人婷| 97久久天天综合色天天综合色hd | 一本一本久久A久久综合精品| 99久久综合狠狠综合久久止| 亚洲国产精品综合久久网络 | 色综合久久中文字幕综合网| 欧美精品久久久久久久自慰| 亚洲欧美成人久久综合中文网 | 久久国产热这里只有精品| 91精品国产色综久久 | 久久久久久综合网天天| 久久99精品久久久久久噜噜| 国产成人久久精品一区二区三区 | 国产亚洲精久久久久久无码| 一本久久a久久精品综合香蕉 | 亚洲国产另类久久久精品小说| 久久人做人爽一区二区三区| 久久国产视频网| 久久国产香蕉视频| 久久精品国产色蜜蜜麻豆| 亚洲嫩草影院久久精品| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 国产精品99久久久久久猫咪| 99精品久久久久久久婷婷| 久久综合综合久久狠狠狠97色88|