写在前面
公司项目完结,有点闲暇时间决定学点东西。 看了下 OpenGL ,在这里做个笔记,记录下自己学习的过程。
OpenGL思路体现
- 1、创建图层 --创建一个能把OpenGL ES的结果渲染上去的图层
- 2、创建上下文
- 3、清空缓冲区,这里清空缓存
- 4、设置RenderBuffer,FrameBuffer
- 5、开始绘制
代码实现
- 创建图层
- 创建上下文
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; if (!self.context) { NSLog(@"Failed to create ES context"); } GLKView *view = (GLKView *)self.view; view.context = self.context; view.drawableDepthFormat = GLKViewDrawableDepthFormat24; [EAGLContext setCurrentContext:self.context];
- 清空缓存
glClearColor(1, 0.2, 0.2, 1); glClear(GL_COLOR_BUFFER_BIT);
- 设置RenderBuffer,FrameBuffer
program = glCreateProgram(); const GLchar *vssource = (GLchar *)vertexShader; const GLchar *fssource = (GLchar *)fragmentShader; if (!compileShader(&vertShader,GL_VERTEX_SHADER, vssource)) { printf("Failed to compile vertex shader"); return false; } if (!compileShader(&fragShader,GL_FRAGMENT_SHADER, fssource)) { printf("Failed to compile fragment shader"); return false; } // Attach vertex shader to program. glAttachShader(program, vertShader); // Attach fragment shader to program. glAttachShader(program, fragShader); // Link program. if (!linkProgram(program)) { printf("Failed to link program: %d", program); if (vertShader) { glDeleteShader(vertShader); vertShader = 0; } if (fragShader) { glDeleteShader(fragShader); fragShader = 0; } if (program) { glDeleteProgram(program); program = 0; } return false; } // Release vertex and fragment shaders. if (vertShader) { glDetachShader(program, vertShader); glDeleteShader(vertShader); } if (fragShader) { glDetachShader(program, fragShader); glDeleteShader(fragShader); } *pProgram = program; printf("Effect build success => %d \n", program);
- 开始绘制
static GLfloat triangleData[18] = { 0, 0.5f, 0, 0, 0.5, 0, // x, y, z, r, g, b,每一行存储一个点的信息,位置和颜色 -0.5f, -0.5f, 0, 0, 1, 0, 0.5f, -0.5f, 0, 0, 0.5, 1, }; GLuint positionAttribLocation = glGetAttribLocation(self.shaderProgram, "position"); glEnableVertexAttribArray(positionAttribLocation); GLuint colorAttribLocation = glGetAttribLocation(self.shaderProgram, "color"); glEnableVertexAttribArray(colorAttribLocation); // 为shader中的position和color赋值 // glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) // indx: 上面Get到的Location // size: 有几个类型为type的数据,比如位置有x,y,z三个GLfloat元素,值就为3 // type: 一般就是数组里元素数据的类型 // normalized: 暂时用不上 // stride: 每一个点包含几个byte,本例中就是6个GLfloat,x,y,z,r,g,b // ptr: 数据开始的指针,位置就是从头开始,颜色则跳过3个GLFloat的大小 glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (char *)triangleData); glVertexAttribPointer(colorAttribLocation, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (char *)triangleData + 3 * sizeof(GLfloat)); glDrawArrays(GL_TRIANGLES, 0, 3);