GPUImage移殖汇总

新项目GitHub详细地址: aoce

我是上年年末才知道有GPUImage这一新项目,之前也一直沒有在移动应用平台开发设计过,可是我还在win服务平台有撰写一个相近的新项目oeip(不必关心了,全部作用都移殖或快移殖到aoce里了),移动应用平台是必然趋势,逐渐是惦记着把oeip移殖到android服务平台上,后边发觉不实际,就立即再开新项目,重新开始,从Vulkan到CMake,再到GPUImage,开发设计主力军服务平台也从Visual Studio 2017换到VSCode了,这也算作上半年的汇总了.

Vulkan移殖GPUImage(一)高斯模糊与响应式阀值

Vulkan移殖GPUImage(二)Harris角点检验与导向性过滤

Vulkan移殖GPUImage(三)从A到C的ps滤镜

Vulkan移殖GPUImage(四)从D到O的ps滤镜

Vulkan移殖GPUImage(五)从P到Z的ps滤镜

CMake 常用命令

在Android用vulkan进行绿蓝幕扣像

android下vulkan与opengles纹路相通

Vulkan与DX11互动

PC的Vulkan计算层计算时间纪录

Vulkan移殖GPUImage的Compute Shader总目录

挑选Vulkan的Compute Shader解决管道

当时挑选Vulkan,一是愈来愈多机器设备与服务平台适用,且有单独的测算管道.

单独的测算管道在移殖GPUImage里时益处以下.

1 防止许多UV转化成类,如GPUImage里的GPUImageTwoInputFilter / GPUImageTwoInputCrossTextureSamplingFilter这些这类要不好几个键入,要不必须搜索周边点来转化成不一样UV,尤其也有好几个键入与必须附近UV融合,造成在其中GPUImage中有很多类便是用于给FS给予UV.

2 不用一个相匹配Vulkan3D渲染輸出对话框,简易而言,你能无对话框运作测算步骤,并把結果立即连接win服务平台GUI32/DX11的CPU輸出/GPU纹路,还可以在android中连接opengl es纹路,还可以便捷连接模块UE4/Unity三维.

3 测算管道能够运用部分共享资源显卡内存,部分共享资源显存有那类必须搜索附近好几个点的状况能大幅度提高特性,正常情况下而言,CS比渲染管线少PS以前的那一系列环节,全新的硬件配置应当会相比VS PS高吧?我就用vulkan/cuda/dx11(原oeip完成)较为了下运作繁杂测算管道的状况,cuda的GPU占有率最少,vulkan次之,dx11会在cuda/vulkan的二倍之上.

但是缺陷也是有,在其中有三个没移殖GPUImage的作用,在其中二个便是画好几条线的,关键便是运用VS/PS渲染管线进行,临时还没有想到好的方式 移殖,还有一个图象3D-三维多方位变换运用VS/PS渲染管线也很便捷,但是这一在单独的测算管道应当也罢做.

Vulkan数据处理方法步骤

我界定关键完成要达到二点.

  1. 测算步骤能够好几个键入/輸出,每一个连接点能够好几个I/O,每一个连接点能够关掉开启,也可关掉开启此连接点支系.

  2. 其他客户能很容易拓展自身的作用,便是自定图象处理层的作用.

第一点,我受FrameGraph|设计方案&根据DX12完成启迪,想起运用有向无环图来完成.在逐渐搭建时,连接点相互之间联接好.随后运用深度优先检索全自动清除到关掉自身/支系的连接点,取得最后的合理电极连接线,有向无环图能够依据合理电极连接线转化成恰当的实行次序,随后查验各层连接点与联接的连接点的图象种类是不是合乎,查验取得成功后就复位各层连接点的資源,如果是Vulkan控制模块,全部层資源转化成后,便会把全部运行命令添充到当今涂层的VkCommandBuffer目标中,运作时实行VkCommandBuffer纪录的命令.

在运作时,设置连接点/支系是不是可以用,及其有一些层主要参数更改会危害輸出尺寸都是会造成涂层重新启动标识打开,用标识是充分考虑升级主要参数层与实行GPU计算没有同一进程的状况,涂层下一次运作前,检验到重新启动标识打开,便会从头开始搭建.

有关源代码在PipeGraph

而第二点,为了更好地便捷客户拓展自身的层,我需要尽量的全自动健全各种各样信息内容来让客户只潜心要求完成.

针对计算层基类(BaseLayer)留意以下好多个时钟频率.

  1. onInit/onInitNode 当层被添加PipeGraph前/后各自启用,在以后,会有一个弱引用关系PipeGraph的PipeNode,一样,查验这一引入是不是合理能够了解是不是早已额外到PipeGraph上.

  2. onInitLayer 当PipeGraph转化成恰当的合理电极连接线后,依据合理电极连接线再次联接上下一层并转化成恰当实行次序后,对各计算层启用.

  3. onInitBuffer 各层键入查验相匹配联接层的輸出的图象种类是不是合乎.

  4. onFrame 每桢运作时启用.

  5. onUpdateParamet 层的主要参数升级,时钟频率单独于上边的4个点,设置规定随时随地能够启用.

有关源代码在BaseLayer

