Flutter+Metal实现图像处理详细流程

背景

在之前自制的图像处理App中,使用了OpenGL处理图片,这次使用Metal替代OpenGL,来达到更好的性能,顺便熟悉一下Metal的渲染流程

基本思路

Flutter使用CVPixelBuffer和iOS交互,我们可以直接使用CVPixelBuffer创建MTLTexture,然后将MTLTexture设置为渲染目标。这样Metal框架可以直接将渲染结果写入CVPixelBuffer,达到更加高效的目的。

Metal环境设置

主要初始化DevicePipelineStateCommandQueue三个对象。我们需要依赖Device分配各种Metal资源,PipelineState管理着渲染流水线的各个环节的配置,比如vertex shader,fragment shader,输出像素格式等。CommandQueue用于管理执行的绘制命令。

_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创建MTLTexture纹理

首先创建一个CVPixelBuffer对象

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

利用CVMetalTextureCacheCreateTextureFromImageCVPixelBuffer创建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获得一个CommandBuffer,用于保存需要执行的绘制命令

_activeCmdBuffer = [_commandQueue commandBuffer];

创建MTLRenderPassDescriptor设置本次绘制的相关配置,比如绘制到哪里,这里指定通过CVPixelBuffer创建出来的MTLTexture,是否清除当前内容,清除的颜色

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

通过CommandBufferMTLRenderPassDescriptor创建一个MTLRenderCommandEncoder

_activeEncoder = [_activeCmdBuffer renderCommandEncoderWithDescriptor:renderPassDesc];

指定MTLRenderCommandEncoder所在的PipelineState

[_activeEncoder setRenderPipelineState:_pipelineState];

使用MTLRenderCommandEncoder绑定BufferTexture,在Metal里,Uniform和Vertex Buffer 都是通过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];

显式的结束MTLRenderCommandEncoder

[_activeEncoder endEncoding];

提交CommandBuffer

[_activeCmdBuffer commit];

等待绘制结束,如果你想要异步等待,需要在[_activeCmdBuffer commit]之前设置completedHandler

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

到此绘制的内容就已经在CVPixelBuffer中了,再将CVPixelBuffer提交给Flutter显示即可

