如果你不知道OpenGL 是干什么的,看到這下面這張圖片就知道這到底是干什么的了
簡(jiǎn)單的說(shuō)舌镶,它就是能高性能、高幀率利用GPU提供的2D和3D繪制能力
我先提供一片文章關(guān)于iOS設(shè)備渲染的文章
http://rannie.github.io/ios/2016/02/22/ios-display-opengles.html
也可以查看蘋(píng)果官方文檔https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESontheiPhone.html#//apple_ref/doc/uid/TP40008793-CH101-SW1
GLKit框架提供視圖和視圖控制器類餐胀,可以消除繪圖和動(dòng)畫(huà)化OpenGL ES內(nèi)容所需的設(shè)置和維護(hù)代碼。GLKView類管理OpenGL ES的基礎(chǔ)設(shè)施否灾,為您的繪制代碼提供一個(gè)場(chǎng)所,而GLKViewController類提供了在GLKit視圖的OpenGL ES內(nèi)容的流暢的動(dòng)畫(huà)渲染循環(huán)惩阶。這些類擴(kuò)展了用于繪制視圖內(nèi)容和管理視圖呈現(xiàn)的標(biāo)準(zhǔn)UIKit設(shè)計(jì)模式。因此琳猫,您可以將重點(diǎn)放在OpenGL ES渲染代碼上,使您的應(yīng)用程序快速啟動(dòng)并運(yùn)行
之前看落影l(fā)oyinglin寫(xiě)的第一篇關(guān)于OpenGL 的文章,只是了解了大概意思,如果要自己去寫(xiě)的話统刮,根本不知道怎么去寫(xiě),不知道每個(gè)函數(shù)具體怎么用
GLuint buffer;//緩沖區(qū)ID OpenGL就可以一次綁定到多個(gè)緩沖區(qū)
glGenBuffers (GLsizei n, GLuint* buffers);
這個(gè)函數(shù)的作用:就是生成一個(gè)或者多個(gè)緩沖區(qū)對(duì)象侥蒙,緩沖區(qū)兌現(xiàn)在幕后實(shí)例化,引用ID反悔給用戶訪問(wèn)這些緩沖區(qū)對(duì)象
GLsizei n:定義生成多少個(gè)緩沖區(qū)對(duì)象鞭衩,glGenBuffers將這個(gè)許多緩沖區(qū)ID返回給目標(biāo)buffers數(shù)組
buffers:buffer是一個(gè)GLuint數(shù)組,glGenBuffers存儲(chǔ)生成的緩沖區(qū)ID
glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
這個(gè)函數(shù)的作用:分配內(nèi)存并將數(shù)據(jù)存儲(chǔ)在當(dāng)前綁定的緩沖區(qū)對(duì)象的初始化內(nèi)存中
- target:它的第一個(gè)參數(shù)是我們要將數(shù)據(jù)復(fù)制到的緩沖區(qū)的類型 常見(jiàn)的就是GL_ARRAY_BUFFER和- GL_ELEMENT_ARRAY_BUFFER
- size:要傳遞給緩沖區(qū)的數(shù)據(jù)大小(以字節(jié)為單位)一個(gè)簡(jiǎn)單sizeof的頂點(diǎn)數(shù)據(jù)就足夠了
- data:我們要發(fā)送的實(shí)際數(shù)據(jù)
- usage:指定了我們希望顯卡管理給定數(shù)據(jù)的方式瑞佩。這可以采取3種形式:
- GL_STATIC_DRAW:數(shù)據(jù)很可能根本不會(huì)發(fā)生變化,或很少發(fā)生炬丸。
- GL_DYNAMIC_DRAW:數(shù)據(jù)可能會(huì)有很大變化蜒蕾。
- GL_STREAM_DRAW:數(shù)據(jù)將在每次繪制時(shí)更改。
glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
這個(gè)函數(shù)的作用就是:指定了當(dāng)繪制調(diào)用時(shí)OpenGL應(yīng)如何解釋頂點(diǎn)緩沖數(shù)據(jù)咪啡,指定的解釋存儲(chǔ)在當(dāng)前綁定的頂點(diǎn)數(shù)組對(duì)象中
- indx:指定要配置的頂點(diǎn)屬性。請(qǐng)記住撤摸,我們?cè)陧旤c(diǎn)著色器中指定了位置頂點(diǎn)屬性的位置layout (location = 0)褒纲。這將設(shè)置頂點(diǎn)屬性的位置疾嗅,0因?yàn)槲覀兿胍獙?shù)據(jù)傳遞給該頂點(diǎn)屬性,所以我們傳入0代承。
- size:參數(shù)指定頂點(diǎn)屬性的大小
- type:指定GL_FLOAT的數(shù)據(jù)類型(vec*GLSL中的a由浮點(diǎn)值組成)
- normalized:指定是否要將數(shù)據(jù)歸一化。如果我們將其設(shè)置為GL_TRUE论悴,則所有數(shù)據(jù)的值不在0(或-1對(duì)于帶符號(hào)數(shù)據(jù))之間,1并將映射到這些值膀估。我們把它留在GL_FALSE
- stride: 告訴我們連續(xù)頂點(diǎn)屬性集之間的空間。請(qǐng)注意察纯,由于我們知道數(shù)組是緊密包裝的(在下一個(gè)頂點(diǎn)屬性值之間沒(méi)有空格),我們也可以指定步驟饼记,0以使OpenGL確定步幅(僅當(dāng)值緊密包裝時(shí)才起作用)。每當(dāng)我們有更多的頂點(diǎn)屬性時(shí)具则,我們必須仔細(xì)定義每個(gè)頂點(diǎn)屬性之間的間距
- GLvoid* ptr,因此需要奇怪的轉(zhuǎn)換低斋。這是抵消位置數(shù)據(jù)在緩沖區(qū)中開(kāi)始的位置。由于位置數(shù)據(jù)位于數(shù)據(jù)數(shù)組的開(kāi)頭膊畴,所以這個(gè)值是正確的0。
glEnableVertexAttribArray (GLuint index) ````
啟用通用頂點(diǎn)屬性
- Glint index:指定啟用的頂點(diǎn)屬性的索引
glCreateShader (GLenum type)````
這個(gè)函數(shù)的作用:創(chuàng)建一個(gè)空的著色器對(duì)象巴比,并返回一個(gè)未簽名的飲用ID到該著色器對(duì)象以供進(jìn)一步使用
- GLenum type:指定要?jiǎng)?chuàng)建的著色器的類型 頂點(diǎn)著色器傳GL_VERTEX_SHADER
glShaderSource (GLuint shader, GLsizei count, const GLchar* const *string, const GLint* length) ````
這個(gè)函數(shù)的作用:將替換給定著色器對(duì)象的源代碼,每當(dāng)著色器被編譯時(shí)轻绞,它是用給定的源代碼進(jìn)行編譯
- GLuint shader:指定要替換源代碼的著色器對(duì)象
- GLsizei count:指定string數(shù)組中的元素?cái)?shù)
- const GLchar* const *string:指定包涵要加載到著色器的源代碼的字符串的指針數(shù)組(頂點(diǎn)著色器的實(shí)際源代碼)
- const GLint* length:指定字符串長(zhǎng)度的數(shù)組 可以為NULL
glCompileShader (GLuint shader)````
使用附加的著色器對(duì)象的源變異給定的著色器對(duì)象
- GLuint shader:要編譯的著色器對(duì)象
glCreateProgram()````
創(chuàng)建一個(gè)程序并返回到新創(chuàng)建的程序?qū)ο蟮腎D引用
glAttachShader (GLuint program, GLuint shader) ````
將編譯的著色器對(duì)象附加到著色器程序佣耐,任何數(shù)量的著色器對(duì)象可以附加到著色器程序
- GLuint program:指定要附加著色器對(duì)象的程序?qū)ο?/li>
- GLuint shader:指定要附加的著色器對(duì)象
glLinkProgram (GLuint program)
將所有附加的著色器成連到一個(gè)最終的著色器程序?qū)ο笾屑孀谶B接步驟中既棺,每個(gè)輸出與著色器的每個(gè)輸出匹配
glUseProgram (GLuint program)
將給定的程序?qū)ο笤O(shè)置為用于后續(xù)繪制命令的當(dāng)前活動(dòng)著色器程序,如果提供一個(gè)值0丸冕,OpenGL將會(huì)使用它的舊繪圖模式
- GLuint program:要是用的著色器對(duì)象
glDeleteShader (GLuint shader)
刪除給定的著色器對(duì)象