oeip 相关功能只能运行在window平台,想移植到android平台,暂时选择vulkan做为图像处理,主要一是里面有单独的计算管线且支持好,二是熟悉下最新的渲染技术思路。

这个 demo(git地址) 的功能很简单,在android下,利用vulkan的compute shader对输入图进行1-x的运行后,把计算结果复制到当前交换链里正在渲染的图像上显示出来。

本文主要记录其中一些过程,因为第一次尝试类似开发,所以有误的地方欢迎大家指出。

前期准备工作主要如下,VSCode C++环境配置,熟悉CMake。

为什么选择vscode,而不是visual studio/android studio,主要是基于如下考虑,首先在win平台方便调试与测试,在win平台完成demo后再移植到android下就方便了,而visual studio/android studio分别在开发原生win/android下方便,而vscode+cmake的组合很方便在win平台调试测试,然后平稳生成相应的android studio项目方案,然后在android studio里进行调试封装,并且最新android studio首选cmake构建,更方便集成。VSCode必需的C++插件主要是如下几个 C/C++ for Visual Studio Code/Cmake/Cmake tools.

然后我花了一些时间在vscode里编译了ogre-next,并把它的cmake文件跟了一遍,大致了解了cmake的用法,总结了下 CMake常用命令 。

vulkan结合github上二个vulkan 的demo方案,初步了解vulkan API与渲染流程。vulkan网上说的二千多行代码画个三角形确实一点也不夸张,Vulkan API粒度细,控制度高,以及为多线程渲染设计的渲染队列,渲染命令及同步,所以代码量看着就上去了,但是你根据你的需求简单封装下,如交换链,渲染管线,UBO,buffer等,再写也就大部分业务逻辑代码。简单来说,先根据demo熟悉流程与API,再手动写个2K多行的简单demo,在这过程,通过比较以前opengl/dx的API流程熟悉与加深思路,然后根据你的需求确定一些参数,封装一些类,最后开始你的需求并反向不断完善更新你的封装库。

知乎上各位大佬已经把Vulkan API/Demo讲解的非常清晰,这里就说下这个DEMO的流程,供大家参考,欢迎大家指出理解有误的部分。

首先窗口初始化相关,这部分也是android/window平台区别最大的部分,注意这里有个大坑,不同win32下,在创建窗口的线程下可以直接创建surface,在android下需要等到窗口的消息APP_CMD_INIT_WINDOW里才能创建surface,android里的native activity初始化过程可以参考 Android——NativeActivity - C/C++ Apk开发,创建surface过程,选择呈现/渲染通道以及同步呈现与渲染的对象,创建renderpass,然后根据surface创建交换链,根据交换链得到呈现image列表,根据image列表得到fbo列表用于附着到RenderPass上用于渲染,这里选择一种比较简单的CommandBuffer记录方式,就是有交换链有几个image,就创建几个对应的CommandBuffer记录.

然后创建逻辑设备,加载需要参与计算的输入图像资源,一般来说,图像资源要使用compute shader,usage肯定要有VK_IMAGE_USAGE_STORAGE_BIT,而现在大部分硬件来说,线性 features不支持VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT,用于CPU 可以访问的资源需要linera_tiling.简单来说,compute shader要求的纹理,现在硬件上,CPU大部分不能直接访问,这就要求一个中转,先创建一个CPU可以访问的资源如vkbuffer,然后把数据导入这个资源中,然后通过设备资源间vkCmdCopyBufferToImage复制到原CPU不能访问的GPU纹理上。然后创建一个compute shader要求的输出纹理,对应一个UBO结构,这个UBO对应compute shader输入输出。加载转化的spv文件,生成对应的compute pipeline.

在这个需求里,渲染命令不会每桢修改,所以我们完全可以在开始桢渲染前就填充CommandBuffer。

  1. 填充计算管线的CommandBuffer,简单来说,就是执行上面的compute pipeline,并把输出纹理layout改成VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL。
  2. 填充呈现渲染里的CommandBuffer,根据交换链里的image数据填充对应的每个CommandBuffer,简单来说,就是把上面计算完成的纹理通过vkCmdBlitImage复制到当前呈现的那张vkimage中。

注意,这里只是保存了动作,相当于把action放入队列中,并没执行队列,在这里,所有在每桢运行前的逻辑已经处理完。

然后到每桢渲染,如上先等计算管线的fences来信号,这表明GPU队列中已经执行完成CommandBuffer,如下代码的computerCmd又变成可执行状态。注意创建fences时需要先给信号,不然第一次进入就会一起等待,并且fences需要手动reset.然后根据vkAcquireNextImageKHR得到的索引拿到呈现渲染的CommandBuffer,执行完成呈现出来,呈现与渲染的同步都在设备GPU内,一般用VkSemaphore来同步,不同于vkFence,他用于gpu-gpu间的同步,自动reset.

void onPreDraw() {auto device = context->logicalDevice.device;vkWaitForFences(device, 1, &computerFence, VK_TRUE, UINT64_MAX);vkResetFences(device, 1, &computerFence);VkSubmitInfo submitInfo = {};submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;submitInfo.commandBufferCount = 1;submitInfo.pCommandBuffers = &context->computerCmd;VK_CHECK_RESULT(vkQueueSubmit(context->computeQueue, 1, &submitInfo, computerFence));
}

在window平台测试完,参照vulkan的demo,新建一个android文件夹,设置其中的setings.gragle.

主build.gradle就和一般的一样,在vkcs1目录下的build.gradle添加externalNativeBuild的cmake路径,设置好AndroidManifest.xml,如下图。

