?繪制三角形的三種方式:
GL_TRIANGLES為單個(gè)三角形繪制模式,STRIP為兩線一點(diǎn)確定一個(gè)相鄰三角,F(xiàn)AN為相鄰三角形的所有輪廓點(diǎn)垒棋。
buffer分為frame buffer和render buffer兩大類懂鸵,其中frame buffer相當(dāng)于render buffer的管理者偏螺,frame buffer object即稱為FBO,常用于做離屏渲染緩沖等匆光。render buffer則又可分為三類套像,color buffer / depth buffer / stencil buffer。
- (void)setupOpenGLBuffers {
//先要renderbuffer终息,然后framebuffer凉夯,順序不能互換。
// OpenGlES共有三種:colorBuffer采幌,depthBuffer,stencilBuffer震桶。
// 生成一個(gè)renderBuffer休傍,id是_colorRenderBuffer
glGenRenderbuffers(1, &_renderBuffer);
// 設(shè)置為當(dāng)前renderBuffer
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
//為color renderbuffer 分配存儲(chǔ)空間
[_glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
// FBO用于管理colorRenderBuffer,離屏渲染
glGenFramebuffers(1, &_frameBuffer);
//設(shè)置為當(dāng)前framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
// 將 _colorRenderBuffer 裝配到 GL_COLOR_ATTACHMENT0 這個(gè)裝配點(diǎn)上
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);
}
創(chuàng)建著色器程序
/**
編譯Program + Vertex Shader + Fragment Shader
*/
- (void) createProgram {
//編譯Vertex Shader和Fragment Shader
_glProgram = [ShaderCompileTool compileShaders:@"ShaderVertex" shaderFragment:@"ShaderFragment"];
//創(chuàng)建program并與Vertex Shader和Fragment Shader關(guān)聯(lián)
//? ? 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");
}
設(shè)置頂點(diǎn)和顏色數(shù)據(jù)
- (void)configVBOs
{
// 取出Vertices數(shù)組中的坐標(biāo)點(diǎn)值蹲姐,賦給_positionSlot
glVertexAttribPointer(_shaderPostionPtr, 3, GL_FLOAT, GL_FALSE, 0, verticesIndex);
glEnableVertexAttribArray(_shaderPostionPtr);
//注意磨取,未使用VBO時(shí),glVertexAttribPointer的最后一個(gè)參數(shù)是指向?qū)?yīng)數(shù)組的指針柴墩。
//取出Colors數(shù)組中的每個(gè)坐標(biāo)點(diǎn)的顏色值忙厌,賦給_colorSlot
glVertexAttribPointer(_shaderSourceColorPtr, 4, GL_FLOAT, GL_FALSE, 0, Colors);
glEnableVertexAttribArray(_shaderSourceColorPtr);
}
/**
繪制數(shù)據(jù)
*/
- (void) render {
// 設(shè)置清屏顏色
glClearColor(1.0f, 0.5f, 0.5f, 0.5f);
// 用來(lái)指定要用清屏顏色來(lái)清除由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];
}
效果如下: