2015-07-28 58 views
0

我使用GPUImageFilterGroup將一些過濾器應用於圖像。所有過濾器穩定(所有參數不變),但最後過濾可變(一些參數改變)。更新GPUImageFilterGroup中的一個過濾器而不重繪所有過濾器

我需要在最後一次過濾器更改後重新繪製圖像。

現在我打電話給processImage來源GPUImagePicture,但是這個調用重畫了所有的過濾器,速度太慢了。

如何重繪組中的最後一個過濾器?我認爲,我應該在最後一個過濾器繪製之前保存一個幀緩衝區的副本,並且當我更改了最後一個過濾器中的某個參數時,我應該使用保存的幀緩衝區來重繪最後一個過濾器。但我找不到如何保存幀緩衝區的副本。

回答

1

我解決了這個,通過繼承GPUImageFilter和GPUImageFilterGroup。 在GPUImageFilter我重載方法

- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex 
<...> 

[self renderToTextureWithVertices:imageVertices textureCoordinates:[[self class] textureCoordinatesForRotation:inputRotation]]; 
_bufferCallback(self); 
[self informTargetsAboutNewFrameAtTime:frameTime]; 
<...> 

在GPUImageFilterGroup我重載的方法:從preLast濾波器

- (void)addFilter:(GPUImageOutput<GPUImageInput> *)newFilter 
{ 
    NSParameterAssert([newFilter isKindOfClass: [FAEShiftFilterWithBackOutputBuffer class]]); 
    if ([newFilter isKindOfClass:[FAEShiftFilterWithBackOutputBuffer class]]) 
    { 
     __weak typeof(self) selfWeak = self; 
     [(FAEShiftFilterWithBackOutputBuffer*)newFilter setOutputBufferCallback:^(FAEShiftFilterWithBackOutputBuffer *sender) { 
     __strong typeof(selfWeak) selfStrong = selfWeak; 
     if (selfStrong) 
     { 
      if (!selfStrong.lastFramebuffer) 
      { 
       if ([selfStrong isPreLastFilter:sender]) 
       { 
        selfStrong.lastFramebuffer = [sender framebufferForOutput]; 
        [selfStrong.lastFramebuffer lock]; 
       } 
      } 
     } 
    }]; 
} 
[super addFilter:newFilter]; 
} 

這種方法存儲outputFrameBuffer。 和方法:在dealloc中和forceProcessingAtSize和forceProcessingAtSizeRespectingAspectRatio方法

- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex 
{ 
    if (self.filterCount > 1) 
    { 
    if (self.lastFramebuffer) 
    { 
     GPUImageFilter* lastFilter = (GPUImageFilter*)self.terminalFilter; 
     [lastFilter setInputFramebuffer:self.lastFramebuffer atIndex:0]; 
     [lastFilter newFrameReadyAtTime:frameTime atIndex:textureIndex]; 
    } 
    else 
    { 
     [super newFrameReadyAtTime:frameTime atIndex:textureIndex]; 
    } 
} 
else 
{ 
    [super newFrameReadyAtTime:frameTime atIndex:textureIndex]; 
} 
} 

我也復位保存幀緩衝。

- (void)_clearLastFrameBuffer 
{ 
if (_lastFramebuffer) 
{ 
    [_lastFramebuffer unlock]; 
    _lastFramebuffer = nil; 
} 
} 
相關問題