精确到Vulkan控制模块,Vulkan下的计算层基类(VkLayer)会对于BaseLayer给予更精准的Vulkan資源时钟频率.

  1. 复位,一般特定应用的shader途径,UBO尺寸,升级UBO内数据信息.默认设置觉得一个键入,一个輸出,如果是多键入与多輸出,能够在这里特定.留意键入/輸出数量一定要在额外在PipeGraph以前明确,相对应二维数组会依据这二个值转化成室内空间.

  2. onInitGraph,当vklayer被加上到VkPipeGraph时上被启用.一般用于载入shader,依据键入与輸出数量转化成pipelineLayout,如果有自身逻辑性,请override.默认设置特定I/O的的图像文件格式为rgba8,要不是,请在这里特定相匹配图像文件格式.假如层内包括其他解决层逻辑性,请在这里添上其他解决层.

  3. onInitNode,当onInitGraph后被加上到PipeGraph后启用.自身layer在onInitGraph后,onInitNode前加上到PipeGraph了,当层内包括其他层时,用于特定层内中间的数据信息怎样连接.

  4. onInitLayer,当PipeGraph依据电极连接线再次搭建恰当的实行次序后.依据各层是不是开启等,PipeGraph搭建恰当的各层实行次序,在这儿,各层都了解相匹配层数据信息的I/O层,也了解I/O层的尺寸.当今层的键入尺寸默认设置相当于第0个键入层的輸出尺寸,并特定进程组的分派尺寸,假如逻辑性必须转变,请在这儿改动.

  5. onInitVkBuffer,当全部合理层实行完后onInitLayer后,各层逐渐启用onInitBuffer,其在全自动搜索到键入层的輸出Texture,并转化成本层的輸出Texture给当今层的輸出应用后启用.假如自身有Vulkan Buffer必须解决,请在onInitVkBuffer里解决.

  6. onInitPipe,当本层实行完onInitVkBuffer后启用,在这儿,依据键入与輸出的Texture自动升级VkWriteDescriptorSet,而且转化成ComputePipeline.如果有自身的逻辑性,请override完成.

  7. onCommand 当全部层实行完onInitBuffer后,添充vkCommandBuffer,vkCmdBindPipeline/vkCmdBindDescriptorSets/vkCmdDispatch 三件套.

  8. onFrame 每桢解决时启用,一般来说,仅有键入层或輸出层override解决,用以把vulkan texture交到CPU/opengl es/dx11这些.

有关源代码在VkLayer

尽管列举有这么多,可是从我移殖GPUImage里看来,许多层尤其是混合模式这些解决,彻底一个都无需轻载,就只在复位特定下glslPath就可以了,也有很多层按上边设置只必须轻载一到二个方式 就无需管了.

在其中Vulkan涂层中,每一个涂层中包括一个VulkanContext目标,其有单独的VkCommandBuffer目标,那样能够确保每一个涂层在好几个进程互相影响,每个进程能够单独运作一个或者好几个涂层,针对cuda图层而言,每一个涂层也有一个cudaStream_t目标,保证每个进程单独运作.

在其中aoce_vulkan我界定了VkPipeGraph/VkLayer的完成,及其每个Vulkan目标的封裝,也有键入/輸出,包括RGBA<->YUV的转换这种基本上的测算层,剩下的GPUImage的全部层全在aoce_vulkan_extra进行,也算作对便捷客户拓展自身的层的一个检测,坦白说,在移殖GPUImage到aoce_vulkan_extra控制模块全过程中,我感觉之前储存的一些Vulkan专业知识早已快一不小心忘光了.

最终到这,客户完成自身的vulkan解决层,就不用懂过多vulkan专业知识就能进行,只必须写好glsl源代码,承继VkLayer,随后依据要求轻载上边的一二个涵数就可以了,热烈欢迎大伙儿在这里基本以上完成自身的计算层.

架构数据信息步骤

数据信息给予现关键包括以下三种.

  1. 监控摄像头,在win端,有aoce_win_mf控制模块给予,在android端,有aoce_android给予.

  2. 针对多媒体系统文档(当地多媒体系统,RTMP等),由aoce_FFmpeg(win/android都适用)给予编解码.

  3. 立即非缩小的图象二进制数据信息.

数据处理方法控制模块目前aoce_cuda/aoce_vulkan控制模块解决,win端现适用这二个控制模块,而android端只适用aoce_vulkan控制模块.

假如数据信息给予的是桢数据信息,相匹配监控摄像头/多媒体系统控制模块都是会分析到VideoFrame并得出回调函数,而在数据处理方法控制模块会出现InputLayer层,专业用于接受上边三种数据信息.

而解决后数据信息会依据相匹配OutputLayer必须,导出来CPU数据信息及其GPU数据信息连接相匹配系统软件常见3D渲染模块相匹配纹路上,如在win端,aoce_cuda/aoce_vulkan控制模块的OutputLayer都适用立即造成到相匹配DX11纹路,而在android上,aoce_vulkan能立即造成到相匹配opengl es纹路上,那样就能立即与相匹配模块(UE4/Unity三维)最底层开展连接.

导出来给客户启用

在分类整理了架构与构造,健全了一些內容,API应当不容易有很大的变化了,现逐渐考虑到外界客户应用.

在架构各控制模块內部,引入导出来的类不规定哪些不能用STL,终究毫无疑问你编译程序这种控制模块肯定是同样编译程序自然环境,可是假如导出来给其他客户应用,必须限定导出来的数据信息与文件格式,以确保其他客户与你不一样的编译程序自然环境也不会有什么问题.

相互配合CMake,应用install只导出来独特撰写的.h头文件给外界程序流程应用,这种头文件关键包括以下三种种类.

  1. C设计风格的构造,C设计风格导出来协助涵数,与C设计风格导出来用于建立相匹配加工厂/管理职能.

  2. 纯粹的抽像类,不包含一切STL目标构造,关键用于启用API,客户不必承继这种类.

  3. 后缀名为Observer的抽像类,客户承继对于插口解决回调函数.

评论(0条)

刀客源码 游客评论