大多数浏览器和
Developer App 均支持流媒体播放。
-
A11 上的 Metal 2 - 分块着色
分块着色是一种全新的 Metal 2 管线阶段,允许 app 将渲染和计算操作整合到一个渲染通道中,同时共用图像块数据和线程组内存。了解如何创建分块着色管线,以及这一管线如何利用 A11 图形处理器的高带宽分块内存。
资源
- Forward Plus with Tile Shading
- Order Independent Transparency with Imageblocks
- Tailor Your Apps for Apple GPUs and Tile-Based Deferred Rendering
相关视频
Tech Talks
-
下载
本次演讲将着重介绍图块着色技术 这标志着 Apple A11 GPU 达到了一个新的可编程阶段 它在渲染通道中提供了内联的计算能力 图块着色技术使 Metal 2 的性能和效率达到了全新的高度 渲染和计算操作现在可以通过高速带宽和 低功率 Tile Memory 来共享数据 图块着色与 imageblocks 模块深度集成 你可以分析并总结 imageblock 的内容 抑或在后台中储存它 甚至是改变 imageblock 的布局 图块着色技术 与 Threadgroup Memory 也深度集成 它被用来后续的块或 Fragment Stages 提供常数数据块的缓存 让我们从图块着色技术的需求的产生开始讲起 近几年来 在渲染通道中执行计算 变得越来越普遍 例如 分块式延迟和超前算法 使得光与屏幕平齐的块相交 这可以减少渲染的成本 这些算法背后的思想是 并非所有的光线都对像素有影响 但是剔除每个不合格的像素成本过于昂贵 因此我们将成本分摊到块区域 之前使用 A 系列 GPU 的 Metal 中 执行计算的中期渲染需要将 渲染的目标数据存储在 Tile Memory 中 然后将其存储在设备内存中 这样计算通道就可以使用它了 在渲染恢复之前 计算必须将其 结果存储到设备内存中 这种在本地和外部存储器之间的数据移动 是以极大的带宽为支撑的
现在有了 Metal 2 和 A11 GPU 类似的算法现在只需在曝光的 Tile Memory 中 使用图块着色技术执行 这就取代了计算通道的位置 渲染目标内容现在只需被缓存到 Tile Memory 中一次即可 图块着色技术现在可以直接在 imageblock 上运行 甚至可以把它的结果 显示到 Threadgroup Memory 中 后者也得到了 Tile Memory 的支持 以供后续渲染使用 现在我们了解到图块渲染器是如何 让你更频繁地在内存中操作的 现在让我们来仔细看看 图块着色技术 是如何与绘制进行交互的 在计算通道中启动线程成为分派 在渲染通道中 Metal 采用了相同的名称来 进行图块着色 块分派可以与绘制进行自由交互 并在 API 提交顺序中执行 Metal 保证在分派执行之前 所有在分派前的发出的 绘制结果是可见的 同样的 在执行下一个绘制或分派被执行时 Metal 保证每个分派的结果都是可见的 这种同步保证了对 Tile Memory 的 无差别访问 不过在绘制之间就没有类似的保证
在图块着色技术中另一个 重要的概念是如何将线程组织成线程组和网格 使用传统的计算分派时 threadgroups 会被组织称紧密相连的网格 然而在一个渲染通道中 块网格在整个传递中都以常量存在 但是对于每个分派 threadgroup 的大小可能有所不同 如果我们对块进行放大 就会发现它允许你将每个线程映射到一个唯一的像素 或者将每个线程映射到多个像素上 线程对资源的映射 对 Metal 来讲没有特殊的含义 你可以启动没有任何映射到像素的线程 就像我们前面讨论的 光剔除例子一样 在这个例子中 你的 threadgroup 大小可能与需要交叉测试的灯光数量相匹配 不管是什么几何图形 图块着色 threadgroups 会为每个图块来执行操作 例如 一个影响图块子集的三角形 也只需要有这些图块来处理 然而 随后的图块分派 将由屏幕的每一个图块来处理 这么做非常重要 因为分派可能会初始化 Tile Memory 以便以后的几何图形 可以在这些图块中使用 视窗和咬合状态 也不限制图块着色 通常情况下 图块着色技术 不受传统渲染状态的影响 好的 那我们来看看支持图块着色 的 API 变化 一个渲染通道可以用三种图块尺寸之一来配置 这将决定你 imageblock 的尺寸 你的想法可能是选择适配你 imageblock 最大的图块 比如 A11 GPU 上的 32 KB 用以最小化 GPU 原始 处理阶段的开销 然而 当分段或者图块处理特别复杂时 去选择较小的图块 会更适配你的算法 这可以在渲染器核心中 增加图块的并行度 正如我们已经看到的 threadgroup 内存也来自于 Tile Memory 所以它的大小可能也会限制你对吐图块大小的选择
创建一个图块着色通道 与创建传统通道类似 你将函数附加到通道描述符中 以创建通道状态 对于图块着色技术 Metal 引入了新的通道描述符类型 它类似于现有的渲染通道描述 但是删除呈现状态的属性 比如混合 他也类似于现有计算通道描述符 因为只有一个 函数可以绑定 然而 这个函数可以是一个 计算内核 也可以是一个片段函数 计算内核提供了到目前为止 我们讨论过的所有的图块着色 技术和 imageblock 特性 基于片段的块渲染能力有限 但他扮演了一个特殊的重要角色 这个我们以后会讲到
首先 我想要先介绍一下图块通道中 的 imageblock 功能 由于图块着色通过渲染来执行计算分派的 所以它可以访问隐式和显式的 imageblock 模块 就像分段函数一样 然而 与分段函数不一样的是 基于内核的图块着色器可以访问整个 imageblock 让我们来看看语法
我们使用第二个模板参数 在隐式和显式的 imageblock 类型之间消除了歧义 我们必须消除歧义 因为每个都有不同的访问语义 隐式具有值语义 隐式表单具有值语义到 imageblock 中 显式具有在前一个 演示中讨论的引用语义
我们已经看到了在渲染过程中 imageblock 如何在 图块的的寿命范围内工作的 以及我们如何利用这一点 来沟通不同的图像和信息 在我们的开放示例中 我还提到了对于 threadgroup 内存来说也是如此 永久性 threadgroup 内存只被用于图块着色 他非常适合存储在图块中保持不变的数据 比如剔除光列表 让我们来看看如何在 着色语言中利用这个 在本例中 基于内核的图块函数提供了一个完整的光照列表 用于对其图块边界进行筛选 它还从早期的图块分派中 获得了最小和最大的深度 然后将挑选的结果放在 threadgroup 内存中 以方便后续的片段着色器能够访问它 图块分派和片段绘制 都必须在 threadgroup 绑定点上达成一致
最后让我们来考虑一下基于片段的 图块通道所扮演的角色 图块着色鼓励你通过合并 以前多次通过的内容来充分使用 tile memory 图块内存是一种宝贵的资源 因此我们需要显式的 imageblock 来将更多的数据打包到这里 但是整个传递的静态色块 内存布局仍然不太兼容 所以我们需要灵活地转换 tile memory 的布局 因为我们在计算的不同阶段都在移动 基于碎片的图像管道可以实现这种转变 我前面描述的屏障语义确保了在转换 开始之前所有的 tile memory 访问都是完整的 由于片段着色器将 数据复制到图像块中 我们可以确保每个像素都是在原子上进行转换的 让我们来看一个例子 在本例中 我们实现了延迟呈现阶段 并希望通过重新配置 imageblock 以实现一种近似无序的透明技术 我们称之为 Multi-Layer Alpha Blending 我们使用的是基于片段的图块函数 它将旧的布局作为输入 并返回新的布局 通常情况下 你需要使用旧布局中的 数据来初始化新布局 在这里我们从递延渲染阶段 结束了最终的照明值 为了更好地理解图块着色 请确保查看我们的示例代码 它演示了如何在单词传输中 高效使用许多光 图块着色被用来剔除 不影响图块的光 最终 Xcode 中的 GPU 调试器 可以通过在你的着色器中使用它来对数据进行格式化 从而方便地检查 threadgroup 内存 在使用 Xcode 的 GPU 调试器获取捕获之后 你可以将每个 threadgroup 内存视为 绑定资源视图的图块部分中的缓冲区 在那里 你可以用缓冲区查看器 来检查以与你的着色器使用 相同的方式格式化的数据 在这个演示中 我们看到了图块着色是如何使开发人员能够 分析和操作整个图块内容 并通过不同的绘制方式进行交流 以及通过不同的计算阶段来重新规划 tile memory 的 把这些结合在一起 图块着色器 使开发者能够合并多个渲染和计算传递 以便更好地利用 A11 GPU 的更高带宽 和低功率 tile memory 欲了解关于 Metal 2 的更多信息 或是获取示例代码的链接 请访问我们的 Developer 网站 developer.apple.com/metal 谢谢收看
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。