介绍
- Metal着⾊语言是⼀个⽤来编写3D图形渲染逻辑和并行计算核心逻辑的编程语言,编写Metal框架的APP需要使用Metal 着色语⾔程序.
- Metal 着色语⾔ 与 Metal 框架配合使用,Metal 框架管理Metal着⾊语言的运行和可选编译选项. Metal 着色器语言使用Clang和LLVM,编译器对于在GPU上的代码执行效率有更好的控制.
Metal 与 C++ 11.0
Metal 这门语言是基于C++ 11.0标准设计的.它在C++基础是多了⼀些拓展和限制.下面我们可以简单介绍Metal着⾊语言与C++11.0 相⽐之下的修改和限制.
Metal Restrictions 限制
如下的C++11.0的特性
在Metal 着⾊语言中是不⽀持
的.
- Lambda表达式
- 递归函数调⽤用
- 动态转换操作符
- 类型识别
- 对象创建(
new
)和释放(delloc
)操作符 - 操作符
noexcept
-
goto
跳转 - 虚函数修饰符
- 派⽣生类
- 异常处理理
C++的标准库
不可以在Metal 着色语言中使用
Metal 着色语言是有对于指针的使用限制. Metal图形和并行计算函数用到的入参如果是指针使用地址空间修饰符 (device ,threadgroup ,constant
)
不支持函数指针
Metal函数名不能命名为Main
函数
Metal 数据类型
![](https://img.haomeiwen.com/i2999597/6a0662cb7a609215.png)
-
Metal 向量和矩阵数据类型
向量支持如下类型:
booln charn shortn intn ucharn ushortn uintn halfn floatn
向量中的n,指的是维度
-
Metal 向量和矩阵数据类型
矩阵支持如下类型: halfnxm floatnxm
nxm分别指的是矩阵的行数
和列数
.
缓存buffer
在Metal 中实现缓存靠的是一个指针.它指向一个在Device
或者 constant
地址空间中的内建或是开发者自定义的数据块.缓存可以被定在程序域域中,或是当做函数的参数传递.
属性修饰符
属性修饰符目的:
- 参数表示资源如何定位? 可以理解为端口
- 在固定管线和可编程管线进行内建变量的传递
- 将数据沿着渲染管线从顶点函数传递片元函数.
- 变量与参数的地址空间修饰符
Metal 着色语言使用"地址空间修饰符号",来表示一个函数变量或是参数 被分于那块内存区域. 下面这些修饰符描述了不相交叠地址空间:
-
device
— 设备地址空间 -
threadgroup
— 线程组地址空间 -
constant
— 常量地址空间 -
thread
— 线程地址空间
- 函数参数和变量
图形绘制或是并行计算着色函数的输入/输出都需要通过参数传递(除了常量地址空间变量和程序域中定义的采样器以外).参数可以是如下之一:
-
device buffer
(设备缓存) -
constant buffer
(常量缓存) -
texture Object
(纹理对象) -
sampler Object
(采样器对象) -
threadgroup
(线程组 )
- 用于寻址缓存,纹理,采样器属性修饰符
为每个参数,指定一个属性修饰符. 指定明确的缓冲,纹理位置.
- device 和 constant buffers — [[ buffer ( index ) ]]
- texture — [[ texture ( index ) ]]
- sampler — [[ sampler ( index ) ]]
- threadgroup buffer — [[ threadgroup ( index ) ]]
纹理Textures
- 纹理数据类型是一个句柄,它是一个一维/二维/三维纹理数据.而纹理数据对应这个一个纹理的某个level的mipmap的全部或者一部分
enum class access {sample,read,write};
texture1d<T,access a = access::sample>
texture1d_array<T,access a = access::sample>
texture2d<T,access a = access::sample>
texture2d_array<T,access a = access::sample>
texture3d<T,access a = access::sample>
texturecube<T,access a = access::sample>
texture2d_ms<T,access a = access::read>
- 带有深度的纹理必须被声明为下面纹理数据类型中的一个
enum class depth_forma {depth_float};
depth2d<T,access a = depth_format::depth_float>
depth2d_array<T,access a = access::sample,depth_format d = depth_format::depth_float>
depthcube<T,access a = access::sample,depth_format d = depth_format::depth_float>
depth2d_ms<T,access a = access::read,depth_format d = depth_format::depth_float>
采样器 Samplers
![](https://img.haomeiwen.com/i2999597/46ee9bfef5d03875.png)
网友评论