在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)
可以看到,v1
和v4
的屬性是完全一樣的,v3
和v5
的屬性是完全一樣的,於是它們可以進行合併,合併後頂點的個數變為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 時...