假设我有一些在 OpenGL ES 中呈现内容的 C++ 代码。这段代码有它自己的渲染循环,在所有平台上都是一样的。依赖于操作系统并且必须为每个平台单独编写的事情之一是创建一个链接到 OpenGL 上下文的窗口,然后用于绘图。我使用GLKView
放置作为子视图,UIWindow
但从我注意到的第一次尝试渲染结果没有任何结果,一段时间内可见的只是黑屏。
然而,循环的下一次迭代渲染得很好。为了更清楚地看到问题,这里有一个行为相似的最小代码:
EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
assert(context);
GLKView *glView = [[GLKView alloc] initWithFrame:[[self window] frame] context:context];
[[self window] addSubview:glView];
[EAGLContext setCurrentContext:context];
prepareOpengl();
drawTriangle(); //GL_INVALID_FRAMEBUFFER_OPERATION
[self performSelector:@selector(drawTriangleWithContext:) withObject:context afterDelay:1.0]; //nice triangle
该prepareOpengl()
函数为顶点和诸如此类的东西创建缓冲区,并drawTraingle()
清除缓冲区并绘制一个三角形。第一次调用的结果GL_INVALID_FRAMEBUFFER_OPERATION
和被调用的调用performSelector:afterDelay:
就好了。这可能意味着GLKView
延迟创建它的渲染缓冲区。
我真的希望不必等待第一次渲染,而是能够立即绘制到创建的上下文。这是显示问题的整个演示项目。