- (void)prepare{
// 1. 基本配置
EAGLContext *ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:ctx];
self.ctx = ctx;
glDeleteFramebuffers(1, &fboId);
glDeleteBuffers(1, &colorRboId);
glDeleteBuffers(1, &depthRboId);
fboId = colorRboId = depthRboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glGenRenderbuffers(1, &colorRboId);
glBindRenderbuffer(GL_RENDERBUFFER, colorRboId);
[self.ctx renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
GLint w,h;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &w);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &h);
self.renderSize = CGSizeMake(w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRboId);
[self chkFBOStatus];
// --- depth render buffer
glGenRenderbuffers(1, &depthRboId);
glBindRenderbuffer(GL_RENDERBUFFER, depthRboId);
// Once a renderbuffer object is bound, we can specify the dimensions and format of the image stored in the renderbuffer.
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.renderSize.width, self.renderSize.height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRboId);
[self chkFBOStatus];
// 2.
glClearColor(0.423, 0.43, 0.87, 1);
// 3. 设置顶点数据,下标数据
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
//The vertex array data or element array data storage is created and initialized using the glBufferData command.
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// 3. shader配置
[self setShader];
projUnif = glGetUniformLocation(programId, "u_Projection");
modelUnif = glGetUniformLocation(programId, "u_ModelView");
// 5. 给shader 参数设置数据
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VFVertex), (const GLvoid *)offsetof(VFVertex, position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(VFVertex), (const GLvoid *)offsetof(VFVertex, color));
}
- (void)drawAndRender{
// 1. use program
glUseProgram(programId);
// 2. transform
//FIXME: 这个不懂参数什么意思,如何取到的?
self.modelPostion = GLKVector3Make(0, -0.5, -5);
[self tansform];
glViewport(0, 0, self.renderSize.width, self.renderSize.height);
//FIXME: 这个不懂为什么设置?
glDepthRangef(0, 1);
// 3. clear old cached
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 4. open depth test
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
// 5. draw
glBindRenderbuffer(GL_RENDERBUFFER, colorRboId);
//The glBindBuffer command is used to make a buffer object the current array buffer object or the current element array buffer object.
// glBindBuffer(GL_ARRAY_BUFFER, vboId);
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_BYTE, indices);
// 6. render
[self.ctx presentRenderbuffer:GL_RENDERBUFFER];
}