iOS端OpenGL ES 的基本使用

OpenGL ES是針對(duì)嵌入式系統(tǒng)的OpenGL標(biāo)準(zhǔn),iPhone端支持的是OpenGL ES 2.0. 并且iOS5之后引入了GLkit框架,方便我們使用OpenGL進(jìn)行圖形繪制.

使用3D數(shù)據(jù)生成一個(gè)2D圖像的過程叫做渲染.OpenGL ES 為兩個(gè)內(nèi)存區(qū)域間的數(shù)據(jù)交換定義了緩存的概念.緩存是指圖形處理器能夠控制和管理的連續(xù)RAM.

幾乎所有程序提供給GPU的數(shù)據(jù)都應(yīng)該放入緩存中. 為緩存提供數(shù)據(jù)有以下7個(gè)步驟:

1. 生成 ---請(qǐng)求OpenGL ES 為圖形處理器控制的緩存生成一個(gè)獨(dú)一無二的標(biāo)識(shí)符.----? glGenbuffers()

2.綁定? 告訴OpenGL ES 為接下來的運(yùn)算使用一個(gè)緩存? -----glBindBuffer()

3.緩存數(shù)據(jù)?? ----讓OpenGLES 為當(dāng)前綁定的緩存分配并初始化足夠的連續(xù)內(nèi)存.? ----glBufferData()

4. 啟用? 或者 禁止 --告訴OpenGL ES 在接下的渲染中是否使用緩存中的數(shù)據(jù)? ------glEnableVertexAttribArray()

5. 設(shè)置指針? 告訴OpenGLES 在緩存中的數(shù)據(jù)的類型和所有需要訪問的數(shù)據(jù)的內(nèi)存偏移值 --- glVertexAttribPointer()

6. 繪圖 -- 告訴OpenGL ES 使用當(dāng)前綁定并啟用的緩存中的數(shù)據(jù)渲染整個(gè)場(chǎng)景或者某個(gè)場(chǎng)景的一部分. ---glDrawArrays()

7.刪除? -- 告訴OpenGL ES 刪除以前生成的緩存并釋放相關(guān)的資源.-----glDeleteBuffers()

使用GLKBaseEffect 能減少需要編寫的代碼,可以不用我們自己寫"Shading Language"去編寫GPU程序.

1.glGenBuffers(1, &buffer)函數(shù),第一個(gè)參數(shù)用于指定要生成的緩存標(biāo)識(shí)符的數(shù)量,第二個(gè)參數(shù)是一個(gè)指針,指向生成的標(biāo)識(shí)符的內(nèi)存保存位置.

2.glBindBuffer(GL_ARRAY_BUFFER, buffer);函數(shù)綁定用于指定標(biāo)識(shí)符的緩存到當(dāng)前緩存.第一個(gè)參數(shù)是一個(gè)常量,用于指定要綁定哪一種類型的緩存.

3.glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertexData), squareVertexData, GL_STATIC_DRAW);
第一個(gè)參數(shù)用于指定要更新當(dāng)前上下文中所綁定的是哪一個(gè)緩存.第二個(gè)參數(shù)指定要復(fù)制進(jìn)這個(gè)緩存的字節(jié)的數(shù)量.第三個(gè)參數(shù)是要復(fù)制的字節(jié)的地址.最后第四個(gè)參數(shù)提示了緩存在未來的運(yùn)算中可能將會(huì)被怎樣使用.

4.glEnableVertexAttribArray(GLKVertexAttribPosition),用來啟動(dòng)頂點(diǎn)緩存渲染操作.

5.glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, 0),這個(gè)函數(shù)告訴OpenGL ES頂點(diǎn)數(shù)據(jù)在哪里,以及怎么解釋為每一個(gè)頂點(diǎn)保存的數(shù)據(jù).第一個(gè)參數(shù)指示當(dāng)前綁定的緩存包含每個(gè)頂點(diǎn)的位置信息.第二個(gè)參數(shù)指示每個(gè)位置有3個(gè)部分.第三個(gè)參數(shù)告訴OpenGL ES每個(gè)部分都保存為一個(gè)浮點(diǎn)類型的值.第四個(gè)參數(shù)告訴OpenGL ES 小數(shù)點(diǎn)固定數(shù)據(jù)是否可以被改變.

6.通過glDrawArrays()來繪圖.glDrawArrays(GL_LINE_LOOP, 0, 3);第一個(gè)參數(shù)告訴GPU怎么處理在綁定的頂點(diǎn)緩存內(nèi)的頂點(diǎn)數(shù)據(jù).第二個(gè)參數(shù)和第三個(gè)參數(shù)分別指定緩存內(nèi)的需要渲染的第一個(gè)頂點(diǎn)位置和需要渲染的頂點(diǎn)的數(shù)量.

7.刪除不需要的頂點(diǎn)緩存和上下文

glDeleteBuffers(1,&vertexBufferID);




有一些使用的例子在這里:https://github.com/Wutaotao692732757/LearnOpenGLDemo

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

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

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