然后就可以用android studio打开这个文件夹,然后Sync Project with Gradle Files,就会补起成余下内容,最后应该是如下结构。

正常来说,应该就可以在android studio安装及调试了。

最后说下在移植到android下遇到的一些坑。

  1. undefined symbol: ANativeActivity_onCreate 找不到,解决方法在CMake中添加set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
  2. vkCreateAndroidSurfaceKHR 类似Fatal signal 11 (SIGSEGV)错误。这是前面说的因为需要等到APP_CMD_INIT_WINDOW 消息后,才能初始化surface.
  3. 在WIN平台glsl转的spv文件可以直接在android上使用,而hlsl的不行,这里不知是否有误,测试不行。
  4. 1080P下16/16的结果不对,二种解决方案,一是使用32/8,满足整除,但是需要图像满足对应的长宽条件,二是divup,然后在shader里传入width/hight,检查ThreadID.xy在width/hight范围了,需要做if检查,但是不限制图像长宽大小。

参考:

https://github.com/LunarG/VulkanSamples vulkan基本API用法实例

https://github.com/SaschaWillems/Vulkan vulkan进阶demo.

https://www.zhihu.com/people/xiao-peng-you-38-21/posts 上面vulkan demo的讲解。

Android——NativeActivity - C/C++ Apk开发

android device monitor命令行窗口在哪里_Vulkan在Android使用Compute shader相关推荐

  1. android studio device功能,Android Studio 3.0找不到Android Device Monitor

    因为自Android Studio 3.0开始弃用Android Device Monitor,Android Developers官网上的原话是: Android Device Monitor is ...

  2. Android Device Monitor 文件管理的常见问题 - z

    Android Device Monitor 是 Android Studio 中用于监测模拟器或真机运行状态的一款开发者工具.但开发者在使用它的过程中往往会遇到很多问题,尤其对于新手.本文分析了实际 ...

  3. Android Device Monitor 文件管理的常见问题

    Android Device Monitor 是 Android Studio 中用于监测模拟器或真机运行状态的一款开发者工具.但开发者在使用它的过程中往往会遇到很多问题,尤其对于新手.本文分析了实际 ...

  4. AndroidStudio 3.0中之后无法打开DDMS [Android Device Monitor] 问题

    转自black_bird_cn的博客,如有冒犯请留言联系 一.AndroidStudio 3.0中之后无法打开Android Device Monitor 最近升级了AS后发现在在菜单栏中的Tools ...

  5. Android --- Android Device Monitor 在 3.0 版本之后废弃了怎么办

    今天在使用 Android Device Monitor 工具的时候发现已经找不到了,因为自己的 Android Studio 版本比较高 3.6 ,到官网查找发现 在 3.0 之后 废弃掉 Andr ...

  6. 6.5、Android Studio的Android Device Monitor

    Android Device Monitor是一个独立的工具,可以对Android应用进行调试和分析.Android Device Monitor无需安装整合在一个IDE中,比如像Android St ...

  7. Android Studio中Android Device Monitor的file explorer不显示问题

    正在学Sqlite数据库,但是没能在Android Device Monitor的file explorer中看到文件.网上有好几种方法,但试过都没有成功,最后还是在CSDN中找到解决方法. 解决办法 ...

  8. android+图标+i_explore+无背景,Android Studio中Android Device Monitor中的File Explore不显示文...

    环境:操作系统是Mac,模拟器 问题:Android Studio中Android Device Monitor中的File Explore不显示文件 本人在自学文件存储,想查看"dada/ ...

  9. ADB命令行卸载或删除你的Android设备中的应用

    如果你对你的Android设备在与命令行的交互间有一定的兴趣,那你可能想学习一些使用ADB卸载设备中已安装应用的技巧.为了使这种方法生效,你将需要在你的电脑中设置好Android ADB.可以去看看关 ...

最新文章

  1. day1 作业二:多级菜单操作
  2. HBase总结(十一)hbase Java API 介绍及使用示例
  3. loop指令 c语言,arm汇编loop指令
  4. leetcode 838. Push Dominoes | 838. 推多米诺(分析每个状态)
  5. python提取excel数据视频_Python-爬取b站的热门视频并导入Excel中
  6. apache配置文件详解
  7. 2017年3月份前端资源分享
  8. oracle国家字符集
  9. matlab图像分割基于小波变换,图小波变换在图像分割中的应用研究
  10. 项目质量管理的几种常规方法
  11. 旋转向量解法(罗德里格公式推导及理解)
  12. 登录显示服务器端校验不通过,SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.7.57 SMTP;...
  13. win11 任务栏显示所有图标 不需要任何插件 (win11 22h2 版本已失效)
  14. 分享7个比B站更刺激的老司机网站,别轻易点开
  15. glob模块中的glob.glob和golb.iglob
  16. GBase 8a数据库加载流程介绍
  17. 小孢子的神奇之旅——如何阅读MindSpore报错信息系列(1)
  18. Struts2报错Caused by: java.lang.NoSuchMethodException: bean.Student.init()
  19. 一次 minerd 肉鸡木马的排查思路
  20. 【人工智能行业大师访谈5】吴恩达采访林元庆

热门文章

  1. fastjson 对象和json互转
  2. Hibernate的批量查询
  3. 在MFC对话框中快速集成三维控件
  4. 《代码大全2》读书笔记 Week 1
  5. 认识微软Visual Studio Tools for AI
  6. MySQL的介绍以及使用
  7. 使用快速傅里叶变换计算大整数乘法-代码
  8. hadoop hive安装手记(转)
  9. ArcGIS Server for Silverlight 之集群(Simple Clusterer)
  10. 百度输入法发布AI版本10.0,重磅推出“AI助聊”功能