Неверный initWithFrame.Вы хотите создать кадровый буфер и рендер-буфер и связать их.Вместо этого вы генерируете два кадровых буфера и полностью игнорируете один.Вы также должны хранить ссылки на них (переменные 'renderbuffer' и 'framebuffer') в своем классе, так как вам нужно будет удалить их позже, если вы не хотите утечки памяти.
Без устранения второй проблемыЯ рекомендую:
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
CAEAGLLayer* eaglLayer = (CAEAGLLayer*) super.layer;
eaglLayer.opaque = YES;
m_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!m_context || ![EAGLContext setCurrentContext:m_context]) {
[self release];
return nil;
}
// these should be in the class so that we can release them later,
// this will leak resources
GLuint framebuffer, renderbuffer;
// generate and bind a framebuffer
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
// generate a colour renderbuffer; this example doesn't seem to want
// e.g. a depth buffer, but if it did then you'd generate and add one
// of those here also
// generate and bind
glGenRenderbuffersOES(1, &renderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderbuffer);
// get storage from the layer
[m_context
renderbufferStorage:GL_RENDERBUFFER_OES
fromDrawable: eaglLayer];
// link to the framebuffer
glFramebufferRenderbufferOES(
GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
GL_RENDERBUFFER_OES, renderbuffer);
glViewport(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));
[self drawView];
}
return self;
}
Поместите framebuffer и renderbuffer туда, где вы можете получить их снова в соответствующий момент, и вы также должны:
- (void)dealloc {
if(renderbuffer) glDeleteRenderbuffersOES(1, &renderbuffer);
if(framebuffer) glDeleteFramebuffersOES(1, &framebuffer);
if ([EAGLContext currentContext] == m_context) {
[EAGLContext setCurrentContext:nil];
}
[m_context release];
[super dealloc];
}
Я проверил это на кодВы предоставляете.Я получаю серый экран.Изменение вызова glClearColor меняет цвет экрана, поэтому ясно, что контекст GL работает.