OpenGL ES是針對嵌入式系統(tǒng)的OpenGL標準,iPhone端支持的是OpenGL ES 2.0. 并且iOS5之后引入了GLkit框架,方便我們使用OpenGL進行圖形繪制.
使用3D數(shù)據(jù)生成一個2D圖像的過程叫做渲染.OpenGL ES 為兩個內(nèi)存區(qū)域間的數(shù)據(jù)交換定義了緩存的概念.緩存是指圖形處理器能夠控制和管理的連續(xù)RAM.
幾乎所有程序提供給GPU的數(shù)據(jù)都應(yīng)該放入緩存中. 為緩存提供數(shù)據(jù)有以下7個步驟:
1. 生成 ---請求OpenGL ES 為圖形處理器控制的緩存生成一個獨一無二的標識符.----? glGenbuffers()
2.綁定? 告訴OpenGL ES 為接下來的運算使用一個緩存? -----glBindBuffer()
3.緩存數(shù)據(jù)?? ----讓OpenGLES 為當前綁定的緩存分配并初始化足夠的連續(xù)內(nèi)存.? ----glBufferData()
4. 啟用? 或者 禁止 --告訴OpenGL ES 在接下的渲染中是否使用緩存中的數(shù)據(jù)? ------glEnableVertexAttribArray()
5. 設(shè)置指針? 告訴OpenGLES 在緩存中的數(shù)據(jù)的類型和所有需要訪問的數(shù)據(jù)的內(nèi)存偏移值 --- glVertexAttribPointer()
6. 繪圖 -- 告訴OpenGL ES 使用當前綁定并啟用的緩存中的數(shù)據(jù)渲染整個場景或者某個場景的一部分. ---glDrawArrays()
7.刪除? -- 告訴OpenGL ES 刪除以前生成的緩存并釋放相關(guān)的資源.-----glDeleteBuffers()
使用GLKBaseEffect 能減少需要編寫的代碼,可以不用我們自己寫"Shading Language"去編寫GPU程序.
1.glGenBuffers(1, &buffer)函數(shù),第一個參數(shù)用于指定要生成的緩存標識符的數(shù)量,第二個參數(shù)是一個指針,指向生成的標識符的內(nèi)存保存位置.
2.glBindBuffer(GL_ARRAY_BUFFER, buffer);函數(shù)綁定用于指定標識符的緩存到當前緩存.第一個參數(shù)是一個常量,用于指定要綁定哪一種類型的緩存.
3.glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertexData), squareVertexData, GL_STATIC_DRAW);
第一個參數(shù)用于指定要更新當前上下文中所綁定的是哪一個緩存.第二個參數(shù)指定要復(fù)制進這個緩存的字節(jié)的數(shù)量.第三個參數(shù)是要復(fù)制的字節(jié)的地址.最后第四個參數(shù)提示了緩存在未來的運算中可能將會被怎樣使用.
4.glEnableVertexAttribArray(GLKVertexAttribPosition),用來啟動頂點緩存渲染操作.
5.glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, 0),這個函數(shù)告訴OpenGL ES頂點數(shù)據(jù)在哪里,以及怎么解釋為每一個頂點保存的數(shù)據(jù).第一個參數(shù)指示當前綁定的緩存包含每個頂點的位置信息.第二個參數(shù)指示每個位置有3個部分.第三個參數(shù)告訴OpenGL ES每個部分都保存為一個浮點類型的值.第四個參數(shù)告訴OpenGL ES 小數(shù)點固定數(shù)據(jù)是否可以被改變.
6.通過glDrawArrays()來繪圖.glDrawArrays(GL_LINE_LOOP, 0, 3);第一個參數(shù)告訴GPU怎么處理在綁定的頂點緩存內(nèi)的頂點數(shù)據(jù).第二個參數(shù)和第三個參數(shù)分別指定緩存內(nèi)的需要渲染的第一個頂點位置和需要渲染的頂點的數(shù)量.
7.刪除不需要的頂點緩存和上下文
glDeleteBuffers(1,&vertexBufferID);
有一些使用的例子在這里:https://github.com/Wutaotao692732757/LearnOpenGLDemo