一、建立MTKView
這裡增加了framebufferOnly設定為NO,正常預設是YES,如果不設定該參數則在執行drawInMTKView的時候調用
會提示執行錯誤
-[MTLDebugComputeCommandEncoder setTexture:atIndex:]:380: failed assertion `frameBufferOnly texture not supported for compute.'
這裡将sourceTexture通過filter的編碼commandbuffer的方法寫到了destinationTexture;由于如果不設定為NO則預設view.currentDrawable.texture隻是隻讀的情況
在建立MTKView的時候增加
建立CVMetalTextureCacheRef _textureCache,這是Core Video的Metal紋理緩存
二、由于是實時顯示攝像頭的内容,則需要從捕獲攝像頭内容到螢幕顯示這樣的一個過程
1、該過程我就把它稱之為捕獲回話AVCaptureSession;則先建立一個該會話
這裡增加了預設值1920x1080,指定了接收者(螢幕要顯示的分辨率)在攝像頭的分辨率範圍内,設定的值越大則越清晰。
2、設定攝像頭為捕獲會話輸入的裝置
這裡可以看到,先擷取所有的攝像頭,然後枚舉找到後置的攝像頭作為輸入的攝像頭。
判斷能否加入輸入裝置,再加入。
3、設定輸出到螢幕上的資料格式
由于每一針都是要按照先後順序顯示的,是以使用了線程的序列。并設定了本身為代理的類,則通過代理的協定實作對應的函數captureOutput
4、設定顯示的連接配接方向
通過輸出裝置來設定視訊相對于home鍵的方向
5、最後串聯了輸入和輸出之後則開始運作
[self.mCaptureSession startRunning];
三、captureOutput 是從輸出裝置中捕獲到的,需要對該捕獲的内容進行适當的處理為drawInMTKView需要的内容進行顯示
攝像頭回傳<code>CMSampleBufferRef</code>資料,找到<code>CVPixelBufferRef</code>,用<code>CVMetalTextureCacheCreateTextureFromImage</code>建立CoreVideo的Metal紋理緩存<code>CVMetalTextureRef</code>,最後通過<code>CVMetalTextureGetTexture</code>得到Metal的紋理;
四、每一幀的MTKView的顯示回調drawInMTKView
1、MPSImageGaussianBlur的頭檔案是#import <MetalPerformanceShaders/MetalPerformanceShaders.h>
這個是metal顯示的shader相關則需要導入該頭檔案
2、建立完成之後通過encodeToCommandBuffer 執行:Encode a MPSKernel into a command Buffer. The operation shall proceed out-of-place.
參考:https://www.jianshu.com/p/d3d698120891