探索iOS之Metal编程指南

news2024/11/26 11:48:56

iOS推出Metal渲染库为了取代OpenGL。Metal有自己的Shader语言,渲染效率比OpenGL高。在这里我们一起探索:Metal使用C++限制、预处理定义、动态链接配置、GPU编译配置、设备坐标系、视口坐标系、纹理坐标系、矢量类型、矩阵类型、采样器状态、矩阵相乘。

1、使用C++限制

C++14的一些特性无法在Metal使用,具体如下:

  • lambda表达式
  • dynamic_cast操作
  • 类型检测
  • new和delete操作
  • noexcept操作
  • goto跳转
  • register、thread_local关键字
  • virtual虚函数
  • 派生类
  • 异常处理

另外,不要在Metal代码使用C++标准库。函数指针在Metal2.3才支持。

2、预处理定义

预处理定义包括:Metal版本、在macOS或iOS平台编译。如下所示:

__METAL_VERSION__ // Set to the Metal language revision
__METAL_MACOS__   // Set if compiled with the macOS Metal language
__METAL_IOS__     // Set if compiled with the iOS Metal language
__METAL__         // Set if compiled with the unified Metal language

还有一些TARGET_OS的预定义:

TARGET_OS_MAC          // run on MacOS
TARGET_OS_OSX          // run on OSX
TARGET_OS_IPHONE       // run on devices or simulator
TARGET_OS_IOS          // run on iOS
TARGET_OS_TV           // run on Apple TV OS
TARGET_OS_MACCATALYST  // run on MacOS
TARGET_OS_SIMULATOR    // run on simulator

3、动态链接配置

Metal动态链接包括指定动态库/静态库、安装路径,如下所示:

  • -dynamiclib:指定为动态库
  • -install_name:动态库安装路径

4、GPU编译配置

在iOS16或macOS13以后,支持配置GPU编译,具体配置选项如下:

-arch       // 指定系统架构
-gpu-family // MTLGPUFamily架构
-N          // 描述Metal脚本格式,后缀.mtlp-json

5、设备坐标系

Normalized Device Coordinate归一化设备坐标系,简称NDC。由xyz三维空间构成,其中z坐标点在0.0和1.0之间。如下图所示:

 

6、视口坐标系

光栅化阶段把设备坐标系转换为视口坐标系,测量单位为pixel像素,原点(0, 0)在左上角,往右下角增大。如下图所示:

 

7、纹理坐标系

纹理坐标系与视口坐标系类似,只是纹理坐标已被归一化,范围从0.0到1.0,中心点为(0.5, 0.5),如下图所示:

 

8、矢量类型

矢量类型包括:bool、char、short、int、long、half、float等,同时后面跟着数值(2、3、4)。值得注意的是,这里有内存对齐,为2的n次方。这里以float展开,其他类型只列举数值2,如下表所示:

typesizealignment
float288
float31616
float41616
bool222
char222
short244
half244
int288
long21616

9、矩阵类型

矩阵类型包括half和float,而mxn阵列包括2x2、2x3、2x4、3x2、3x3、3x4、4x2、4x3、4x4,如下图所示:

 

10、采样器状态

Sampler采样器的状态枚举值,如下表所示:

变量数值描述
coord

normalized(默认)

pixel

指定纹理坐标为归一化或像素
address

repeat

mirrored_repeat

clamp_to_edge

clamp_to_zero

clamp_to_border

纹理坐标的地址模式
border_color

transparent_black(默认)

opaque_black

opaque_white

边界颜色
filter

nearest(默认)

linear

magnification和minification

过滤模式

mag_filter

nearest(默认)

linear

magnification过滤模式
mig_filter

nearest(默认)

linear

minification过滤模式
mip_filter

nearest(默认)

linear

mipmap过滤模式
compare_func

never(默认)

less / less_equal

greater / greater_equal

equal / not_equal

always

设置比较函数

11、矩阵相乘

矩阵相乘有左乘与右乘的区别,类型包括:scalar乘以matrix、matrix乘以scalar、vector乘以matrix、matrix乘以vector、matrix乘以matrix。

参考链接:Metal-Shading-Language-Specification

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何下载远程maven仓库的jar 手动放到本地仓库?

文章目录 如何下载远程maven仓库的jar 手动放到本地仓库?简单步骤描述:详细步骤描述:案例1:案例2:结语如何下载远程maven仓库的jar 手动放到本地仓库? 在使用Maven构建Java项目时,通常会从中央仓库或其他远程仓库下载所需的依赖库。但是,有时候我们需要手动下载这些依赖库并…

Java并发之 Lock 锁

一、Lock接口 1 Lock简介&地位&作用 锁是一种工具,用于控制对共享资源的访问Lock和synchronized是最常见的两个锁,他们都能够达到线程安全的目录,但是使用和功能上又有较大的不同Lock接口最常见的实现类就是ReentrantLock通常情况下…

【LeetCode热题100】打卡第21天:最小路径和爬楼梯

文章目录 【LeetCode热题100】打卡第21天:最小路径和&爬楼梯⛅前言 最小路径和🔒题目 爬楼梯🔒题目🔑题解 【LeetCode热题100】打卡第21天:最小路径和&爬楼梯 ⛅前言 大家好,我是知识汲取者&#…

深入了解RTMP协议:实时传输的利器

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…

【环境配置】MATLAB r2022b+opencv3.4.1+mexopencv3.4.1+Windows 11 配置

