【问题标题】:Core Image with GLKView带有 GLKView 的核心图像
【发布时间】:2014-04-02 07:14:08
【问题描述】:

我很难找到任何关于如何正确使用 Core Image 和 GLKView 的示例,以便平滑地呈现 Core Image “食谱”以响应用户输入。所以,在阅读了Core Image Programming GuideGLKView class reference 之后,我想出了一个可行的方法。但是,我不确定它是否有效,所以我希望有人可以确认它没问题,或者为我指出一个更好的方向。

现在,我正在使用 GLKViewGLKViewControllerGLKView 将绘图委托给它的父视图控制器,它实现了glkView:drawInRect:。绘图方法是这样做的:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    // make glkView's background light gray instead of black
    glClearColor(backgroundRGB, backgroundRGB, backgroundRGB, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // a custom object that holds a reference to a CIContext
    ImageEditingContext* context = [ImageEditingContext getInstance];

    // apply a core image recipe
    CIImage *outputImage = [context getFilteredPreviewCIImage];

    // draw the image
    CGRect inRect = outputImage.extent;
    inRect.origin.y = (self.glkView.contentScaleFactor * self.glkView.frame.size.height - inRect.size.height) / 2.0;
    [context.coreImageContext drawImage:outputImage inRect:inRect fromRect:outputImage.extent];
}

具体来说,我关心的是最后一行[context.coreImageContext drawImage:outputImage inRect:inRect fromRect:outputImage.extent]。从glkView:drawInRect: 中调用该方法是否有效?正如我之前提到的,这种方法似乎工作正常,但在运行 OpenGL ES Analysis Instruments 模板后我开始怀疑它。它用这个问题标记了这条线:

Multi-context Renderbuffer Usage without Flush: Renderbuffer #2 - 您的应用程序使用了一个已在不同上下文中更新的渲染缓冲区对象,而没有后续的刷新操作。

我的GLKViewCIContext 都设置了相同的EAGLContext,所以我不太确定错误消息指的是什么。非常感谢任何见解!

【问题讨论】:

  • 据我所知,您的代码已尽其所能。正如您所指出的,您正在从您的视图绘制的同一 GL 上下文创建 CI 上下文,并且该警告特别与在另一个上下文中采取的操作有关。我的猜测是 CI 正在创建自己的私有 GL 上下文(使用与您传入的上下文相同的共享组),在那里完成所有工作,完成后不会刷新。 (Ewww.)Filing a bug 可能是个好主意。
  • 感谢您的观看,@rickster!我会继续提交错误。
  • @gilby 你有没有弄清楚哪里出了问题。对于几乎相同的代码,我遇到了同样的问题。
  • @otusweb 我没有,但我已经切换到 Metal,它更快!

标签: ios objective-c opengl-es core-image glkview


【解决方案1】:

我已经用 glkview 成功地完成了这个。它使用 OpenGL 感知视图自动设置缓冲区。您根本不需要缓冲区代码,实际上如果设置正确,glkview 需要大约 3 行代码。该应用程序很困惑,因为它会自动为您设置缓冲区,然后您创建第二个缓冲区并且不为每一帧刷新它,这会导致许多内存问题。看来您也在创建多个上下文,这也是不行的。阅读 CIImage 编程指南。我有一个 UISlider 可以使用 glkview 实时调整图像。您需要做的就是从 CIContext 初始化 glkview、bindDrawable、drawImage。确保你的 CIContext 是用 EaglContext 初始化的。你在一件事上是对的……文档不存在。祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多