2014-03-01 93 views
3

我很難找到任何示例如何正確使用核心圖像與GLKView爲了順利呈現核心圖像「食譜」響應用戶輸入。所以,在閱讀Core Image Programming GuideGLKView class reference之後,我提出了一種可行的方法。但是,我不確定它是否有效,所以我希望有人能夠確認它沒問題,或者指出我有更好的方向。核心圖像與GLKView

現在,我正在使用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分析工具模板後我開始懷疑它。它標記這個問題行:

多情境渲染用途沒有同花順: 渲染#2 - 你的應用程序中使用已在不同的上下文中被更新,而後續的刷新操作的渲染對象。

GLKViewCIContext都設置了相同的EAGLContext,所以我不太知道什麼是錯誤消息指。任何有識之士都非常感謝!

+1

據我所知,你的代碼是一樣好,因爲它可以得到。正如您已經注意到的那樣,您正在使用您的視圖所繪製的同一個GL上下文創建CI上下文,並且該警告特別涉及在另一個上下文中採取的操作。我的猜測是CI會創建自己的私有GL上下文(使用與您傳入的上下文相同的共享組),在其中完成所有工作,並在完成時不進行清理。 (Ewww。)[歸檔錯誤](http://bugreport.apple.com)可能是一個好主意。 – rickster

+0

感謝您的參與,@ rickster!我會繼續並提交一個錯誤。 – gilby

+0

@gilby你有沒有想過出了什麼問題。對於幾乎相同的代碼,我遇到了同樣的問題。 – otusweb

回答

0

我已經用glkview成功完成了這個任務。它使用OpenGL感知視圖自動設置緩衝區。根本不需要緩衝區代碼,實際上如果設置正確,glkview需要大約3行代碼。該應用程序很混亂,因爲它會自動爲您設置緩衝區,然後創建第二個緩衝區,並且不會爲每個幀導致衝突,從而導致很多內存問題。看起來你也在創建多個上下文,這也是一個不行。閱讀CIImage編程指南。我有一個使用glkview實時調整圖像的UISlider。你所需要做的就是從CIContext初始化glkview,bindDrawable,drawImage。確保您的CIContext使用EaglContext進行初始化。你對一件事是正確的......文件不存在。祝你好運。