我正在尝试在我的全屏渲染输出上应用CoreImage滤镜,但看起来我错过了一些东西,因为我将黑屏作为输出.
首先,我将整个场景绘制为纹理.然后我从那个纹理创建CoreImage,我最终绘制并呈现.但我得到的只是黑屏.我正在关注绘制纹理并将CoreImage与OpenGLES集成的Apple指南:WWDC2012 511和https://developer.apple.com/library/ios/documentation/3ddrawing/conceptual/opengles_programmingguide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html
这是相关代码:
渲染:
@interface Renderer () {
EAGLContext* _context;
GLuint _defaultFramebuffer, _drawFramebuffer, _depthRenderbuffer, _colorRenderbuffer, _drawTexture;
GLint _backingWidth, _backingHeight;
CIImage *_coreImage;
CIFilter *_coreFilter;
CIContext *_coreContext;
}
Run Code Online (Sandbox Code Playgroud)
初始化方法:
- (BOOL)initOpenGL
{
_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!_context) return NO;
[EAGLContext setCurrentContext:_context];
glGenFramebuffers(1, &_defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
glGenRenderbuffers(1, &_colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);
glGenFramebuffers(1, &_drawFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _drawFramebuffer);
glGenTextures(1, &_drawTexture);
glBindTexture(GL_TEXTURE_2D, _drawTexture);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _drawTexture, 0);
glGenRenderbuffers(1, &_depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderbuffer);
_coreFilter = [CIFilter filterWithName:@"CIColorInvert"]; …Run Code Online (Sandbox Code Playgroud) viewWillTransitionToSize:withTransitionCoordinator:当应用程序进入后台或从iOS 9开始处于非活动状态时,该方法似乎被多次调用.
例如,如果应用程序位于iPad上的纵向,则按主页按钮将使应用程序首先接收方法调用,大小为1024x768(横向),然后是768x1024(返回纵向).这让我得出结论,iOS这样做是为了获取应用切换器的屏幕截图.
我们的应用程序逻辑取决于屏幕大小和屏幕大小的更改触发任务,这些任务会根据新大小更新我们的模型.我们需要在用户旋转设备或进入多任务模式(拆分视图)时执行此操作,但是当用户进入后台时我们不能这样做.
一个想法是使用UIApplicationWillResignActiveNotification通知,但事实证明这是不可能完成的任务,因为有时viewWillTransitionToSize:withTransitionCoordinator:在发送通知之前调用它,而在发送通知之后它会被调用:
有任何想法吗?
假设我将一个任务异步调度到一个队列:
{
// we are on main queue
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
print("task B")
});
print("task A")
// some long running work
print("task A")
// some long running work
print("task A")
...
}
Run Code Online (Sandbox Code Playgroud)
可以在任何情况下调度任务中断发送它的任务吗?换句话说,在打印所有"任务A"之前,是否会发生"任务B"的打印?
task A
task B
task A
task A
...
Run Code Online (Sandbox Code Playgroud)
或GCD将保证:
task A
task A
task A
...
task B
Run Code Online (Sandbox Code Playgroud)
如果将任务分派到调用dispatch_async的同一队列,它会有什么不同吗?