大多数浏览器和
Developer App 均支持流媒体播放。
-
基于 A11 的 Metal 2 - 图像块采样覆盖控制
图像块采样覆盖控制可在一个分块着色器中提供对多采样跟踪数据的访问,从而支持开发自定 MSAA 解析算法等。了解 A11 GPU 如何跟踪独特样本,然后探索视频中的示例,看看如何通过表面聚合来优化密集几何结构的渲染。
资源
相关视频
Tech Talks
-
下载
基于 Imageblock 和图块着色的 Imageblock 采样覆盖控件可以让你 有新的机会来优化多重采样渲染通道 它是为 A11 GPU 内置的增强多重采样硬件 专门设计的 Imageblock 采样覆盖 是 Metal 2 在 A11 上新特性介绍视频 的第三期
在详细介绍 Metal 2 的增强多重采样 特性之前 先来快速回顾一下 多重采样抗锯齿 多重采样抗锯齿 或 MSAA 是一项用于改善基元边缘外观 的技术 通过将每个像素 使用不同深度和颜色采样呈现来实现 首先 我们来看看 GPU 不使用多重采样 是如何渲染一个三角形的 这是一个 4 x 4 的像素网格 表示你的颜色插件
GPU 的栅格化工具对像素中心采样 来确定它是否被基元覆盖 让我们放一个三角形
所有被基元覆盖的像素中心 被标为红色 如果每个像素只有一个采样点位 那像素分类的依据就只是看中心 有没有被覆盖 在成品图中你可以看到 边缘锯齿的典型表现 那些阶梯状的东西就是所谓的“锯齿” 再来看看同一个三角形 但这次使用多重采样抗锯齿渲染 这个例子中 每个像素 有四个均匀分布的采样点位 当每个像素有四个采样 GPU 的栅格化工具可以为基元 生成更平滑的覆盖 解析多重采样插件后 GPU 会平均各采样的值 来决定每个像素最终的颜色 这样就能生成平顺的边缘 并且减少阶梯状效果的出现 在传统多重采样过程中 为提升边缘外观所做的权衡 包括混合采样耗费的额外计算资源 多重采样插件纹理占用的 更大的内存空间 以及存储解析每个像素多个采样所需的 更高的内存带宽 Apple 的 A-series GPU 拥有高效的 MSAA 过程 可以专门解决这些权衡问题 硬件会跟踪 哪些像素包含基元边缘 这样 混合只对包含不同采样值的 像素内的采样点执行 借助 A-series GPU 的 Metal 你不再需要 额外的内存容量 可以为多重采样插件 使用不需内存的 渲染目标 完整的采样数据 只会临时存储在图块内存中
通过使用 Metal 的多重采样解析存储动作 可以避免占用额外的 系统内存带宽 因为解析动作可以直接在图块内存 和解析插件之间进行 另外 Metal 2 还引入了可编程的采样点位 可以让你来选择采样点位 并控制采样模式 借助 A11 上的 Metal 2 多重采样在混合时更加高效 现在的 A-series GPU 已经可以跟踪边缘是否穿过像素 A11 的 GPU 则扩展了跟踪能力 精细度更高 这是通过跟踪 每个像素内独特采样的数量来实现的 即便不使用其他 Metal 2 的特性 现有的使用多重采样的 App 借助 A11 GPU 的增强多重采样硬件 进行混合时也将更为高效
通过充分利用 Metal 2 的其他灵活特性 如 Imageblock 和图块着色 Imageblock 采样覆盖控件可以让你访问 每个像素的采样覆盖跟踪数据 让你能更好地控制 多重采样渲染通道 借助 Imageblock 采样覆盖控制 你的图块流水线可以在渲染通道内的任何时刻 使用自定义解析算法 解析采样数据
为理解 Imageblock 采样覆盖控件 为何更为灵活 首先需要了解边缘跟踪 在 A-series GPU 上是如何工作的 当前的 A-series GPU 将场景栅格化为图块 每个图块包含的元数据 可以跟踪像素内是否包括基元边缘
这幅图里 红色像素包括基元边缘 白色像素则不包括 包含边缘的像素数量随着 场景内几何形状密度的增加而增加 当像素包含基元边缘时 就意味着它有多个独特的采样值 因此 混合方程会对包含边缘的像素内的 每个采样执行 不包含边缘的像素 只需混合一次
A11 的 GPU 会用更高的精细度跟踪边缘 包含边缘的像素 一般只会有几个独特的采样点 A11 GPU 的增强多重取样 可以只跟踪混合这些独特的采样 在 Metal 着色语言中 我们将这些独特的采样称为 色彩 我们来看一下 A11 GPU 如何提升多重采样混合的性能 对包含基元边缘的像素 A11 的 GPU 会跟踪 像素内独特色彩的数量 由于基元与像素相交或完全覆盖 像素内的色彩数量 也会随之增减 A11 的 GPU 会自动跟踪这些变换 右图中 像素包含四个采样 但只有两种色彩 当 A11 的 GPU 需要在这个像素内渲染下一个基元时 只有两个独特的采样需要混合 对于使用可编程混合的 高级渲染算法 节省的资源会相当可观
让我们取一个片段 进行几次这样的色彩跟踪变换 起初 每个片段只包含一种色彩 表示所有的采样 也就是渲染通道开始时的缺省色彩 如果基元边缘穿过某个像素 A11 的 GPU 就会创建一个新的独特色彩 将这个色彩赋给被覆盖的采样 绿色三角形覆盖的这两个采样 被赋予了新的色彩 1 没有被覆盖的采样 仍然赋予色彩 0 假设下一个穿过这个像素的基元 是一个红色透明三角形 红三角形覆盖了三个采样 当前的 A-series GPU 会分别混合 这三个被覆盖的采样 而 A11 GPU 只混合两次 因为其中两个被覆盖的采样 共用同一个色彩 这个例子中 色彩 1 是红绿两色的混合 GPU 会在目录 2 创建一个新色彩 因为这个色彩与之前的都不一样 当基元穿过像素时像素内的独特色彩 数量也会随之增加 但有时硬件会减少 独特色彩的数量 这里 一个不透明也无需混合的三角形 完全覆盖了像素 所有四个采样都被蓝色取代 所以 A11 GPU 会将三种色彩合并成一种 因为所有的蓝色采样 又可以只用一种颜色表示了 A11 GPU 的增强多重采样硬件 十分强大 我们也将它扩展到 Metal 着色语言中 让你使用 Imageblock 采样覆盖控制 直接控制采样覆盖 借助这项新功能 图块流水线就可以 通过改变像素的色彩覆盖 在渲染过程中随时解析采样数据 由于你使用 Metal 着色语言编写核心 这就意味着你可以编写自定义解析滤镜 我们来看一个简单的例子 首先 我们有一个核心 其中包含一个 Imageblock 参数 接下来 我们查询 Imageblock 内 给定位置上的采样数量 对于每像素四采样的渲染过程 返回值可能为 1 2 3 或 4 取决于每个像素内有多少种独特色彩 多重采样的 Imageblock 可以为每个采样或色彩 返回 Imageblock 数据 这个例子中 我们会得到色彩 c 的 Imageblock 数据 由于这个示例会按照独特色彩的 数量来循环 我们还需要考虑每种色彩覆盖的 采样数量 这可以通过获取该颜色目录的 覆盖遮罩 再调用 popcount( ) 获取遮罩内的置位数量来实现 接下来 我们将它除以每像素内的 采样数量完成解析 再将解析值和完整采样遮罩 写回 Imageblock 通过将完整采样遮罩写入单个值 A11 的 GPU 会将所有采样数据 合并为一个色彩 这是基本解析的一个例子 但由于这是一个图块流水线 你可以自行编写内核 用最适合你的 App 的方式 来解析采样数据 刚才这个例子 就是如何编写自定义解析滤镜 我们再来谈谈另一个使用图块着色 解析采样数据的原因 一些 App 会渲染很复杂的场景 其中包括很多不透明的几何图形和很多透明的几何图形 比如粒子 虽然 A11 的 GPU 会尽其所能 只混合每个像素的独特色彩 但如果你的场景有许多已经混合的几何图形 还有很多过度绘制的现象 那最好在重度混合阶段之前 先使用图块流水线 解析采样数据 借助 Imageblock 采样覆盖控制 可以在渲染不透明几何图形之后 使用图块流水线解析采样数据 以确保在混合之前每个像素 只包含一种独特色彩 我们再来看一个更高级的例子 这个例子使用图块流水线 改变采样数据的覆盖 由于图块流水线可以使用 Compute 函数实现 你也可以实现将所有值平均之外的功能 我们的 Surface Aggregation(表面聚合)示例 App 首先 使用多重采样单通道延迟着色算法 还使用基于图块的核心调度 来减少延迟通道内的 着色采样 这个算法的目的是在代价昂贵的 延迟通道内减少着色采样 同时保留多重采样抗锯齿 平顺边缘的好处 这里 我们不会深入介绍算法的细节 所以请一定要下载研究 我们的 Surface Aggregation 示例 App 但现在 我们来直观地看看 这项技术如何 减少着色的成本 这两幅图表示的是 G-Buffer 内 包含多于一个采样的像素 左图表示的是 合并表面前的 G-Buffer 右图表示的 则是合并表面后的 G-Buffer 表面聚合内核可以减少 需要着色的 G-Buffer 采样的 数量 如右图所示 包含多个独特采样的像素 只出现在真实的折痕和深度边界上 在 A11 GPU 上的 Metal 2 之前 这个算法需要 专门的渲染通道来实现算法的每个阶段 造成了许多对系统内存的往返访问 但如果使用 Imageblock 采样覆盖控制 算法的全部三个阶段 都可以合并为一个渲染通道 可以给你的 App 节省大量的内存带宽 如图所示 全部三个阶段都对 Imageblock 进行操作 所有需要的数据都存放在图块内存中 首先 你需要将 G-Buffer 渲染至图块内存中的 Imageblock 接下来 你需要调度 表面聚合图块流水线 将大量的 G-Buffer 采样 聚合并减少数量 最后 延迟着色通道 只需对每个聚合采样进行着色
如果你有兴趣深入了解这项技术 请访问视频结尾的链接 下载示例 App
总结一下 首先 我们谈论了 A11 GPU 里为多重采样进行的硬件改进 A11 的 GPU 可以跟踪每个像素内 独特采样的数量以减少混合成本 这一优化既适用于 API 混合 也适用于可编程混合 接下来 我们探讨了 Metal 2 为 A11 的 GPU 所做的提升 可以让内核在图块着色时 利用强大的硬件特性 借助 Imageblock 采样覆盖控制 你可以编写自定义解析内核 将它在除渲染通道内的任何时候进行调度 以实现新的功能强大的优化 A11 GPU 的增强多重取样 和 Metal 2 新的着色语言特性 可以借助新技术让数据充分利用硬件 你可以使用这项特性 在单个渲染通道内实现表面聚合 这样的算法 更多关于 Metal 2 的信息 以及访问示例代码的链接 请登录 developer.apple.com/metal 访问开发者网站 谢谢你的观看
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。