我很难找到任何关于如何正确使用 Core Image 的示例,GLKView
以便平滑地渲染 Core Image “食谱”以响应用户输入。因此,在阅读了Core Image Programming Guide和GLKView
class reference之后,我想出了一个可行的方法。但是,我不确定它是否有效,所以我希望有人可以确认它没问题,或者为我指明一个更好的方向。
现在,我正在使用 aGLKView
和 a GLKViewController
。将GLKView
绘图委托给其父视图控制器,该控制器实现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 模板后我开始怀疑它。它用这个问题标记了这条线:
没有刷新的多上下文渲染缓冲区使用:渲染缓冲区 #2 - 您的应用程序使用了已在不同上下文中更新的渲染缓冲区对象,而没有后续的刷新操作。
MyGLKView
和CIContext
都设置了相同的EAGLContext
,所以我不太确定错误消息指的是什么。非常感谢任何见解!