DirectX Triangle Strips


今天北京下了一天的雨,而且是暴雨,不知道又有多少地方可以划船了,這么大的雨也打亂了我的搬家計划,不能搬家,那就寫一篇小文吧,也是剛才沒事瀏覽DX SDK文檔時偶有所悟,非常簡單,博大家一笑而。

Triangle Strips是D3D用來繪制三角形的一種方式,這種方式比Triangle list更加高效,因為不用重復存儲三角形頂點。下面看一個例子,分析一下這兩種方式的不同。

現在我們要繪制一個矩形,在D3D中,最基本的幾何圖元是三角形,所以可用兩個三角形拼接成一個矩形,如下圖。

rectangle

使用Triangle list繪制

triangle list的工作方式是每次取三個頂點作為一組,繪制一個三角形。如果有n個三角形,那么依次取1,2,3為一組,4,5,6為一組, i, i + 1, i + 2為一組,如下圖,如果一共有n個頂點,那么可以繪制n / 3個三角形。

tiangle_list

所以為了繪制上面的矩形,我們一共需要六個頂點,見下圖。V1,V2,V3繪制左上角的三角形,V2,V4,V3繪制右下角的三角形。這里,V2和V3被重復定義了(或者說重復存儲了)。

 

vertexorder

定義頂點及繪制的核心代碼如下

// 定義頂點
D3DXVECTOR3 vertex[] =
{
    D3DXVECTOR3(-1.0f,  1.0f, 0),    // 1
    D3DXVECTOR3( 1.0f,  1.0f, 0),    // 2
    D3DXVECTOR3(-1.0f, -1.0f, 0),    // 3
    D3DXVECTOR3( 1.0f,  1.0f, 0),    // 2
    D3DXVECTOR3( 1.0f, -1.0f, 0),    // 4
    D3DXVECTOR3(-1.0f, -1.0f, 0),    // 3
};

// 繪制矩形
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

使用Triangle strip繪制

使用triangle strip則完全不必重復定義頂點,先來看看什么是triangle strip,圖如下,實際上是一系列連着的三角形,即相鄰的兩個三角形有一條公用邊。這意味着有些頂點時可以重復利用的,我們不必為每個三角形都指定獨立的三個頂點,如下圖,可以用七個頂點表示五個三角形。如果是triangle list方式,表示五個三角形則需要15個頂點。

triangle_strip

triangle strip取三角形的方式略有不同,每次從編號為i的位置開始依次取三個,i=1,2,3,4。。。也就是1,2,3為一組,2,3,4為一組。i, i + 1, i + 2為一組,見下圖。如果有n個頂點,那么可以繪制n - 2個三角形。

trianglestrip

這種方式使得除了第一個和最后一個頂點外,所有的頂點都可以被重復利用,比如頂點V2,它既屬於第一個三角形V1V2V3,又屬於第二個三角形V2V3V4。所以為了繪制上面的矩形,我們只需要四個頂點。V1, V2, V3繪制左上角的三角形,V2, V4, V3繪制右下角的三角形。這里V2和V3是無需重復定義(或重復存儲)的。

定義頂點和繪制的代碼如下。

// 定義頂點
D3DXVECTOR3 vertex[] =
{
    D3DXVECTOR3(-1.0f,  1.0f, 0),    // 1
    D3DXVECTOR3( 1.0f,  1.0f, 0),    // 2
    D3DXVECTOR3(-1.0f, -1.0f, 0),    // 3
    D3DXVECTOR3( 1.0f, -1.0f, 0),    // 4
};

// 使用triangle strip方式繪制矩形
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

除了頂點可以重復利用外,還有一個重要的區別就是繪制時的back face culling選項,如果使用triangle strip繪制,那么這個選項每繪制一個三角形就flip一次,什么意思呢?也就是說如果第一個三角形以CCW方式剔除,那么第二個三角形就以CW方式剔除,第三個三角形又以CCW方式剔除,第四個三角形以CW方式剔除,如此這般。。。這個特征需要我們在定義頂點的時候小心,必須以“鋸齒”方式定義頂點才可以。如下。這樣第一個三角形V1V2V3是順時針方向,可以繪制,第二個三角形V2V3V4是逆時針方向,也可以正確繪制。余下類同。

 

alias_order

Happy Coding!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM