OpenGL學習筆記(七)

2021-10-06 16:32:21 字數 1160 閱讀 8488

頂點著色器允許我們指定任何以頂點屬性為形式的輸入。這使其具有很強的靈活性的同時,它還的確意味著我們必須手動指定輸入資料的哪乙個部分對應頂點著色器的哪乙個頂點屬性。所以,我們必須在渲染前指定opengl該如何解釋頂點資料。

glvertexattribpointer(0

,3, gl_float, gl_false,3*

sizeof

(float),

(void*)

0);glenablevertexattribarray(0

);

glvertexattribpointer函式的引數說明:

第乙個引數指定我們要配置的頂點屬性。還記得我們在頂點著色器中使用layout(location = 0)定義了position頂點屬性的位置值(location)嗎?它可以把頂點屬性的位置值設定為0。因為我們希望把資料傳遞到這乙個頂點屬性中,所以這裡我們傳入0。

第二個引數指定頂點屬性的大小。頂點屬性是乙個vec3,它由3個值組成,所以大小是3。

第三個引數指定資料的型別,這裡是gl_float(glsl中vec*都是由浮點數值組成的)。

第四個引數定義我們是否希望資料被標準化(normalize)。如果我們設定為gl_true,所有資料都會被對映到0(對於有符號型signed資料是-1)到1之間。我們把它設定為gl_false。

第五個引數叫做步長(stride),它告訴我們在連續的頂點屬性組之間的間隔。由於下個組位置資料在3個float之後,我們把步長設定為3 * sizeof(float)。要注意的是由於我們知道這個陣列是緊密排列的(在兩個頂點屬性之間沒有空隙)我們也可以設定為0來讓opengl決定具體步長是多少(只有當數值是緊密排列時才可用)。一旦我們有更多的頂點屬性,我們就必須更小心地定義每個頂點屬性之間的間隔。

最後乙個引數的型別是void*,所以需要我們進行這個奇怪的強制型別轉換。它表示位置資料在緩衝中起始位置的偏移量(offset)。由於位置資料在陣列的開頭,所以這裡是0。

現在我們已經定義了opengl該如何解釋頂點資料,我們現在應該使用glenablevertexattribarray,以頂點屬性位置值作為引數,啟用頂點屬性;頂點屬性預設是禁用的。自此,所有東西都已經設定好了:我們使用乙個頂點緩衝物件將頂點資料初始化至緩衝中,建立了乙個頂點和乙個片段著色器,並告訴了opengl如何把頂點資料鏈接到頂點著色器的頂點屬性上。

openGL之圓環 openGL學習筆記(七)

畫圓環的想法與畫球體的想法大致相同,不同的是,圓環中間為空,而環體的直徑又相同,所以通過設定兩個半徑,用兩個半徑和角度就可以確定每個點的x,y,z座標。首先,還是先把環體切成幾個部分,每個部分開啟之後都是乙個矩形,把每個矩形都用畫三角形帶的方式繪製出來的話,那麼圓環就可以實現。接下來就是座標的計算 ...

OpenGL學習隨筆 七

很多時候,知識難以常握是因為我們只知其表不知其裡,或者說不了解歷史就不能理解現在。所以在學習到一定程度之後一定要去分析和實現opengl,之後才能真正理解和掌握opengl。每天在不斷學習新的內容時,我都會選擇重寫測試 而不是在之前的 上修改,原因是想找出一些思維定勢和盲區。今天嘗試用push和po...

OpenGL學習筆記

我是一名ios開發者,opengl是乙個比較重要的技術。所以就此開啟我的菜鳥之路。opengl open graphics library 是乙個跨程式設計語 言 跨平台的程式設計圖形程式接 它將計算機的資源抽象稱為乙個個opengl的物件,對這些資源的操作抽象為乙個的opengl指令.direct...