到目前為止,我們在建立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...