因为我是iOS开发者,所以学习OpenGLES用的是XCode。
搭建我的第一个OpenGLES应用程序。
首先创建一个应用程序。
创建后需要把ViewController的UIView改为GLKView,如下图。
在ViewController引入框架GLKit,让ViewController继承GLKViewController。
然后创建EAGLContext,我理解EAGLContext就像一个开关,设置当前使用的OpenGLES的当前版本。
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
[EAGLContext setCurrentContext:context];
GLKView *view = (GLKView *)self.view;
view.context = context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
接下来就是重头戏了。设置着色器。
OpenGL渲染管线是一系列的数据处理过程。如下图。
其中定点着色器和片元着色器的必须的,细分和几何着色器是可选的。
编译链接着色器一般分为6个步骤。
1.创建着色器,用 GLuint glCreateShader(GLEnum type) 方法创建。
type是着色器类型可以是GL_VERTEX_SHADER(定点)或者GL_FRAGMENT_SHADER(片元)。
返回着色器句柄。
2.将源码添加到着色器,用 void glShaderSource(GLuint shader,GLsizei count,const GLchar * const *string,const GLint *length)方法。
shader是着色器句柄。
count是着色器源字符串的数量。
string 源字符串数组指针。
length 源字符串可以由多个源字符串组成,它代表组成每个源字符串个数的数组指针。可以传NULL。
3.编译着色器,用 void glCompileShader(GLuint shader)方法。
shader 是着色器句柄。
4.创建一个程序。用GLuint glCreateProgram()方法。
返回程序句柄。
5.将编译后的着色器连接到程序上。用 void glAttachShader(GLuint program, GLuint shader)方法。
program 指向程序对象的句柄。
shader 着色器的句柄。
6.链接程序。用 void glLinkProgram(GLuint program)方法。
program 程序句柄。
程序创建完后,开始配置数据。
1.初始化顶点数组对象,用 void glGenVertexArray(GLsizei n, GLuint* arrays) 方法。
返回 n个未使用的对象名到数组arrays中
2.绑定顶点数组对象,用 void glBindVertexArray (GLuint array) 方法。
array 是数组名。
3.分配缓存对象。用 void glGenBuffers(GLsizei n,GLuint *buffers)方法。
这个方法分配n个缓存对象保存到buffers中(VBO)。
4.绑定缓存类型,用 void glBindBuffer(GLenum target,GLuint buffer)方法。
target 常用类型有 1 ).GL_ARRAY_BUFFER :保存顶点数组数据。
2). GL_ELEMENT_ARRAY_BUFFER: 顶点索引数据。
3).GL_TEXTURE_BUFFER:纹理数据。
5.添加数据,用void glBufferData(GLenum target,GLsizeiptr size,const GLvoid *data,GLenum usage)方法。
target 类型。
size 占用内存大小。
data 数据。
usage 缓存用途标识符。常用 GL_STATIC_DRAW :内容写入一次用来绘制
GL_DYNAMIC_DRAW:反复写入用来绘制
6.给着色器输入(in)数据,关联到一个顶点属性数组。用 void glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) 方法。
index 是顶点着色器中输入变量的location值。
size 每个顶点元素个数(可以是 1—4 x,y,z,w)。
type 元素类型
normalized 是否归一化
stride 顶点数据间的位移,顶点数据的跨距。
ptr 偏移量。