openGL 基礎(3) vertex buffer

OpenGL 系列分享目的在于介紹如何使用 OpenGL 來繪制畫面。 為了大家能夠更好理解如何開發(fā)游戲引擎做一些準備工作,同時也推出了C++ 基礎分享,此分享也為游戲引擎開發(fā)分享服務。在之前我們已經(jīng)在屏幕上繪制了一個三角形,普及一下,我們在玩游戲和看CG 動畫的時候,所有的絢麗的畫面都是由若干三角形組成。所以,一切的一切都是從三角形開始,那么 OpenGL 是怎么流程將三角形繪制到屏幕上,首先需要 vertex buffer 和 vertex shader。

那么我們就從 vertex buffer 開始,vertex buffer 這個詞便于理解,大家可以先不用考慮 vertex ,就只想他就是一個 buffer,占一定字節(jié)的內(nèi)存。大家都是在 C++ 也有像 char 這樣類型 buffer,這里 vertex buffer 與之不同之處在于這里buffer 是占用的 GPU 的內(nèi)存而不是 CPU 的內(nèi)存。當我們要畫三角形到畫面時,繪制方法會從 GPU 的 ram 讀取 buffer(頂點信息) 進行繪制。Shader 是一段代碼計算出位置,運行這段代碼可以繪制圖形。

我們需要把之前繪制三角形頂點的數(shù)據(jù)轉(zhuǎn)移到到openGL 的 buffer 中,作為繪制的數(shù)據(jù)。也就是創(chuàng)建緩存區(qū)對象。

我們定義緩存 buffer,這里第一個參數(shù)為定義 buffer 個數(shù),1 表示我定義一個 buffer。

第二個為用于存儲單一 ID 或多個 ID 的 GLuint (unsigned int)變量或數(shù)組的地址,這里個人推薦使用 unsigned int 類型代替 openGL 提供的 GLunit ,返回緩存對象的標示符),可以想象為一個對象 id,shader 可以根據(jù) id 獲取對象。

我們定義一個數(shù)組包含三角形頂一點的數(shù)據(jù),

在使用 buffer 對象之前,需要將 buffer 對象綁定(連接)到相應的緩存上。glBindBuffer()有2個參數(shù),分別為目標與buffer。

第一個參數(shù)(目標)告訴 VBO 該緩存對象將保存頂點數(shù)組數(shù)據(jù)還是索引數(shù)組數(shù)據(jù):GL_ARRAY_BUFFER 或 GL_ELEMENT_ARRAY。任何頂點屬性,如頂點坐標、紋理坐標、法線與顏色分量數(shù)組都使用GL_ARRAY_BUFFER。

如何使用 openGL 方法,可以?docs.gl 網(wǎng)址進行搜索

可以使用glBufferData()將數(shù)據(jù)拷貝到緩存對象,第一個參數(shù)(目標)可以為GL_ARRAY_BUFFER 或 GL_ELEMENT_ARRAY, 這里為?GL_ARRAY_BUFFER 。size(圖中的 6)為待傳遞數(shù)據(jù)字節(jié)數(shù)量。第三個參數(shù)(圖中的 position)為源數(shù)據(jù)數(shù)組指針,如 data 為 NULL,則 VBO 僅預留給定數(shù)據(jù)大小的內(nèi)存空間。最后一個參數(shù)usage標志位VBO的另一個性能提示,它提供緩存對象將如何使用:static、dynamic 或 stream、與 read、copy 或 draw。這里用 GL_STATIC_DRAW 表示僅需修改一次,可以多次使用。

刪除之前繪制三角形的方法,我們現(xiàn)在是 openGL 編程,我們 glDrawArrays 繪制,第一參數(shù)為繪制圖形類型,第二個參數(shù)從 buffer 數(shù)據(jù)第一位開始繪制,第三表示繪制個數(shù),因為是三個頂點,所以為 3.。運行程序沒有效果,因為我們還沒有定義 shader。


openGL 基礎(1)

openGL 基礎 (2)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容