我一直有一個問題讓我的程序化創建的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嗎? –