大多数浏览器和
Developer App 均支持流媒体播放。
-
基于 A11 的 Metal 2 - 图像块
图像块使各个 Metal 2 app 能够在 A11 GPU 的高带宽分块内存中定义和操控自定的逐像素数据结构。了解图像块如何在渲染通道的片段和分块阶段之间传递数据,并学习复杂的渲染技巧,如近似顺序无关的透明渲染。
资源
- Forward Plus with Tile Shading
- Order Independent Transparency with Imageblocks
- Tailor Your Apps for Apple GPUs and Tile-Based Deferred Rendering
相关视频
Tech Talks
-
下载
本视频中 我们重点谈谈 Imageblock 你可以使用它 在图块内存中描述图像数据 以便 GPU 高效使用 Imageblock 优化了 访问图块内存中 图像数据的能力 而借助 A11 的 GPU 你可以直接控制 Imageblock 你可以排布像素 以使你的 App 合理显示 还可以直观地移入移出数据 Imageblock 同片段处理阶段 和全新的图块着色阶段深度整合 也可用于传统计算过程 无论哪个阶段 我们都推荐用 Imageblock 呈现图像 因为它可以优化 对二维数据网格的访问 Imageblock 也是 我们在本系列视频中 将会涉及的其他功能的 关键组成部分 首先 让我们来 准确定义 Imageblock Imageblock 是图块内存中的一个二维数据结构 有宽度 高度 以及像素深度 片段函数 只能访问 对应位置上的一个像素 而计算着色器 则可以访问整个 Imageblock 每个像素的结构都会比较复杂 由多个部分组成 每个部分都可以称作 一个图像平面 如此 相邻的部分就可以高效批量储存为 设备内存中的 一个或多个纹理 Imageblock 也可以批量访问 GPU 的格式转换硬件 浮点像素将会转换为 目标纹理的格式以在设备内存中存储 我们来仔细看看 Imageblock 的优势之一 即加快从图块内存中读取图像数据的速度 在 Imageblock 出现之前 你需要将一些纹理 写入线程组内存以进行运算 一次写入一个像素 但 GPU 并不知道 你在处理图像数据 所以你还需要再将这些像素储存回 设备的纹理内存中 一次储存一个像素 有了 Imageblock 你就可以直接储存图像数据 只需一次操作 更为高效 接下来看看 你该如何 在 Metal 中 描述 Imageblock 属性 在一个计算通道中 应该使用这个 API 来描述 Imageblock 的 宽度和高度 每一个调度的 维度可以不同 Imageblock 的像素深度 由着色语言 描述为一个结构 整个 Imageblock 可以作为一个参数 其类型遵照像素深度的结构 我们再来看看着色语言的语法 这个例子中我们描述一个 包含三个元素的像素 每个元素都由不同数目的部分组成 Imageblock 可以作为参数由着色器调用 着色器访问 Imageblock 内部位置时 是借助对 data 方法的引用 这一操作将位置作为参数 返回一个指针 指向一个新的地址空间 称为 threadgroup_imageblock 借助特定位置的引用 我们可以在这个位置读取 写入元素 我之前提到 Imageblock 以平面的形式构成 可以高效存储到 设备的纹理内存中 着色语言中 我们称可以一同储存的相邻平面为一个切片 我们来看一个示例着色器 这个例子中 我们在 Imageblock 中加载了一个源纹理 对这个区块进行了一些图像操作 并且准备将色彩元素 存储到目标纹理中 我们只需要线程组中的一个线程 来执行写入 首先 必须建立同步屏障 确保所有线程 已经结束对 Imageblock 的处理 注意 Metal 为同步屏障添加了新的内存对象 这样一来 我们只需等待写入 Imageblock 的过程结束即可 接下来 我们使用 slice 方法 从 Imageblock 中 获取想要的切片 slice 方法可以引用切片上 任何位置的像素元素 最后 我们将切片写入目标纹理
每一个 Imageblock 都大致对应 纹理的一个区域 所以 我们需要设置偏移量 以写入 Imageblock 接下来我们看看 片段函数中的 Imageblock 是如何设置的 与计算过程中的 Imageblock 不同 渲染过程中的 Imageblock 维度 始终保持不变 并且使用这些参数进行设置 Imageblock 的像素深度可以使用 着色语言声明为一个结构 如之前着色器部分所示 而片段函数 同样支持使用渲染过程附件 声明像素深度 我们来看一下语法 这个例子中 我们使用着色语言 直接声明像素结构 由于片段函数只能访问 Imageblock 中隐式的位置 参数的类型应当是结构本身 但要标记为 imageblock_data 属性 我们还需要将返回值 标记为同一属性 这样一来 Metal 就可以生成正确的访问指令 接下来我们看看在同一个例子中 如果声明像素结构时 使用传统渲染过程附件会是什么样子 这个形式和你已知的语法完全一致 实际上 渲染过程中你一直都在使用 Imageblock 因为图块内存一直都是 A-series GPU 的重要组成部分 新颖之处在于 Metal 2 使得图块内存一般可以访问 这个形式隐去了隐含的 Imageblock 存储格式 而这个格式则是从附加在渲染过程上的 纹理中衍生出来的 无论纹理存储类型如何 数据都以浮点数或整数 出现在片段函数中
A11 和之前架构的另一个不同 在于这些隐含的 Imageblock 格式转换 在何处进行 在 A7 到 A10 的 GPU 上 存储格式在图块内存中 扩展为浮点数 因此 Metal 会将每个像素格式存储为两个尺寸 一个存储在设备内存中 另一个在图块内存中 存储为渲染过程附件 在 A11 上 格式转换发生在着色器内核 每次从图块内存读取并写入 临时寄存器的过程中 这样一来 你就可以更大程度地 利用图块内存
现在 你可以选择如何声明像素类型 那我们就来看看如何做出最佳选择 隐式 Imageblock 适用于片段函数必须 支持多种渲染过程附件布局的时候 因为它可以抽取底层的存储格式 隐式 Imageblock 同样适合 读区和存储动作 因为此时 结构对 API 是已知的 而另一方面 显式 Imageblock 则可以让你描述更复杂的像素结构 显式 Imageblock 也不需要主内存支持 所以 它很适合处理仅在渲染过程中 生成并使用的 临时数据 接下来 我们谈谈到底什么是 复杂像素结构 接下来的例子里 我们将存储 多个半透明颜色以及它们每个像素的深度 之后就可以整理 排列 生成更准确的透明效果 首先 我们只声明一个片段 再声明一个数组 将它嵌套在一个顶级结构中 就可以将它输入输出至着色器了 要用渲染过程附件表达这个结构 不是个好办法 还会掩盖作者的本来用意 当然 你不需要自己决定 是用隐式格式还是显式格式 因为 Metal 可以帮你选择正确的工具 Mixing 同样让你可以逐步增加 原本代码中使用的 Imageblock 数量 还可以方便你将新特性 整合今已有的着色器中 享受显式格式的优点 同时使用两种形式 也很简单 只需提供两个 Imageblock 参数即可 我们来看一个例子 如你所见 我们可以给出两个 Imageblock 既作为输入 又作为输出 color 和 imageblock_data 属性 让 Metal 能够明白 哪些切片是从渲染过程附件得来 而哪些不是 每个函数至多可以 分别为输入和输出声明两个 Imageblock
显式 Imageblock 可以让你使用封装类型 准确控制像素布局 Metal 着色语言已经提供了 封装浮点向量类型 一般用来描述顶点数据布局 和常数数据布局 但现在我们需要新的封装类型 能够使用隐式 Imageblock 和纹理像素格式 实现之前描述的效果 Metal 2 在着色语言中添加了这样的类型 这些格式可以使用之前提到的 读取/存储硬件 转入转出成浮点型 此外 这些新的封装格式 也可以用来描述顶点和常数数据布局 让我们来看看如何用着色语言 声明这些新类型 这个例子中 可以看到一些新的封装类型 它们用来描述 Imageblock 和顶点数据 这些类型需要你来声明 着色器核心内使用的存储格式 和解析格式 我们来看看都添加了哪些新的 封装数据格式 如你所见 Metal 的着色语言添加了 1 2 和 4 组件标准化类型 每个类型都支持 8 位或 16 位组件 我们还加入了有符号和无符号的变体版本 以及对更为专门的 32 位格式的支持 比如 10e2 迷你浮点 共享指数和 sRGB 最后 Xcode 的 GPU 调试工具直接支持 Imageblock 的可视化和检查 每一个切片都可以像纹理一样进行检查 这里上面看到的是我们示例代码中 G-Buffer 布局的例子 在下面 可以看到同一个 Imageblock 在 Xcode 的 GPU 调试工具里的样子 绑定资源视图的图块列表下 将 Imageblock 切片 以一套纹理的形式呈现 这里 你可以检查每一个切片 就像检查纹理一样 本视频中 我们看到 Imageblock 可以帮你高效地将许多像素 从图块内存移至设备内存 以及精确控制图块内存中的 图像数据 助你提高存储效率 我们还看到 我们可以充分利用 A11 GPU 的封装/解析硬件 将其用于 Imageblock 和其他地址空间 更多关于 Metal 2 的信息 以及访问源代码的链接 请登录 developer.apple.com/metal 访问开发者网站 谢谢你的观看
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。