iOS与android坐标映射不一致问题

iOS与android坐标映射不一致问题

背景

为什么同一份着色器代码、同样的cvmat数据,Android和iOS两个平台处理之后会得到不一样的结果呢?

这主要是因为iOS和Android使用的渲染图形库不一样,iOS使用的是Metal,而Android使用的是OpenGL ES,而两个图形库的纹理坐标系又不一样:

OpenGL 纹理坐标系(原点在左下角):

Metal/Vulkan 纹理坐标系(原点在左上角):

如果细分着色器中的工作流程,还可以分为两步:

  1. 将cvmat映射到纹理上,这一步要求cvmat和纹理的方向一致;
  2. 将映射后的纹理从片段着色器中输出到渲染管线上,这一步要求cvmat和OpenGL(Android上)/Metal(iOS上)纹理坐标系方向一致。

将着色器中的工作流程与两条线索相结合,可以得到:

  1. 将cvmat与纹理相映射之前,需要对被标准化过的纹理进行一次上下颠倒,以达到纹理坐标系原点在左上角(和cvmat的坐标系一致)的目的。
  2. 将纹理输出到管线上之前:
  3. 在iOS平台上,由于 Metal 纹理坐标系原点就在左上角,所以不需要对上下颠倒过一次的纹理进行二次处理;
  4. 在Android平台上,由于OpenGL 纹理坐标系原点在左下角,而经过第一步颠倒的纹理其原点在左上角,因此需要第二次上下颠倒以同步原点。

综合一下,简单来讲:

  1. 将cvmat与纹理相映射之前,iOS和Android两个平台都需要对纹理进行一次上下颠倒;
  2. 将纹理输出到管线上之前,只有Android需要对纹理进行一次上下颠倒。
相关推荐
码农coding17 分钟前
android12 systemUI 之锁屏
android
AI云海27 分钟前
iOS 多 Target 打包、UAT/生产测试与上架 App Store 全流程指南
ios
圆山猫28 分钟前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
爱笑鱼1 小时前
Binder(七):getCallingUid() 读到的是谁?clearCallingIdentity() 又清掉了什么?
android
阿里超级工程师2 小时前
最新快速申请ios打包证书和profile文件步骤
ios·打包证书
2501_915909066 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
Lvan的前端笔记7 小时前
AndroidX 完全入门指南
android·androidx
游戏开发爱好者87 小时前
TraceEagle 代理抓包详解,无感代理、去证书绑定与 HTTP/3 解密能力解析
网络协议·计算机网络·网络安全·ios·adb·https·udp
帅次7 小时前
Android 应用高级面试:Window 近1年高频追问 18 题
android·面试·职场和发展
总捣什么乱18 小时前
MySQL MySQL是怎么保证主备一致的?
android·mysql·adb