1. 程式人生 > >繪製流水線——模型表示:頂點格式、三角單元、索引

繪製流水線——模型表示:頂點格式、三角單元、索引

場景是物體揮著模型的集合,任何的物體我們都可以使用三角網格來逼近的表示,三角網格是構成物體的模型的基本單元。我們通常使用下面的術語來描述網格中的三角形:多邊形、圖元、網格幾何元。

一個多邊形中相鄰兩邊的交匯點稱之為頂點,描述三角形單元的時候,我們需要指定三角單元的頂點,描述物體的時候,我們應該指定三角單元的列表。

頂點格式

剛才對於頂點的描述是幾何學的,但是在Direct3D中,剛才的描述可能不是很完整,因為在Direct3D中,頂點出了位置資訊之外可能還包括顏色屬性,法線屬性等,Direct3D中允許我們自定義各頂點的分量。

struct ColorVertex{
    float  _x,_y,_z;    //位置
    DWORD _clolor;      //顏色
}

struct NormalTexVertex{
    float _x,_y,_z;    //座標
    float _nx,_ny,_nz;    //法線
    float _u,_v;        //紋理
}

頂點的結構體定義好之後,我們使用“靈活頂點格式”標記的組合來描述頂點的組織結構,以前面兩種定義的頂點格式為例:

//該巨集定義的含義就是對應該頂點格式頂點結構,包含了位置屬性和顏色屬性
#define FVF_COLOR (D3DFVF_XYZ | D3DFVF_DIFFUSE)

//該巨集定義的含義就是其對應的頂點格式的結構,包含了:位置,法線,紋理屬性等資訊
#define FVF_NORMAL_TEX (D3DFVF_XTZ | D3DFVF_NORMAL | D3DFVF_TEX1)

三角單元

三角單元是3D圖形的基本組成部分,為了構建一個物體,需要建立一個描述物體的形狀和輪廓的三角形單元列表,三角形丹玉列表包含了我們所希望繪製的所有的三角單元的資訊。

例如:構建一個矩形,我們將其分為兩個三角單元,並制定了兩個三角單元的頂點

那麼此時,我們制定這個矩形的三角單元列表就是 :
 

Vertex rect[6]{
    v0,v1,v3,    //第一個三角單元
    v0,v2,v3    //第二個三角單元
};

索引

通常構成一個3D物體的眾多頂點之間有很多的共享頂點,上面這個矩形的繪製只有兩個頂點重合,但是尤其是當模型的細節以及複雜度的增加,重合的頂點數會急劇的增加。下面這個圖就是:

上面這個圖有8個獨立的頂點,但是如果要建立該立方體的三角單元列表,許多的頂點就會重合。為了解決這種問題,我們引入了索引的概念。

索引的原理如下:我們建立一個頂點列表,裡面存放了目前為止所有的頂點,然後我們再建立一個索引列表,索引列表裡面的存放的就是指向頂點列表的索引,這些索引規定了構建三角形的規則,以及如何將這些三角形組織起來。

那麼對於剛才矩形的例子,我們就可以建立一個頂點列表以及索引列表:

頂點列表:

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

索引列表:

WORD indexList[6] = {

    0,1,2,    //第一個三角形

    0,2,3    //第二個三角形

}