1. 程式人生 > >OpenGL 入門基礎教程 —— 基本術語篇【3】

OpenGL 入門基礎教程 —— 基本術語篇【3】

1:物體法線向量是一條垂直於某個表面的方向向量,在OpenGL中,可以對每個頂點都設定不同的法線(曲面),物體的法線向量定義了它的表面在空間中的方向,也就是說定義了它相對於光源的方向,在OpenGL中使用法線向量確定該物體的各個頂點所接收的光照,如果需要使用光照,則需要為每個頂點指定一條法線向量。

2:使用glNormal *()函式,將當前的法線向量設定為這個函式的引數所表示的值,之後呼叫glVertex*()時,就會將當前的法線向量分配給它所指定的頂點,由於每個頂點通常會具有不同的法線,所以這兩個函式一般要交替使用
glBegin(GL_PLOYGON);
glNormal3fv(n0); //帶V指的是向量版本,接受一個法線向量,不帶V的版本接受三個指定的引數
glNormal3{bsidf};//這個b,s,i版本會對引數值進行線性縮放在[-1.0,1.0]之間

glVertex3fv(v0);

3:我們約定,法線向量的方向指向的是表面的外側,此時想翻轉表面的外側內側,將法線的正負改變一下即可

4:法線向量只表示方向,在光照計算時,它的長度會轉換為1,若需要對法線向量進行規範化,可以啟用glEnable(GL_NORMALIZE)功能,將其恢復為單位長度

5:OpenGL中的圖元繪製未免過於複雜,每個頂點需要指定,還需要指定法線向量等等資訊,為了解決這樣複雜的程式碼,OpenGL中提供了一些頂點陣列函式,允許只使用少數幾個陣列指定大量與頂點相關的資料,並使用少量的函式呼叫訪問這些函式,這樣只需要兩個陣列就能指定一個多邊形的頂點的位置和法線向量了,這樣還避免了共享頂點的冗雜性

6:使用頂點陣列對圖元進行渲染的步驟:
       1:啟用(最多可達8個)陣列glEnableClientState(),用於儲存不同型別的資料,包括:頂點座標、表面法線、RGBA顏色、輔助顏色、顏色索引、霧座標、紋理座標、多表性的邊界標識
例如:需要光照時,需要啟用法線向量陣列glEnableClientState(GL_NORMAL_ARRAY),關閉光照狀態時,可以禁用此陣列,使用Client是因為這些陣列被儲存在客戶端中
       2:將資料放入陣列中,這些陣列是通過他們的記憶體地址(指標)進行訪問的,一般是glXXXPointer,如glVertexPointer(),每個頂點的間隔是利用一個數組來實現的,glVertexPointer(2,GL_INT,0,Vertices),size:2指的是頂點的座標數量,GL_INT是資料型別,stride:0是連續頂點之間的位元組偏移量,若為0,則頂點為緊密相連,Vertices為陣列指標(陣列名即為陣列的指標)
        3:OpenGL通過這些指標從被啟用的陣列中獲取資料

glArrayElement()通常在glBegin()和glEnd()之間呼叫,否則該函式就會設定所有的啟用的陣列的當前狀態。一般情況下,在這兩個函式之間,使用自啟用的陣列。引數為GL_INT ith,取啟用的頂點陣列的第i個頂點的資料(0開始)進行繪圖

7:重啟圖元函式:glPrimitiveRestartIndex(),當開始操作大量成組的頂點資料時,可能會需要多次的呼叫OpenGL的繪圖函式,通常可能是在渲染之前的繪圖呼叫中所用過的相同型別的圖元:比如三角形(GL_TRIANGLE_STRIP)。重啟圖元,可以在繪圖過程中遇到圖元重啟索引時,從緊接著索引的頂點開始對相同型別的圖元進行一次新的渲染、

8:緩衝區物件:在OpenGL中,我們需要向OpenGL傳遞資料,由於OpenGL是按照客戶機—伺服器模式設計的,所以在OpenGL需要資料的任何時候,都必須把資料從客戶機記憶體傳輸到伺服器。如果資料並沒有被修改,或者客戶機和伺服器位於不同的計算機,資料的傳輸可能就會比較慢或是冗餘的。所以OpenGL中增加了緩衝區物件(buffer object),允許應用程式顯示的指定把那些資料儲存在圖形伺服器中,3.1版本增加了統一緩衝物件(uniform buffer object)以儲存成塊的、用於著色器的統一變數資料。

9:頂點陣列物件:由於程式增大使用更多的模型,在每幀之間需要多組頂點陣列之間切換,這樣對頂點的操作就會大量且重複,頂點陣列物件捆綁了呼叫的集合,以設定頂點陣列的狀態,我們可以通過單次呼叫在不同的頂點陣列之間進行修改