0

假设我有一些在 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延迟创建它的渲染缓冲区。

我真的希望不必等待第一次渲染,而是能够立即绘制到创建的上下文。是显示问题的整个演示项目。

4

1 回答 1

0

我想我明白了。bindDrawable诀窍是在GLKView创建它之后显式调用它。这反过来又会强制创建渲染缓冲区。

应该是这样的:

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];
于 2017-01-20T14:19:10.253 回答