obj檔案中頂點資料的合併

2021-07-31 04:34:51 字數 1896 閱讀 1984

在opengl中,為了減少頂點資料所占用的記憶體,通常會合併具有相同屬性的頂點,然後使用頂點的索引進行繪製。

舉例來說,對於xz平面上中心在原點的的單位正方形,需要兩個三角形來表示它,於是一共需要六個頂點:

// 第乙個三角形

v1: 位置(-0.5, 0.0, 0.5),紋理座標(0.0, 0.0),法向量(0.0, 1.0, 0.0)

v2: 位置( 0.5, 0.0, 0.5),紋理座標(1.0, 0.0),法向量(0.0, 1.0, 0.0)

v3: 位置( 0.5, 0.0, -0.5),紋理座標(1.0, 1.0),法向量(0.0, 1.0, 0.0)

// 第二個三角形

v4: 位置(-0.5, 0.0, 0.5),紋理座標(0.0, 0.0),法向量(0.0, 1.0, 0.0)

v5: 位置( 0.5, 0.0, -0.5),紋理座標(1.0, 1.0),法向量(0.0, 1.0, 0.0)

v6: 位置(-0.5, 0.0, -0.5),紋理座標(0.0, 1.0),法向量(0.0, 1.0, 0.0)

可以看到,v1v4的屬性是完全一樣的,v3v5的屬性是完全一樣的,於是它們可以進行合併,合併後頂點的個數變為4:

v1: 位置(-0.5,  0.0,  0.5),紋理座標(0.0, 0.0),法向量(0.0, 1.0, 0.0)

v2: 位置( 0.5, 0.0, 0.5),紋理座標(1.0, 0.0),法向量(0.0, 1.0, 0.0)

v3: 位置( 0.5, 0.0, -0.5),紋理座標(1.0, 1.0),法向量(0.0, 1.0, 0.0)

v4: 位置(-0.5, 0.0, -0.5),紋理座標(0.0, 1.0),法向量(0.0, 1.0, 0.0)

此時可以使用索引的形式來表示兩個三角形:

// 第乙個三角形01

2// 第二個三角形02

3

仔細觀察可以發現,這四個頂點的法向量是完全一樣的。那麼,如果我們將頂點的三個屬性(位置、法向量和紋理座標)分開儲存,則四個法向量同樣可以合併成乙個,這樣需要儲存的內容就可以進一步縮減。.obj檔案正是這樣做的。

在.obj檔案中,頂點的三個屬性分開儲存,每種屬性中一致的屬性合併為乙個,然後使用三個對應屬性的索引來表示乙個頂點。

依然拿上面的例子進行舉例。6個頂點的位置屬性可以合併為4個,用v來表示,則有:

v -0.5000

0.0000

0.5000

v 0.5000

0.0000

0.5000

v 0.5000

0.0000 -0.5000

v -0.5000

0.0000 -0.5000

6個頂點的紋理座標可以合併為4個,用vt來表示,則有:

vt 0.0000

0.0000

vt 1.0000

0.0000

vt 1.0000

1.0000

vt 0.0000

1.0000

6個頂點的法向量可以合併為1個,用vn來表示,則有:

vn 0.0000

1.0000

0.0000

然後使用屬性的索引來表示頂點並組成三角形,用f來表示,則有(注意:在.obj中,索引的起始值為1):

f 1/1/1

2/2/1

3/3/1

f 1/1/1

3/3/1

4/4/1

Unity3d 頂點著色器傳入的頂點資料

一 cg頂點程式必須在結構中傳遞頂點資料。幾種常用的頂點結構定義在檔案unitycg.cginc中。在大部分情況下僅僅使用它們就夠了。結構如下 二 如果你想訪問個別的頂點資料,你必須自己宣告頂點結構。結構中的成員必須是屬於以下列表中的 1 float4 vertex position 頂點位置 2 ...

關於3D模型中的obj檔案

obj檔案不需要任何種檔案頭,檔案由一行行文字組成,注釋行以符號 為開頭,空格和空行可以隨意加到檔案中。有字的行都由一兩個標記字母也就是關鍵字 keyword 開頭,關鍵字可以說明這一行是什麼樣的資料。多行可以邏輯地連線在一起表示一行,方法是在每一行最後新增乙個連線符 注意連線符 後面不能出現空格或...

法線對映基本原理和相關的頂點資料壓縮

法線對映我也是剛學會的,呵呵 輸入到固定渲染管線的頂點結構雖然可以定製,但也不是完全自由的,比如頂點位置必須是float3,紋理座標float2,法線float3等等。如果使用可程式設計管線,由於vs的輸入可以自由解析,所以相對來說就增加了很多靈活性。在使用切線空間的法線對映 normalmap 時...