参考链接: mexopencv官方文档:介绍了全部流程 补充官方文档Configure OpenCV出现的问题:直到Configure后没有红色,再点击Generate 最新Opencv 与 VC 的版本对应关系(2023-04-08) MATLAB支持和兼容的编译器 …

大学物理(上)-期末知识点结合习题复习(5)——刚体力学-转动惯量、力矩、线密度 面密度 体密度、平行轴定理和垂直轴定理、角动量定理和角动量守恒定律

目录 刚体的定轴转动 题1 题目描述 题解 题2 题解 题3 题目描述 题解 题4 题目描述 题解 题5 题目描述 题解 角动量定理和角动量守恒定律 刚体的定轴转动 1.转动动能 由,得 表示质量 表示质量分布点 2.转动惯量 为刚体对给定轴的转动惯量&…

原生小程序 微信小程序 使用ucharts

一般是uni-app项目使用ucharts在原生微信小程序也是可以使用。 方法: ## 使用说明 请将项目根目录 微信小程序/uCharts-组件/qiun-wx-ucharts/src 下全部文件复制到指定位置,例如该项目的components/qiun-wx-uchart目录下,然后在页面的json配…

2023互联网寒冬之下Java程序员要怎么应对才能找到工作

在互联网寒冬下,Java程序员需要做好哪些方面的准备,才能够更好地找到工作呢? 1.关注用人单位的招聘需求;Java程序员应该关注用人单位的招聘信息,并针对不同的招聘岗位进行精准的自我定位和筛选。在面试前可以充分了解…

Gin框架原生方式切割日志,Go语言原生日志切割

目录 摘要 痛点 正文 1.分析 io.Writer 接口 2.实现 io.Writer 接口 3.将它作为原生输出 4.将它作为 Gin 框架的输出 摘要 自定义一个日志输出,将go语言和gin框架的日志自动按天拆分。本文通过实现io.Writer接口的方式,替换原生和gin框架的默认W…

DAY21——二叉树part7

1.二叉搜索树最小差值 二叉搜索树中序遍历得到有序的数字序列,记录前一个节点 class Solution {TreeNode pre;int result Integer.MAX_VALUE;public int getMinimumDifference(TreeNode root) {if(rootnull)return 0;traversal(root);return result;}private voi…

【Java算法题】剑指offer_数据结构之03队列栈

前言 刷题链接: https://www.nowcoder.com/exam/oj/ta?page2&tpId13&type265 原定于5.30写完队列&栈,超时了14天(2周),于6.13完成。 刷算法题到现在得出一个心得,万事开头难。没刷之前总觉得…

django的项目结构介绍

目录 django的安装django项目创建django项目启动django项目关闭django项目个个文件分析核心文件 manage.py项目内部文件start01/start01setting文件的讲解 django的安装 pip install django检测安装后的版本 python -m django --versiondjango项目创建 django安装以后 会自动…

面向对象的多态

7. 面向对象特征三:多态性 概念 多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。 变…

作为软件工程师对Docker的认知和看法

文章目录 前言一、Docker是什么?二、Docker和Virtual Machine的区别三、Docker架构1. Client2. Docker Host3. Registry 四、Docker在实际应用中的好处配置环境网络和卷更新管理 总结 前言 两年前我还没有接触过Docker,也不理解Docker在自动化工程应用中…

k8s如何使用ceph rbd块存储(静态供给、存储类动态供给)

目录 前言安装ceph集群ceph集群创建rbd块存储rbd块存储不支持ReadWriteManyk8s配置rbd块存储(静态供给)创建secret创建pv创建pvck8s节点安装客户端依赖包部署pod查看pod验证是否持久化 k8s配置rbd块存储(动态供给)查看官网ceph集群…

mysql 最常用的一些语句

1 数据库相关操作 CREATE DATABASE IF NOT EXISTS daily-test DEFAULT CHARSET utf8 COLLATE utf8_general_ci; drop database daily_test; use daily_test 具体操作如下图上所示: 2 mysql常用数据类型 MySQL 数据类型 | 菜鸟教程 3 数据库表相关操作…

Stimulsoft Forms.WEB 23.2.6 Crack

Stimulsoft Forms.WEB 发布 创建、编辑、填写、发布和分发交互式表单。 2023 年 6 月 13 日 - 9:34 新产品 特征 您可以为几乎任何目的创建任何类型的文档 - 发票和支票、各种调查问卷和工作表、订单、简历等等。用户收到可编辑的 PDF 格式的完成模板,可以在任何现代…

英伟达开发板学习系列---国产【Jetson Xavier NX】系统安装及基础配置

1. 前言 最近新买了Jetson Xavier NX, 和之前英伟达原厂的NX的区别在于国产Jetson Xavier NX 是核心板使用的是英伟达的,扩展板是国产的。具体详情如下: 官方NX和国产NX详情区别 2. 设置系统从固态硬盘启动 官方NX出厂是直接将SD卡(64/12…

Redis GEO地理位置信息的应用

Redis GEO地理位置信息的应用 Redis GEO概述应用场景Redis GEO命令GEO命令演示 Redis GEO实现附近人的功能基础类API接口接口实现执行测试 Redis GEO 概述 Redis的GEO操作是一种基于地理位置信息进行操作的功能。它使用经度和纬度坐标来表示地理位置,支持存储地理位…

湖南大学CS-2020期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 1.简答题(10 分) 假设一个基于 IEEE 浮点格式的 10 位浮点表示,有 1 个符号位,4 个阶码位(k=4)和 5 个 尾数位(n=5)。 (…