探索iOS之Metal编程指南

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

猜你喜欢

转载自blog.csdn.net/u011686167/article/details/131193493