无法制作完整的帧缓冲区对象 8cd6(iOS,以编程方式创建的 OpenGL 视图)

发布于 2024-12-28 12:14:27 字数 2236 浏览 3 评论 0原文

我在让以编程方式创建的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

高跟鞋的旋律 2025-01-04 12:14:27

感谢上面的两位用户,我已经把它整理好了,他们帮助我意识到了一些事情。

我将缓冲区的创建移出了类的 init 函数,并创建了两个新函数:

-(void) destroyFrameBuffer
{
    // Tear down GL
    if (defaultFramebuffer)
    {
        glDeleteFramebuffersOES(1, &defaultFramebuffer);
        defaultFramebuffer = 0;
    }

    if (colorRenderbuffer)
    {
        glDeleteRenderbuffersOES(1, &colorRenderbuffer);
        colorRenderbuffer = 0;
    }
}

-(void) createFrameBuffer
{
    // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    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);
}

然后,我在 resizeFromLayer 函数的开头添加了对这些函数的调用:

[self destroyFrameBuffer];
[self createFrameBuffer];

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:

-(void) destroyFrameBuffer
{
    // Tear down GL
    if (defaultFramebuffer)
    {
        glDeleteFramebuffersOES(1, &defaultFramebuffer);
        defaultFramebuffer = 0;
    }

    if (colorRenderbuffer)
    {
        glDeleteRenderbuffersOES(1, &colorRenderbuffer);
        colorRenderbuffer = 0;
    }
}

-(void) createFrameBuffer
{
    // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    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);
}

I then added calls to these at the beginning of the resizeFromLayer function:

[self destroyFrameBuffer];
[self createFrameBuffer];
古镇旧梦 2025-01-04 12:14:27

我刚刚在我正在处理的项目上遇到了同样的问题

打印的错误是:

无法将 EAGLDrawable 绑定:到 GL_RENDERBUFFER 1

无法制作完整的帧缓冲区对象 8cd6

要解决此问题,我必须确保仅在其 self.window 不为 nil 时将视图标记为重绘

我正在使用 GLKView 和我自己的 CADisplayLink

I've just had the same problem on a project I'm working on

The error printed is:

Failed to bind EAGLDrawable: to GL_RENDERBUFFER 1

Failed to make complete framebuffer object 8cd6

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 own CADisplayLink

青瓷清茶倾城歌 2025-01-04 12:14:27

我正在使用 Cocos2d v2.x
我使用上述解决方案创建了我的解决方案,解决了我的类似问题:

 -(void) destroyFrameBuffer
 {
   // Tear down GL
    if (_defaultFramebuffer)
    {
       glDeleteFramebuffers(1, &_defaultFramebuffer);
       _defaultFramebuffer = 0;
    }

    if (_colorRenderbuffer)
    {
       glDeleteRenderbuffers(1, &_colorRenderbuffer);
       _colorRenderbuffer = 0;
    }


 }

 -(void) createFrameBuffer
 {
    // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    glGenFramebuffers(1, &_defaultFramebuffer);
    NSAssert( _defaultFramebuffer, @"Can't create default frame buffer");

    glGenRenderbuffers(1, &_colorRenderbuffer);
    NSAssert( _colorRenderbuffer, @"Can't create default render buffer");

    glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);

}

- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer
{

    [self destroyFrameBuffer];
    [self createFrameBuffer];
    etc.....

I am using Cocos2d v2.x
I used the above solution to create my solution, that solved my simliar issue:

 -(void) destroyFrameBuffer
 {
   // Tear down GL
    if (_defaultFramebuffer)
    {
       glDeleteFramebuffers(1, &_defaultFramebuffer);
       _defaultFramebuffer = 0;
    }

    if (_colorRenderbuffer)
    {
       glDeleteRenderbuffers(1, &_colorRenderbuffer);
       _colorRenderbuffer = 0;
    }


 }

 -(void) createFrameBuffer
 {
    // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    glGenFramebuffers(1, &_defaultFramebuffer);
    NSAssert( _defaultFramebuffer, @"Can't create default frame buffer");

    glGenRenderbuffers(1, &_colorRenderbuffer);
    NSAssert( _colorRenderbuffer, @"Can't create default render buffer");

    glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);

}

- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer
{

    [self destroyFrameBuffer];
    [self createFrameBuffer];
    etc.....
无所的.畏惧 2025-01-04 12:14:27

在花了很多时间之后,我找到了“无法制作完整的帧缓冲区对象”的解决方案,我正在 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!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文