让我们说我有一些C ++代码可以在OpenGL ES中呈现内容。这段代码有自己的渲染循环,在所有平台上都是一样的。操作系统依赖并且必须分别为每个平台编写的一件事是创建一个链接到OpenGL上下文的窗口,然后用于绘图。我使用GLKView
作为UIWindow
的子视图,但是从我注意到的第一次尝试无效渲染结果的所有内容都是黑屏。< / p>
然后循环的下一次迭代渲染得很好。为了更清楚地看到问题,这是一个行为相似的最小代码:
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()
清除缓冲区并绘制一个traingle。第一个调用结果为GL_INVALID_FRAMEBUFFER_OPERATION
,而performSelector:afterDelay:
调用的调用结果很好。这可能意味着GLKView
推迟了它的渲染缓冲区的创建。
我真的不想等待第一次渲染,而是能够立即绘制到创建的上下文。 Here是显示问题的整个演示项目。
答案 0 :(得分: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];