02 - Metal学习之渲染管线

通过这篇文章你将了解Metal渲染管线的工作流程,这有助于你深入了解Metal工作流程,以及Metal是基于什么现有条件设计的。
参考文章: 《Metal by Tutorials》

1.CPU和GPU

所有计算机都有一个中央处理单元(CPU),可以驱动计算机上的操作和管理资源。他们还有一个图形处理单元(GPU)。

GPU是一种专门的硬件组件,可以非常快速地处理图像、视频和大量数据。这被称为吞吐量。吞吐量由特定时间单位处理的数据量来衡量。

另一方面,CPU无法非常快速地处理大量数据,但它可以非常快速地处理许多顺序任务(一个接一个)。处理任务所需的时间称为延迟。

理想的设置包括低延迟和高吞吐量。低延迟允许串行执行排队任务,因此CPU可以执行命令,而不会系统变得缓慢或无响应;高吞吐量允许GPU异步渲染视频和游戏,而不会使CPU停滞不前。由于GPU具有高度并行化的架构,专门重复执行相同的任务,并且很少或没有数据传输,因此它能够处理大量数据。

2. 渲染管线

如下图所示,渲染管线分为以下几个部分:


截屏2022-06-01 16.42.11.png

图形管道将顶点带过多个阶段,在此期间,顶点的坐标在不同空间之间转换。
作为程序员,您只关心顶点和片段处理阶段,因为只有它们是可编程阶段。

1.顶点获取:

通过设置顶点缓冲对象,可以给GPU传递顶点数据。
类似如下代码:

renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)

2.顶点处理

在这个阶段,顶点是单独处理的。您编写代码来计算每个顶点照明和颜色。更重要的是,您通过各种坐标空间发送顶点坐标,以获取它们在最终帧缓冲区中的位置。

3.图元装配

上一阶段将分组为数据块的处理顶点发送到此阶段。需要记住的是,属于相同几何形状(原始)的顶点始终位于同一块中。这意味着一个点的一个顶点,或一条线的两个顶点,或一个三角形的三个顶点,将始终在同一块中,因此永远不需要第二个块获取。

不仅仅是顶点信息,CPU同时还会发送与顶点相关联的信息。类似下面的代码:

renderEncoder.drawIndexedPrimitives(type: .triangle, 
indexCount: submesh.indexCount, indexType: submesh.indexType, indexBuffer: submesh.indexBuffer.buffer, 
indexBufferOffset: submesh.indexBuffer.offset)

第一个参数是绘制图元的类型,这里Metal支持五种图元类型(和OpenGL ES类似)
如下图所示:


截屏2022-06-01 17.23.42.png

图示清晰地展示了几种类型的区别,这里就不做过多赘述了。

4.光栅化

目前有两种现代渲染技术在不同的路径上发展,但有时一起使用:光线追踪和光栅化。他们完全不同;两者都有利弊。

在渲染静态和遥远的内容时,首选光线追踪——您将在第18章“用光线渲染”中阅读更多内容,而当内容更接近相机且更动态时,更倾向于光栅化。

通过光线追踪,对于屏幕上的每个像素,它都会向场景发送光线,看看是否与物体相交。如果是,请将像素颜色更改为该对象的颜色,但前提是该对象比之前为当前像素保存的对象更接近屏幕。

光栅化的作用相反:对于场景中的每个对象,将光线发送回屏幕,并检查对象覆盖的像素。深度信息与光线追踪的方式相同,因此如果当前对象比之前保存的对象更近,它将更新像素颜色。

此时,从上一阶段发送的所有连接顶点都需要使用其X和Y坐标在二维网格上表示。此步骤称为三角形设置。

在这里,光栅化器需要计算任何两个顶点之间线段的斜率或陡度。当知道三个顶点的三个斜率时,三角形可以从这三个边形成。

接下来,一个名为扫描转换的过程在屏幕的每一行上运行,以查找十字路口,并确定什么是可见的,什么是不可见的。此时,要在屏幕上绘图,只需要它们确定的顶点和斜率。

扫描算法确定线段上的所有点或三角形内的所有点是否可见,在这种情况下,三角形完全充满颜色。
简而言之,光栅化就是把矢量图形转化为像素点的过程。

5.顶点处理

截屏2022-06-01 18.03.21.png

如上图所示:
顶点获取单元从内存中抓取顶点,并将其传递给调度器单元。

调度器单元知道哪些着色器内核可用,因此它调度工作。

工作完成后,分销商部门知道这项工作是顶点还是碎片处理。

如果是顶点处理工作,它会将结果发送到原始汇编单元。此路径继续到光栅化单元,然后返回到调度器单元。

如果是片段处理工作,它会将结果发送到颜色书写单元。

最后,彩色像素被送回内存。

6.帧缓冲

一旦碎片被处理成像素,分销商单元就会将其发送到颜色书写单元。该单元负责在称为帧缓冲区的特殊内存位置写入最终颜色。从这里,视图的每个帧都会刷新其彩色像素。但这是否意味着颜色在屏幕上显示时写入帧缓冲区?

使用一种称为双缓冲的技术来解决这种情况。当第一个缓冲区显示在屏幕上时,第二个缓冲区在后台更新。然后,交换两个缓冲区,第二个缓冲区显示在屏幕上,而第一个缓冲区更新,循环继续。
大致了解完渲染管线后,接下来就是结合demo来了解Metal编程了。

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

推荐阅读更多精彩内容