绘制三角形的三种方式:
GL_TRIANGLES为单个三角形绘制模式,STRIP为两线一点确定一个相邻三角,FAN为相邻三角形的所有轮廓点。
buffer分为frame buffer和render buffer两大类,其中frame buffer相当于render buffer的管理者,frame buffer object即称为FBO,常用于做离屏渲染缓冲等。render buffer则又可分为三类,color buffer / depth buffer / stencil buffer。
- (void)setupOpenGLBuffers {
//先要renderbuffer,然后framebuffer,顺序不能互换。
// OpenGlES共有三种:colorBuffer,depthBuffer,stencilBuffer。
// 生成一个renderBuffer,id是_colorRenderBuffer
glGenRenderbuffers(1, &_renderBuffer);
// 设置为当前renderBuffer
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
//为color renderbuffer 分配存储空间
[_glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
// FBO用于管理colorRenderBuffer,离屏渲染
glGenFramebuffers(1, &_frameBuffer);
//设置为当前framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
// 将 _colorRenderBuffer 装配到 GL_COLOR_ATTACHMENT0 这个装配点上
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);
}
创建着色器程序
/**
编译Program + Vertex Shader + Fragment Shader
*/
- (void) createProgram {
//编译Vertex Shader和Fragment Shader
_glProgram = [ShaderCompileTool compileShaders:@"ShaderVertex" shaderFragment:@"ShaderFragment"];
//创建program并与Vertex Shader和Fragment Shader关联
// glAttachShader(_glProgram, _vertexShader);
// glAttachShader(_glProgram, _fragmentShader);
//链接program
glLinkProgram(_glProgram);
#ifdef DEBUG
GLint linkSuccess;
glGetProgramiv(_glProgram, GL_LINK_STATUS, &linkSuccess);
if (linkSuccess == GL_FALSE) {
GLchar messages[256];
glGetProgramInfoLog(_glProgram, sizeof(messages), 0, &messages[0]);
NSString *messageString = [NSString stringWithUTF8String:messages];
NSLog(@"%@", messageString);
return;
}
#endif
//开始使用program
glUseProgram(_glProgram);
//获取position的"指针"
_shaderPostionPtr = glGetAttribLocation(_glProgram, "Position");
_shaderSourceColorPtr = glGetAttribLocation(_glProgram, "SourceColor");
}
设置顶点和颜色数据
- (void)configVBOs
{
// 取出Vertices数组中的坐标点值,赋给_positionSlot
glVertexAttribPointer(_shaderPostionPtr, 3, GL_FLOAT, GL_FALSE, 0, verticesIndex);
glEnableVertexAttribArray(_shaderPostionPtr);
//注意,未使用VBO时,glVertexAttribPointer的最后一个参数是指向对应数组的指针。
//取出Colors数组中的每个坐标点的颜色值,赋给_colorSlot
glVertexAttribPointer(_shaderSourceColorPtr, 4, GL_FLOAT, GL_FALSE, 0, Colors);
glEnableVertexAttribArray(_shaderSourceColorPtr);
}
/**
绘制数据
*/
- (void) render {
// 设置清屏颜色
glClearColor(1.0f, 0.5f, 0.5f, 0.5f);
// 用来指定要用清屏颜色来清除由mask指定的buffer,此处是color buffer
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, self.view.frame.size.width, self.view.frame.size.height);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
[self.glContext presentRenderbuffer:GL_RENDERBUFFER];
}
效果如下: