首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >立即渲染到GLKView

立即渲染到GLKView
EN

Stack Overflow用户
提问于 2017-01-20 21:43:09
回答 1查看 744关注 0票数 0

假设我有一些在OpenGL ES中呈现内容的C++代码。这段代码有它自己的呈现循环,它在所有平台上都是一样的。依赖于操作系统并且必须为每个平台单独编写的一件事是创建一个链接到OpenGL上下文的窗口,然后用于绘图。我使用放置在UIWindow的子视图中的GLKView,但从我注意到的是,第一次尝试渲染结果时没有任何结果,并且暂时只能看到一个黑屏。

然而,循环的下一次迭代呈现得很好。为了更清楚地看到这个问题,这里有一个行为类似的最小代码:

代码语言:javascript
复制
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推迟了它的renderbuffer的创建。

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

EN

回答 1

Stack Overflow用户

发布于 2017-01-20 22:19:10

我想我明白了。诀窍是在创建GLKView之后显式地调用它的bindDrawable。这反过来会强制创建renderbuffer。

它应该是这样的:

代码语言:javascript
复制
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];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41765099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档