我很难找到任何示例,说明如何通过GLKView正确使用Core Image,以便根据用户输入平滑呈现Core Image“食谱”。因此,在阅读了Core Image Programming Guide GLKView 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模板后,我对此感到怀疑。它标志着这一问题:

无需刷新的多上下文渲染缓冲区用法:
Renderbuffer#2-您的应用程序使用了一个renderbuffer对象,该对象已在其他上下文中进行了更新,而没有后续的刷新操作。

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

最佳答案

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

关于ios - 带有GLKView的核心图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22109498/

10-09 13:25