如果你不知道OpenGL 是干什么的,看到这下面这张图片就知道这到底是干什么的了
简单的说,它就是能高性能、高帧率利用GPU提供的2D和3D绘制能力
我先提供一片文章关于iOS设备渲染的文章
http://rannie.github.io/ios/2016/02/22/ios-display-opengles.html
也可以查看苹果官方文档https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESontheiPhone.html#//apple_ref/doc/uid/TP40008793-CH101-SW1
GLKit框架提供视图和视图控制器类,可以消除绘图和动画化OpenGL ES内容所需的设置和维护代码。GLKView类管理OpenGL ES的基础设施,为您的绘制代码提供一个场所,而GLKViewController类提供了在GLKit视图的OpenGL ES内容的流畅的动画渲染循环。这些类扩展了用于绘制视图内容和管理视图呈现的标准UIKit设计模式。因此,您可以将重点放在OpenGL ES渲染代码上,使您的应用程序快速启动并运行
之前看落影loyinglin写的第一篇关于OpenGL 的文章,只是了解了大概意思,如果要自己去写的话,根本不知道怎么去写,不知道每个函数具体怎么用
GLuint buffer;//缓冲区ID OpenGL就可以一次绑定到多个缓冲区
glGenBuffers (GLsizei n, GLuint* buffers);
这个函数的作用:就是生成一个或者多个缓冲区对象,缓冲区兑现在幕后实例化,引用ID反悔给用户访问这些缓冲区对象
GLsizei n:定义生成多少个缓冲区对象,glGenBuffers将这个许多缓冲区ID返回给目标buffers数组
buffers:buffer是一个GLuint数组,glGenBuffers存储生成的缓冲区ID
glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
这个函数的作用:分配内存并将数据存储在当前绑定的缓冲区对象的初始化内存中
- target:它的第一个参数是我们要将数据复制到的缓冲区的类型 常见的就是GL_ARRAY_BUFFER和- GL_ELEMENT_ARRAY_BUFFER
- size:要传递给缓冲区的数据大小(以字节为单位)一个简单sizeof的顶点数据就足够了
- data:我们要发送的实际数据
- usage:指定了我们希望显卡管理给定数据的方式。这可以采取3种形式:
- GL_STATIC_DRAW:数据很可能根本不会发生变化,或很少发生。
- GL_DYNAMIC_DRAW:数据可能会有很大变化。
- GL_STREAM_DRAW:数据将在每次绘制时更改。
glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
这个函数的作用就是:指定了当绘制调用时OpenGL应如何解释顶点缓冲数据,指定的解释存储在当前绑定的顶点数组对象中
- indx:指定要配置的顶点属性。请记住,我们在顶点着色器中指定了位置顶点属性的位置layout (location = 0)。这将设置顶点属性的位置,0因为我们想要将数据传递给该顶点属性,所以我们传入0。
- size:参数指定顶点属性的大小
- type:指定GL_FLOAT的数据类型(vec*GLSL中的a由浮点值组成)
- normalized:指定是否要将数据归一化。如果我们将其设置为GL_TRUE,则所有数据的值不在0(或-1对于带符号数据)之间,1并将映射到这些值。我们把它留在GL_FALSE
- stride: 告诉我们连续顶点属性集之间的空间。请注意,由于我们知道数组是紧密包装的(在下一个顶点属性值之间没有空格),我们也可以指定步骤,0以使OpenGL确定步幅(仅当值紧密包装时才起作用)。每当我们有更多的顶点属性时,我们必须仔细定义每个顶点属性之间的间距
- GLvoid* ptr,因此需要奇怪的转换。这是抵消位置数据在缓冲区中开始的位置。由于位置数据位于数据数组的开头,所以这个值是正确的0。
glEnableVertexAttribArray (GLuint index) ````
启用通用顶点属性
- Glint index:指定启用的顶点属性的索引
glCreateShader (GLenum type)````
这个函数的作用:创建一个空的着色器对象,并返回一个未签名的饮用ID到该着色器对象以供进一步使用
- GLenum type:指定要创建的着色器的类型 顶点着色器传GL_VERTEX_SHADER
glShaderSource (GLuint shader, GLsizei count, const GLchar* const *string, const GLint* length) ````
这个函数的作用:将替换给定着色器对象的源代码,每当着色器被编译时,它是用给定的源代码进行编译
- GLuint shader:指定要替换源代码的着色器对象
- GLsizei count:指定string数组中的元素数
- const GLchar* const *string:指定包涵要加载到着色器的源代码的字符串的指针数组(顶点着色器的实际源代码)
- const GLint* length:指定字符串长度的数组 可以为NULL
glCompileShader (GLuint shader)````
使用附加的着色器对象的源变异给定的着色器对象
- GLuint shader:要编译的着色器对象
glCreateProgram()````
创建一个程序并返回到新创建的程序对象的ID引用
glAttachShader (GLuint program, GLuint shader) ````
将编译的着色器对象附加到着色器程序,任何数量的着色器对象可以附加到着色器程序
- GLuint program:指定要附加着色器对象的程序对象
- GLuint shader:指定要附加的着色器对象
glLinkProgram (GLuint program)
将所有附加的着色器成连到一个最终的着色器程序对象中,在连接步骤中,每个输出与着色器的每个输出匹配
glUseProgram (GLuint program)
将给定的程序对象设置为用于后续绘制命令的当前活动着色器程序,如果提供一个值0,OpenGL将会使用它的旧绘图模式
- GLuint program:要是用的着色器对象
glDeleteShader (GLuint shader)
删除给定的着色器对象