无法制作完整的帧缓冲区对象 8cd6(iOS,以编程方式创建的 OpenGL 视图)
我在让以编程方式创建的 OpenGL 视图在某些 iOS 版本/设备上运行时遇到问题。这似乎在越狱设备上最常见,但在普通设备上也会发生。似乎只有 v4.1 或 4.2.1 才会失败。
我的设备已越狱(这不是我的,当然也不是我选择越狱的!)并且装有 v4.1 (8B117) 的 iOS。
错误是 8cd6,这意味着它无法附加帧缓冲区(或类似的内容)。
我搜索了又搜索,但我发现的其他解决方案都没有帮助。他们中的大多数也使用深度缓冲区,但我的是纯 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。
I've been having a problem getting my programmatically created OpenGL view to work on certain iOS versions/devices. It seem to be most common on Jailbroken devices, but does also happen on normal devices. It appears to only be v4.1 or 4.2.1 that it fails on.
The device I have is jailbroken (it's not mine and certainly not my choice to jailbreak it!) and has v4.1 (8B117) of iOS on it.
The error is 8cd6, which means that it failed to attach the framebuffer (or something along those lines).
I've searched and searched, but none of the other solutions I've found have helped. Most of them are using a depth buffer too, but mine is purely 2D and has no depth buffer.
Here's how I create the buffers:
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);
Other setup values:
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;
}
It's the line "Failed to make complete framebuffer object" that gets called with the error code 8cd6.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
感谢上面的两位用户,我已经把它整理好了,他们帮助我意识到了一些事情。
我将缓冲区的创建移出了类的 init 函数,并创建了两个新函数:
然后,我在 resizeFromLayer 函数的开头添加了对这些函数的调用:
I have it sorted thanks to the two users above, who helped me realise something.
I moved the creation of the buffers out of the init function of the class and created two new functions:
I then added calls to these at the beginning of the resizeFromLayer function:
我刚刚在我正在处理的项目上遇到了同样的问题
打印的错误是:
要解决此问题,我必须确保仅在其 self.window 不为 nil 时将视图标记为重绘。
我正在使用
GLKView
和我自己的CADisplayLink
I've just had the same problem on a project I'm working on
The error printed is:
To fix this I had to make sure I only mark the view for redraw while its self.window is not nil.
I am using a
GLKView
with my ownCADisplayLink
我正在使用 Cocos2d v2.x
我使用上述解决方案创建了我的解决方案,解决了我的类似问题:
I am using Cocos2d v2.x
I used the above solution to create my solution, that solved my simliar issue:
在花了很多时间之后,我找到了“无法制作完整的帧缓冲区对象”的解决方案,我正在 CCSprite 上使用屏蔽,但在初始化使屏蔽成为可能的 opengl 方法之前,我在视图中添加精灵,在添加之前,您必须添加一个 1 秒的调度程序,并在该调度程序中将您的 ccsprite 添加到视图中。
干杯!
After spending a lot of time i found solution for this "Failed to make complete framebuffer object" i am using using masking on CCSprite, but before to initialize opengl methods that make masking possible i am adding sprite in a view, before adding you have to add a scheduler of 1 second and in that scheduler add your ccsprite in a view.
Cheers!