第九課 VBO索引

2021-07-09 23:27:14 字數 2517 閱讀 2345

到目前為止,我們在建立vbo時總是重複儲存三角形公共邊的頂點。

本課將介紹索引。索引是通過索引緩衝(index buffer)來實現的頂點復用。

索引緩衝儲存的是整數;每個三角形有三個整數索引,分別指向各種屬性緩衝(attribute buffer)頂點位置、顏色、uv座標、其他uv座標、法線緩衝法線等)。這和obj檔案格式有些類似,但乙個最大的區別在於:索引緩衝只有乙個。這也就是說僅當某頂點的所有屬性(譯註:即位置、顏色、uv座標、法線等等)在兩個三角形中都相同時,我們才認為此頂點是兩個三角形的公共頂點。

來看看法線的例子。下圖中,藝術家建立了兩個三角形來表示乙個平滑曲面。因此,我們可以把兩個三角形的法線混合成乙個頂點的法線。為了便於觀察,我畫了一條紅線表示平滑曲面。

然而在第二幅圖中,藝術家想畫的是」縫隙」或者」粗糙的邊緣」。若混合了法線,就意味著色器會像進行平滑插值,形成乙個和上圖一樣的平滑的表面:

因此這種情況下,我們應該為這個頂點設定兩條不同的法線;在opengl中,唯一可行的辦法是把頂點屬性完整複製乙份。

索引的用法很簡單。首先,需要再建立乙個緩衝來儲存索引。**與之前一樣,不過引數由array_buffer變為了element_array_buffer。

1

std::

vector

indices;2

3// fill "indices" as needed45

// generate a buffer for the indices

6gluint

elementbuffer;7

glgenbuffers(1

,&elementbuffer);8

glbindbuffer

(gl_element_array_buffer

,elementbuffer);9

glbufferdata

(gl_element_array_buffer

,indices

.size()*

sizeof

(unsigned

int),

&indices[0

],gl_static_draw

);

只需把gldrawarrays替換為如下語句,即可繪製模型:

1

// index buffer

2glbindbuffer

(gl_element_array_buffer

,elementbuffer);3

4// draw the ********s !

5gldrawelements(6

gl_********s

,// mode

7indices

.size

(),// count

8gl_unsigned_int

,// type9(

void*)

0// element array buffer offset

10);

現在真正的問題來了。如前所述,opengl只能使用乙個索引緩衝,而obj(及一些其他常用的3d格式,如collada)每個屬性都有乙個索引緩衝。這意味著,必須通過某種方式把若干個索引緩衝合併成乙個。

合併演算法如下:

1 for each input vertex

2 try to find a similar ( = same for all attributes ) vertex between all those we already output

3 if found :

4 a similar vertex is already in the vbo, use it instead !

5 if not found :

6 no similar vertex found, add it to the vbo

完整的c++**位於common/vboindexer.cpp,注釋很詳盡。如果理解了以上演算法,讀懂**應該沒問題。

若兩頂點的座標、uv座標和法線都相等,則認為兩頂點是同一頂點。若還有其他屬性,就得視具體情況而定了。

為了簡單,我們採用了效能較差的線性搜尋來尋找相似頂點。實際中用std::map更合適。

雖與索引無直接關係,但現在去看看」「fps計數器是很合適的–這樣我們就能看到索引究竟能提公升多少效能。工具–偵錯程式中還有其他與效能相關的工具。

OpenGL3 0教程 第九課 VBO索引

分類 opengl es opengl3.0教程 目前為止,建立vbo時我們總是重複儲存一些共享的頂點和邊。本課將介紹索引技術。借助索引,我們可以重複使用乙個頂點。這是用索引緩衝區 index buffer 來實現的。索引緩衝區儲存的是整數 每個三角形有三個整數索引,用索引就可以在各種屬性緩衝區 頂...

第九課 變數

任務與 修改 沒有定義變數r,在第四行float r1,r2之後加上r就可以 include include intmain 閱讀程式 閱讀下面的程式,在閱讀過程中,請為每乙個變數畫出乙個方框,代表對應的記憶體空間。隨著閱讀,標明變數的變化過程,達到讀懂程式的目的。include intmain 圖...

C語言第九課

主要內容 高階指標 結構體指標 一 結構體指標 指向結構體變數的指標叫做結構體指標 typedef struct student student student stu student p stu student 結構體型別的指標 型別 p 結構體指標變數 變數名 結構體訪問成員變數 示例 type...