Metal教程

1.Metal 是一个和 OpenGL ES 类似的面向底层的图形编程接口,可以直接操作GPU;支持iOS和OS X,提供图形渲染和通用计算能力。(不支持模拟器)-

Metal框架支持GPU硬件加速、高级3D图形渲染以及大数据并行运算。且提供了先进而精简的API来确保框架的细粒度(fine-grain),并且在组织架构、程序处理、图形呈现、运算指令以及指令相关数据资源的管理上都支持底层控制。其核心目的是尽可能的减少CPU开销,而将运行时产生的大部分负载交由GPU承担

metal渲染过程图

MTLDevice :对象代表GPU,通常使用MTLCreateSystemDefaultDevice获取默认的GPU;

MTLCommandQueue:由device创建,用于创建和组织MTLCommandBuffer,保证指令(MTLCommandBuffer)有序地发送到GPU;MTLCommandBuffer会提供一些encoder,包括编码绘制指令的MTLRenderCommandEncoder、编码计算指令的MTLComputeCommandEncoder、编码缓存纹理拷贝指令的MTLBlitCommandEncoder。对于一个commandBuffer,只有调用encoder的结束操作,才能进行下一个encoder的创建,同时可以设置执行完指令的回调。

MTLRenderCommandEncoder,MTLComputeCommandEncoder,MTLBlitCommandEncoder:分别代表渲染,计算,拷贝指令

PipelineState:也是由device创建其包含了顶点着色器和片元着色器以及并行运算,动态的供CommandEncoder使用,一个state代表一组着色器

Texture和Buffer:由device创建,动态的供CommandEncoder使用

Threadgroups:结构体,是并行计算着⾊器的线程组数量,动态的供MTLComputeCommandEncoder使用

GPUs的类型很多,每一种都有各自的接收和执行指令方式,在MTLCommandEncoder把指令进行封装后,MTLCommandBuffer再做聚合到一次提交里。

暂态和⾮非暂态对象:

暂态对象:

在Metal中有些对象被设计成暂态,使⽤用它们⾮非常轻量,下⾯面这些对象是暂态的,被设计来⼀一次性使⽤用,它们的创建和销毁的成本都⾮非常廉价,它们的创建⽅方法都返回autoreleased对象。

Command Buffers 

Command Encoders

非暂态对象:

下⾯面这些对象是⾮非暂态的,在性能相关的代码⾥里应该尽量重⽤用之,避免反复创建

Command Queues 

Buffers

Textures

Sampler States Libraries 

Compute States

Render Pipeline States 

Depth/Stencil States


多个encoder
多线程和CommandQueue


并行计算

通用图形计算是general-purpose GPU,简称GPGPU。

GPU可以用于加密、机器学习、金融等,图形绘制和图形计算并不是互斥的,Metal可以同时使用计算管道进行图形计算,并且用渲染管道进行渲染。

计算管道只有一个步骤,就是kernel function(内核函数),内核函数直接读取并写入资源,不像渲染管道需要经过多个步骤;

MTLComputePipelineState 代表一个计算处理管道,只需要一个内核函数就可以创建,相比之下,渲染管道需要顶点和片元两个处理函数;

每次内核函数执行,都会有一个唯一的gid值;

内核函数的执行次数需要事先指定,这个次数由格子大小决定。

threadgroup 指的是设定的处理单元,这个值要根据具体的设备进行区别,但必须是足够小的,能让GPU执行;

threadgroupCount 是需要处理的次数,一般来说threadgroupCount*threadgroup=需要处理的大小。


1

上图左边是一幅1024*768个像素大小的图片,那么共需要1024*768个线程;我们将这些线程分为32*48个线程组,每个线程组有32*16个线程(上右图)


1

Metal Language

1. Metal 与 C++ 11.0

Metal 这门语言是基于C++ 11.0标准设计的.它在C++基础是行多了一些拓展和限制.下面我们可以简单介绍介绍Metal着色语言与C++11.0 相比之下的修改和限制:

1.1 Metal 语言支持重载,如果C++11.0,包括方法重载规则,可以包括参数的地址空间描述符.Metal着色语言中的标识为图形渲染入口函数或是并行计算入口函数的不可以被重载

1.2 Templates 模块

Metal 着色语言支持的模板如图C++11.0 一样.

