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,如下表所示:
type | size | alignment |
float2 | 8 | 8 |
float3 | 16 | 16 |
float4 | 16 | 16 |
bool2 | 2 | 2 |
char2 | 2 | 2 |
short2 | 4 | 4 |
half2 | 4 | 4 |
int2 | 8 | 8 |
long2 | 16 | 16 |
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