我一直有一个问题让我的程序化创建的OpenGL视图在某些iOS版本/设备上工作。它似乎是越狱设备上最常见的,但也发生在普通设备上。它似乎只是v4.1或4.2.1,它失败了。未能完成framebuffer对象8cd6(iOS,以编程方式创建OpenGL视图)
我拥有的设备是越狱(这不是我的,当然不是我的选择越狱!),并有iOS的v4.1(8B117)。
错误是8cd6,这意味着它未能附加framebuffer(或沿着这些行的东西)。
我已经搜索和搜索,但没有找到其他解决方案的帮助。他们中的大多数也使用深度缓冲区,但我的纯粹是2D,没有深度缓冲区。
这是我如何创建缓冲区:
glGenFramebuffersOES(1, &defaultFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
其他设置值:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glViewport(0, 0, rect.size.width, rect.size.height);
glDisable(GL_DEPTH_TEST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND_SRC);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
int* mts = calloc(1, sizeof(int));
glGetIntegerv(GL_MAX_TEXTURE_SIZE, mts);
resizeFromLayer:
-(BOOL) resizeFromLayer: (CAEAGLLayer*) _layer
{
// Allocate color buffer backing based on the current layer size
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
NSLog(@"Layer Bounds: %f x %f", _layer.bounds.size.width, _layer.bounds.size.height);
NSLog(@"Layer Position: %f x %f", _layer.bounds.origin.x, _layer.bounds.origin.y);
if(![context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable: _layer])
{
NSLog(@"renderBufferStorage failed!");
}
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
NSLog(@"Backing: %d x %d", backingWidth, backingHeight);
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
{
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
return YES;
}
这行 “无法做出完整的帧缓冲区对象” 是被错误代码8cd6调用。
您可能尝试向'glGetError()'添加一些调用,以查看该调用之前的所有内容是否成功。 – user1118321
8CD6('GL_FRAMEBUFFER_INCLOMPLETE_ATTACHMENT')并不意味着它“无法附加帧缓冲区”(无论你是什么意思),但其附件之一(纹理或渲染缓冲区绑定到颜色或深度附件)是不完整的。所以它似乎是以某种方式破坏了渲染缓冲存储器。 –
你确定在调用'glCheckFramebufferStatus'时绑定了正确的FBO吗? –