1.3 Preprocessing Directives 预编译指令

Metal 和 C++11.0 一样支持预编译指令

1.4  Restrictions 限制

如下的C++11.0特性在Metal 着色语言中是不支持的;

Lambda表达式

递归函数调用

动态转换操作符

类型识别

对象创建(new)和释放(delloc)操作符

操作符noexcept

goto跳转

变量存储修饰符register和thread_local

虚函数修饰符

派生类

异常处理

1.5 Metal着色语言是有对于指针的使用限制

1.6Metal图形和并行计算函数用到的入参如果是指针必须使用地址空间修饰符(device,threadgroup,constant)

1.7 不支持函数指针

1.8 Metal函数名不能命名为main函数

基本数据类型:

Metal的数据类型包含表示向量和矩阵的类型,原子数据类型,缓存,纹理,采样器,数组,自定义结构体,还会描述类型对齐和类型转换.

1. 标量数据类型:

Metal 支持如下表格的类型,但是它不支持double,long,unsigned long ,long long,unsigned long long,long double


Metal 数据类型


1

注意

f或者F,表示单精度浮点类型字面量,(例如,0.5f 或 0.5F);

h或者H,表示半单精度浮点类型字面量,(例如,0.5h 或 0.5H);

u或者U,表示无符号整形字面量.

2.向量和矩阵数据类型

Metal着色语言通过系统向量数学库支持一系列的向量和矩阵数据类型.

向量支持如下类型

booln

charn

shortn

intn

ucharn

ushortn

uintn

halfn

floatn

向量中的n,指的是维度.假设2,表示二维

矩阵支持如下类型

halfnxm

floatnxm

nxm分别指的是矩阵的行数和列数.

3. 访问向量的分量

//基本数据类型

bool a = true;

char b = 5;

int  d = 15;

size_t c = 1;

ptrdiff_t f = 2;

//向量

bool2 A= [1,2];

float4 pos = float4(1.0,2.0,3.0,4.0);

float x = pos[0];

float y = pos[1];

float4 VB;

for(int i = 0; i < 4 ; i++)

    VB[i] = pos[i] * 2.0f;

Metal 支持(,)作为选择向量分量进行访问操作符.可以使用坐标分量或者是颜色分量的字母来存取向量.向量名.xyzw,或是向量名.rgba;

//通过向量字母来获取元素

int4 test = int4(1,2,3,4);

int a = test.x;

int b = test.y;

int c = test.z;

int d = test.w;

int e = test.r;

int f = test.g;

int g = test.b;

int h = test.a;

􏱺􏱻􏱺􏱻􏱺􏱻缓存:


缓存

函数修饰符:


函数修饰符

变量和参数修饰符:


变量和参数修饰符

注意:device是可变的,constant是不可变的

用于缓存、纹理、采样器的寻址修饰符:


寻址修饰符

index表示了一个缓存、纹理、采样器的位置,它是一个索引;

[[position]] 表示顶点坐标,为什么必须要指定postion不指定textureCoordinate等?因为顶点着色器要使用postion而其它是要传递给片元着色器的, [[ vertex_id ]]表示顶点数组中某一个顶点坐标

顶点着色器除了用 [[ vertex_id ]]和 [[ buffer(index) ]]来定位单个顶点,还可以使用[[ stage_in ]]和[ attribute(index) ]、 [[ vertex_id ]]来定位单个顶点

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 《行尸走肉》中“尼根”的饰演者杰弗里·迪恩·摩根表示,扎导的离开,使得他在“闪点”中继续饰演“托马斯·韦恩”的可能...
    DC中文网阅读 385评论 0 0
  • ——1—— 有一个姑娘在我领证的大喜日子里,在我的QQ空间回复我说,你的脸怎么比你老公还大? 普通群众都能看出我这...
    林曼殊阅读 414评论 1 2
  • 雨见牵着小白马,离开了集市(尘世)。她虽未曾去过寂水所在的寂刀派,但寂刀派所在的山峰太好找了,寂刀派虽然名字里有个...
    信长工阅读 224评论 0 0
  • 说到三国,大多数人肯定喜欢武神赵子龙,也还有智绝的诸葛亮。或许你还有别的偏好,但你不能否认他们的人气。 ...
    欧瑞吉阅读 139评论 0 1