假设我有一些在OpenGL ES中呈现内容的C++代码。这段代码有它自己的呈现循环,它在所有平台上都是一样的。依赖于操作系统并且必须为每个平台单独编写的一件事是创建一个链接到OpenGL上下文的窗口,然后用于绘图。我使用放置在UIWindow的子视图中的GLKView,但从我注意到的是,第一次尝试渲染结果时没有任何结果,并且暂时只能看到一个黑屏。
然而,循环的下一次迭代呈现得很好。为了更清楚地看到这个问题,这里有一个行为类似的最小代码:
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 triangleprepareOpengl()函数为顶点和诸如此类的东西创建缓冲区,drawTraingle()清除缓冲区并绘制训练集。第一次调用的结果是GL_INVALID_FRAMEBUFFER_OPERATION,而由performSelector:afterDelay:调用的结果绘制得很好。这可能意味着GLKView推迟了它的renderbuffer的创建。
我真的希望不必等待第一次渲染,而是能够立即绘制到创建的上下文。Here是展示这个问题的整个演示项目。
发布于 2017-01-20 22:19:10
我想我明白了。诀窍是在创建GLKView之后显式地调用它的bindDrawable。这反过来会强制创建renderbuffer。
它应该是这样的:
GLKView *glView = [[GLKView alloc] initWithFrame:[[self window] frame] context:context];
[glView bindDrawable];
[[self window] addSubview:glView];
[EAGLContext setCurrentContext:context]
prepareOpengl();
drawTriangle();
[context presentRenderbuffer:GL_RENDERBUFFER];https://stackoverflow.com/questions/41765099
复制相似问题