OpenGL 系列分享目的在于介紹如何使用 OpenGL 來繪制畫面。 為了大家能夠更好理解如何開發(fā)游戲引擎做一些準(zhǔn)備工作,同時(shí)也推出了C++ 基礎(chǔ)分享赐写,此分享也為游戲引擎開發(fā)分享服務(wù)。在之前我們已經(jīng)在屏幕上繪制了一個(gè)三角形,普及一下葫录,我們在玩游戲和看CG 動畫的時(shí)候,所有的絢麗的畫面都是由若干三角形組成领猾。所以,一切的一切都是從三角形開始,那么 OpenGL 是怎么流程將三角形繪制到屏幕上忍法,首先需要 vertex buffer 和 vertex shader灾挨。
那么我們就從 vertex buffer 開始,vertex buffer 這個(gè)詞便于理解继低,大家可以先不用考慮 vertex 熬苍,就只想他就是一個(gè) buffer,占一定字節(jié)的內(nèi)存袁翁。大家都是在 C++ 也有像 char 這樣類型 buffer柴底,這里 vertex buffer 與之不同之處在于這里buffer 是占用的 GPU 的內(nèi)存而不是 CPU 的內(nèi)存。當(dāng)我們要畫三角形到畫面時(shí)粱胜,繪制方法會從 GPU 的 ram 讀取 buffer(頂點(diǎn)信息) 進(jìn)行繪制柄驻。Shader 是一段代碼計(jì)算出位置,運(yùn)行這段代碼可以繪制圖形焙压。
我們需要把之前繪制三角形頂點(diǎn)的數(shù)據(jù)轉(zhuǎn)移到到openGL 的 buffer 中鸿脓,作為繪制的數(shù)據(jù)抑钟。也就是創(chuàng)建緩存區(qū)對象。
我們定義緩存 buffer野哭,這里第一個(gè)參數(shù)為定義 buffer 個(gè)數(shù)在塔,1 表示我定義一個(gè) buffer。
第二個(gè)為用于存儲單一 ID 或多個(gè) ID 的 GLuint (unsigned int)變量或數(shù)組的地址虐拓,這里個(gè)人推薦使用 unsigned int 類型代替 openGL 提供的 GLunit 心俗,返回緩存對象的標(biāo)示符),可以想象為一個(gè)對象 id蓉驹,shader 可以根據(jù) id 獲取對象城榛。
我們定義一個(gè)數(shù)組包含三角形頂一點(diǎn)的數(shù)據(jù),
在使用 buffer 對象之前态兴,需要將 buffer 對象綁定(連接)到相應(yīng)的緩存上狠持。glBindBuffer()有2個(gè)參數(shù),分別為目標(biāo)與buffer瞻润。
第一個(gè)參數(shù)(目標(biāo))告訴 VBO 該緩存對象將保存頂點(diǎn)數(shù)組數(shù)據(jù)還是索引數(shù)組數(shù)據(jù):GL_ARRAY_BUFFER 或 GL_ELEMENT_ARRAY喘垂。任何頂點(diǎn)屬性,如頂點(diǎn)坐標(biāo)绍撞、紋理坐標(biāo)正勒、法線與顏色分量數(shù)組都使用GL_ARRAY_BUFFER。
如何使用 openGL 方法傻铣,可以?docs.gl 網(wǎng)址進(jìn)行搜索
可以使用glBufferData()將數(shù)據(jù)拷貝到緩存對象章贞,第一個(gè)參數(shù)(目標(biāo))可以為GL_ARRAY_BUFFER 或 GL_ELEMENT_ARRAY, 這里為?GL_ARRAY_BUFFER 非洲。size(圖中的 6)為待傳遞數(shù)據(jù)字節(jié)數(shù)量鸭限。第三個(gè)參數(shù)(圖中的 position)為源數(shù)據(jù)數(shù)組指針,如 data 為 NULL两踏,則 VBO 僅預(yù)留給定數(shù)據(jù)大小的內(nèi)存空間败京。最后一個(gè)參數(shù)usage標(biāo)志位VBO的另一個(gè)性能提示,它提供緩存對象將如何使用:static梦染、dynamic 或 stream赡麦、與 read、copy 或 draw弓坞。這里用 GL_STATIC_DRAW 表示僅需修改一次隧甚,可以多次使用。
刪除之前繪制三角形的方法渡冻,我們現(xiàn)在是 openGL 編程戚扳,我們 glDrawArrays 繪制,第一參數(shù)為繪制圖形類型族吻,第二個(gè)參數(shù)從 buffer 數(shù)據(jù)第一位開始繪制帽借,第三表示繪制個(gè)數(shù)珠增,因?yàn)槭侨齻€(gè)頂點(diǎn),所以為 3.砍艾。運(yùn)行程序沒有效果蒂教,因?yàn)槲覀冞€沒有定義 shader。