小编Srđ*_*đan的帖子

将CIFilter应用于OpenGL渲染到纹理

我正在尝试在我的全屏渲染输出上应用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)

opengl-es core-image ios

11
推荐指数
1
解决办法
2409
查看次数

viewWillTransitionToSize:withTransitionCoordinator:当app进入后台或处于非活动状态时调用

viewWillTransitionToSize:withTransitionCoordinator:当应用程序进入后台或从iOS 9开始处于非活动状态时,该方法似乎被多次调用.

例如,如果应用程序位于iPad上的纵向,则按主页按钮将使应用程序首先接收方法调用,大小为1024x768(横向),然后是768x1024(返回纵向).这让我得出结论,iOS这样做是为了获取应用切换器的屏幕截图.

我们的应用程序逻辑取决于屏幕大小和屏幕大小的更改触发任务,这些任务会根据新大小更新我们的模型.我们需要在用户旋转设备或进入多任务模式(拆分视图)时执行此操作,但是当用户进入后台时我们不能这样做.

一个想法是使用UIApplicationWillResignActiveNotification通知,但事实证明这是不可能完成的任务,因为有时viewWillTransitionToSize:withTransitionCoordinator:在发送通知之前调用它,而在发送通知之后它会被调用:

有任何想法吗?

cocoa-touch uikit ios ios9

10
推荐指数
1
解决办法
2187
查看次数

可以dispatch_async中断调用任务

假设我将一个任务异步调度到一个队列:

{
    // 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的同一队列,它会有什么不同吗?

objective-c grand-central-dispatch ios swift

4
推荐指数
1
解决办法
434
查看次数