最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter+Metal實(shí)現(xiàn)圖像處理詳細(xì)流程

 更新時(shí)間:2022年06月18日 09:25:00   作者:handyTool  
Flutter使用CVPixelBuffer和iOS交互,我們可以直接使用CVPixelBuffer創(chuàng)建MTLTexture,然后將MTLTexture設(shè)置為渲染目標(biāo),這篇文章主要介紹了Flutter+Metal實(shí)現(xiàn)圖像處理,需要的朋友可以參考下

背景

在之前自制的圖像處理App中,使用了OpenGL處理圖片,這次使用Metal替代OpenGL,來(lái)達(dá)到更好的性能,順便熟悉一下Metal的渲染流程

基本思路

Flutter使用CVPixelBuffer和iOS交互,我們可以直接使用CVPixelBuffer創(chuàng)建MTLTexture,然后將MTLTexture設(shè)置為渲染目標(biāo)。這樣Metal框架可以直接將渲染結(jié)果寫入CVPixelBuffer,達(dá)到更加高效的目的。

Metal環(huán)境設(shè)置

主要初始化DevicePipelineState,CommandQueue三個(gè)對(duì)象。我們需要依賴Device分配各種Metal資源,PipelineState管理著渲染流水線的各個(gè)環(huán)節(jié)的配置,比如vertex shader,fragment shader,輸出像素格式等。CommandQueue用于管理執(zhí)行的繪制命令。

_device = MTLCreateSystemDefaultDevice();
id<MTLLibrary> lib = [_device newDefaultLibrary];
id<MTLFunction> vertexFunc = [lib newFunctionWithName:vertexFuncName];
id<MTLFunction> fragFunc = [lib newFunctionWithName:fragFuncName];
MTLRenderPipelineDescriptor *renderPipelineDesc = [MTLRenderPipelineDescriptor new];
renderPipelineDesc.vertexFunction = vertexFunc;
renderPipelineDesc.fragmentFunction = fragFunc;
renderPipelineDesc.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm;
_pipelineState = [_device newRenderPipelineStateWithDescriptor:renderPipelineDesc error:nil];
_commandQueue = [_device newCommandQueue];

從CVPixelBuffer創(chuàng)建MTLTexture紋理

首先創(chuàng)建一個(gè)CVPixelBuffer對(duì)象

NSDictionary *pixelAttributes = @{( id )kCVPixelBufferIOSurfacePropertiesKey : @{}};
CVPixelBufferCreate(
            kCFAllocatorDefault,
                    imageWidth,
                    imageHeight,
            kCVPixelFormatType_32BGRA,
                    (__bridge CFDictionaryRef)pixelAttributes,
                    &_renderTargetPixelBuffer);

利用CVMetalTextureCacheCreateTextureFromImageCVPixelBuffer創(chuàng)建MTLTexture

CVReturn ret = CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, _mtContext.device, nil, &_textureCache);
CVMetalTextureRef renderTargetMetalTextureRef;
ret = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _textureCache, _renderTargetPixelBuffer, nil, MTLPixelFormatBGRA8Unorm, imageWidth, imageHeight, 0, &renderTargetMetalTextureRef);
id<MTLTexture> mtlTexture = CVMetalTextureGetTexture(renderTargetMetalTextureRef);

渲染到紋理

CommandQueue獲得一個(gè)CommandBuffer,用于保存需要執(zhí)行的繪制命令

_activeCmdBuffer = [_commandQueue commandBuffer];

創(chuàng)建MTLRenderPassDescriptor設(shè)置本次繪制的相關(guān)配置,比如繪制到哪里,這里指定通過(guò)CVPixelBuffer創(chuàng)建出來(lái)的MTLTexture,是否清除當(dāng)前內(nèi)容,清除的顏色

MTLRenderPassDescriptor *renderPassDesc = [MTLRenderPassDescriptor new];
renderPassDesc.colorAttachments[0].texture = target;
renderPassDesc.colorAttachments[0].loadAction = MTLLoadActionClear;
renderPassDesc.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 1);

通過(guò)CommandBufferMTLRenderPassDescriptor創(chuàng)建一個(gè)MTLRenderCommandEncoder

_activeEncoder = [_activeCmdBuffer renderCommandEncoderWithDescriptor:renderPassDesc];

指定MTLRenderCommandEncoder所在的PipelineState

[_activeEncoder setRenderPipelineState:_pipelineState];

使用MTLRenderCommandEncoder綁定BufferTexture,在Metal里,Uniform和Vertex Buffer 都是通過(guò)MTLBuffer綁定到Shader中

[_activeEncoder setVertexBuffer:vertexBuffer offset:0 atIndex:0];
[_activeEncoder setFragmentBuffer:uniformBuffer offset:0 atIndex:0];
[_activeEncoder setFragmentBuffer:texture offset:0 atIndex:0];

繪制圖形

[_activeEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:vertexCount instanceCount:1];

顯式的結(jié)束MTLRenderCommandEncoder

[_activeEncoder endEncoding];

提交CommandBuffer

[_activeCmdBuffer commit];

等待繪制結(jié)束,如果你想要異步等待,需要在[_activeCmdBuffer commit]之前設(shè)置completedHandler

// 同步等待
[_activeCmdBuffer waitUntilCompleted];
// 異步等待
[_activeCmdBuffer addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull buf) {
}];

到此繪制的內(nèi)容就已經(jīng)在CVPixelBuffer中了,再將CVPixelBuffer提交給Flutter顯示即可。

到此這篇關(guān)于Flutter+Metal實(shí)現(xiàn)圖像處理的文章就介紹到這了,更多相關(guān)Flutter圖像處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

衡东县| 房产| 吉木萨尔县| 郓城县| 定远县| 宜良县| 柯坪县| 天峻县| 庆城县| 土默特左旗| 遵义市| 遵义市| 乌拉特后旗| 汪清县| 福海县| 南澳县| 宁晋县| 友谊县| 辽中县| 潼关县| 潜江市| 抚州市| 拜城县| 长乐市| 昔阳县| 犍为县| 石台县| 兴义市| 固阳县| 潍坊市| 陆川县| 岫岩| 曲沃县| 昌邑市| 北安市| 临湘市| 中山市| 论坛| 贵定县| 黄石市| 伊金霍洛旗|