到此这篇关于Flutter+Metal实现图像处理的文章就介绍到这了,更多相关Flutter图像处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Flutter使用NetworkImage实现图像显示效果

    使用 NetworkImage 显示图像 在 GitHub 中,每个成员都有其头像的 URL.您的下一个改进是将该头像添加到Member课程中并在应用程序中显示这些头像. 更新Member以添加avatarUrl属性.它现在应该是这样的: class Member { Member(this.login, this.avatarUrl); final String login; final String avatarUrl; } 由于avatarUrl现在是必需参数,因此 Flutter 在_l

  • Flutter+Metal实现图像处理详细流程

    背景 在之前自制的图像处理App中,使用了OpenGL处理图片,这次使用Metal替代OpenGL,来达到更好的性能,顺便熟悉一下Metal的渲染流程 基本思路 Flutter使用CVPixelBuffer和iOS交互,我们可以直接使用CVPixelBuffer创建MTLTexture,然后将MTLTexture设置为渲染目标.这样Metal框架可以直接将渲染结果写入CVPixelBuffer,达到更加高效的目的. Metal环境设置 主要初始化Device,PipelineState,Comm

  • Ubuntu上使用Netdata设置实时性能监控的详细流程

    介绍 Netdata通过可扩展的Web仪表板提供准确的性能监控,可以显示Linux系统上的流程和服务.它监控有关CPU,内存,磁盘,网络,进程等的指标. Netdata一旦安装就不需要额外的配置,但提供了重要的定制.该应用程序的效率和速度旨在与本机控制台管理工具(如vmstat,iostat和htop)相媲美. 本教程中的步骤涵盖了使用其内置Web服务器或可选地使用Nginx成功设置运行Netdata的一台Ubuntu 16.04服务器所需的一切. 准备 要学习本教程,您需要: 一个Ubuntu

  • 设置Mysql5.6允许外网访问的详细流程分享

    最近部署mysql5.6,发现默认mysql只允许本地提供服务,如果要进行若干配置,记录如下. 一.设置MySQL服务允许外网访问 修改mysql的配置文件,有的是my.ini(windows),有的是my.cnf(linux), 在配置文件中增加 [mysqld] port=3306 bind-address=0.0.0.0 然后重新启动mysql服务,执行service mysql restart. 二.设置mysql用户支持外网访问 需要使用root权限登录mysql,更新mysql.us

  • Windows程序打包脚本[bat]的详细流程

    打包脚本的流程和自动打包基本相同: 1. 编译软件 2. 拷贝需要的内容 3. 代码签名 4. 打包成安装文件 5. 再次签名,并将安装文件名称改成需要的格式 ------------------------------------------------------------------ 编译软件需要初始化vs的运行环境,如 call "D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat"

  • 小程序接入腾讯位置服务的详细流程

    最近在写微信小程序,遇到了一些坑,在网上也查了好多,感觉都没有我想要的答案,在这里总结下,希望可以帮助大家 第一步:进入腾讯位置服务 第二步:点击接入指引 根据上图进行登录,然后验证手机和邮箱,再前往申请秘钥(key) 以上步骤完成后: 进入key的申请页面: 重点提示:小程序不需要在WebServiceAPI填写域名,否则会报错 完成后便可以在小程序里面使用,以下则是在小程序的写入流程, 首先下载腾讯位置服务SDK 下载完后放到你方便调用的文件里面,我的是放在util.js里面. 然后引入到j

  • Spring SpringMVC,Spring整合MyBatis 事务配置的详细流程

    整合思路 (1)SSM是什么? Spring,SpringMVC,Mybastis (2)思路 搭建整合的环境,初始化环境 搭建Spring环境,配置完成并测试 (service层) 再使用Spring整合MyBatis框架,并测试(Dao层) 最后使用Spring整合SpringMVC框架,并测试(web层) SSM搭建环境 (1)数据库创建ssm (2)创建maven工程 (3)git (创建.gitignore来过滤不用提交的文件) (4)依赖框架 (5)log4j.properties

  • 如何用Python中Tushare包轻松完成股票筛选(详细流程操作)

    本文包括安装以及调用Tushare包的详细流程操作 一.Tushare简介 Tushare是Python中一个十分好用的免费调用股票数据的接口包.运用tushare可以很轻松的调取各种股票数据. 网址:https://tushare.pro/register?reg=427001 可以调取的数据包括但不仅限于: 二.安装tushare Windows系统直接在terminal输入以下代码 pip install tushare Mac在terminal输入 pip3 install tushar

  • R语言及其IDE(RStudio)下载安装详细流程

    R语言是一个统计计算软件,其IDE是RStudio,两者的关系类似Python和Pycharm,Latex和TeXstudio.IDE的功能就是为了让软件的界面更好看,更方便使用的. R语言软件官网:https://www.r-project.org/ 步骤1: 安装R语言,打开官网--download R--0-Cloud--Download R for windows--选择base 对应的install R for the first time--Download R 4.0.3 for

  • IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码详细流程

    推荐教程 idea2021以下最新安装j ihuo 教程 https://www.jb51.net/article/184631.htm https://www.jb51.net/article/178193.htm 正文 IDEA,我使用的是最新版本(2021.1.1) JDK1.8 tomcat-8 详细步骤,用图片代替,关键地方,字幕解释. 到此步骤,是关键重点,请认真看 鼠标右键选择项目(soap-demo)然后请看图片 当改完之后,项目结构,会发生改变 创建-服务端-生成代码 1.请提

  • docker部署蜗牛影院系统详细流程分析

    环境声明 宿主机OS: Cetnos7.9 最小化安装 docker Version: 20.10.6 系统要求硬件配置: CPU2核以上,内存8G cpu核心数低于2核,影院端将无法登录 mysql数据库: mysql5.6 容器 redis数据库: redis4.0 容器 安装centos7.9 先停止防火墙和关闭SELinux 查看防火墙状态 firewall-cmd --state #或 systemctl status firewalld.service 停止firewall syst

随机推荐