大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 Metal 调试、性能分析及资产创建工具
探索 Xcode 如何帮助您将 Metal 调试、性能分析和资源创建工作流程提升到一个新的水平。探索用于光线追踪和 GPU 分析的最新工具,并了解 Metal Debugger 工作流程。我们还将展示如何使用纹理转换器工具,该工具支持所有现代 GPU 纹理格式,并且可以轻松集成到您的多平台资源创建管线中。
资源
- Debugging the shaders within a draw command or compute dispatch
- Metal
- Metal Developer Tools on Windows
相关视频
WWDC23
WWDC22
WWDC21
WWDC20
-
下载
嗨!我是伊格 今天 我要跟你分享Metal调试器 所有新功能和优化 今年 我们提供更多 支持Metal的功能 像是光线追踪和函式指标
我们新增了全新的效能剖析作业流程 像图形处理器时间轴 以及稳定的图形处理器效能状态 来帮助你在Apple平台 发挥图形处理器的最大效益
我们也优化了 其他你熟悉且爱用的调试工作流程 包括对着色器验证支持得更广 和更精准的抓取控制
我们也带来纹理压缩的进阶功能 这部分稍后我同事亚曼达会说明 首先 我们来聊聊光线追踪 去年 我们介绍了新Metal光线追踪 API 如今 我们开始 在Xcode 13的Metal调试器支持 连同函式指针和函数表 这能让你的着色器更有弹性 而动态库 能让你打造出抽象且可重复使用的 着色器库程序代码 此外 在光线追踪部分 我们也带来 全新工具 加速架构查看器 来看看Metal调试器里的 光线追踪功能 我打开了一个示范应用程序中 现代渲染器的图形处理器追踪 这已经调整来让Metal光线追踪 能达到阴影和环境光遮蔽的效果 这个编码器创造了美丽的光线追踪 阴影地图 我选择了一个分派指令 让你能看看加速架构查看器的 能耐 从这里 我会打开加速架构查看器 要进入新的加速架构查看器 这里 你可以看到熟悉的 小酒馆场景的几何图形 在右边 它的概述在左边 点击场景的一个实例 会将查看器和场景的概述选取 你可以通过展开 看到变换矩阵和其他实例属性 你也可以按住选择键 同时点击场景查看器 来选取单一几何形状 这也能用来选取场景轮廓 反之亦然
你也可以看到在查看器中 类似相交函数 用在加速架构上 但加速架构查看器 不只能显示几何图形 在右下角 你可以找到一系列强调模式 这让你能将场景中的对象 可视化 举例来说 包围体遍历模式 能协助你将复杂的几何形状可视化 深一些的蓝色代表 层次包围体的遍历 在运算耗能上 相对较高的区域 在全部模式中 我们有这个小查看器 在你光标滑过场景不同区域时 示意相关信息 这里显示包围盒遍历 和原始交集的数据
为了更有弹性 我们也新增了遍历设定 有了这个设定 你就能 将加速架构查看器配置成 你在着色器的 交集对象里能找到的相同属性
还有很多说不完 关于光线追踪 如果你想了解更多 看看今年的 这个会话“使用Metal 光线追踪探索混合渲染” 如果想了解更多关于API的概略介绍 看看去年的分享 “使用Metal探索光线追踪” 接下来 我们来聊聊效能剖析 剖析你的应用程序效能是个重要任务 我们已经有很多很棒的工具任君挑选 譬如 在Instruments 使用Metal追踪 你可以用时间轴检视中央处理器 和图形处理器在不同阶段渲染的 处理时间 图形处理器计数 和着色器的时间轴 至于Metal调试器 图形处理器计数显示丰富的信息 直接来自图形处理器 不论是编码器计数 画图计数 两者都是非常好用的工具 能提供你的应用程序额外层面的检视 但同步这些检视得花费额外功夫 因此 我很开心向你展示 全新图形处理器效能剖析工具 它将Metal系统追踪功能 和图形处理器计数整合为一 容我介绍Metal调试器中的 图形处理器时间轴 专为Apple图形处理器设计的新工具 让你对效能数据 有新的见解 能帮助你找到应用程序中 潜在可优化之处 我们来看看最新版 这套效能剖析工具
图形处理器时间轴 可以在效能控制台下方看到 你能在调试导引器中找到 在你选择你的应用程序框架后 当你开启效能控制台后 你能看到一系列追踪数据 平行显示 在往下之前 我要说明一下 为何编码器追踪会显示在这 在Apple图形处理器中 顶点和分阶段渲染任务 以及运算分派是同时运作的 Apple图形处理器架构让它们能如此 运用叫做 “基于图块彩现”的技术 我们认为能看见Apple图形处理器 在你的应用程序中平行的特性很重要 这就是图形处理器时间轴 派上用场的时候 在最上方 你能看到 顶点、分段、运算编码器时间轴 搭配每个编码器显示它使用的资源 方便快速检视 在编码器下方 你会看到使用占比、带宽 和计数限制器 我们来看看编码器时间轴的细部功能
你可以展开每个编码器追踪 来看着色器时间轴的总计
展开时间轴更多 能用瀑布式检视 个别着色器
编码器的操作十分容易 选择一个编码器追踪 能看到右边有全部编码器的列表 在这你可以按平均处理时间排序 点击时间轴上的个别编码器 在侧选单能看见更多相关信息 举例来说 这里可以看到 这个渲染指令编码器的附件
你可能有留意到当你选择编码器时 它是开启状态时 时间区段 在整条追踪列是被突显出来的 这能让你轻松检视 不同阶段重叠处 以及编码器的相关计数数值
移开时间轴检视模式 你可以看到图形处理器计数 通过切换到计数分页 或你可以直接打开编码器的内容选单 在计数这里找到
这只是图形处理器时间轴的一小部分 想了解更多 关于Metal调试器如何使用 在帮助你了解应用程序效能 看看今年的会话 “为高端游戏优化Apple 图形处理器”
展示了应用程序效能剖析的新方法后 了解到效能是大幅取决于 几个因素是很重要的
讲到Metal 图形处理器的效能状态 是非常重要的因素 这是受操作系统控制的 会降低或提升 依据装置的热气流 系统设定、图形处理器使用率 和其他参数
这些状态改变会影响 你看到的效能剖析结果
今年 我们带来新的方法 让你进行应用程序效能剖析时 可以得到更连贯的结果 我们增加新的方式 让你观测及调整 图形处理器的效能状态 横跨整套Metal工具 从Instruments和Metal系统追踪 用来记录实时效能 到Metal调试器 用来效能剖析图形处理器追踪 最后 Xcode的装置状态 作一般使用情境 首先 我们来讲Instruments 今年 我们新增图形处理器状态栏 在Metal系统追踪 和其他追踪列同步呈现 你的应用程序效能表现的关联 连同装置效能状态 但记得 能看见效能状态 只是其中一部分 要取得连贯又能重现的 效能剖析结果 你还需要新方法来设定 图形处理器的效能状态在装置上 今年新增的功能 能引发图形处理器的特定效能状态 在你在Instruments追踪纪录时 只要在录像的选项 在开始录像前选择一个效能状态即可 就能录下效能纪录 如先前那样 Instruments会引发你选择的状态 在追踪的整个过程 只要装置能支持 有时 你可能需要检查 是否有既存的Instruments追踪 已有图形处理器的效能状态 已在录像中被引发 你能在录像设定区块 找到这个信息 就在信息弹出框
现在 你知道如何在Instruments 检视并引发图形处理器效能状态 第二个达到 连贯的图形处理器效能状态的方法 就是Metal调试器 默认状态下 当你撷取应用程序的 图形处理器追踪时 Xcode会自动做效能剖析追踪 它会用撷取当下装置 相同的效能状态来做剖析追踪 这个状态有可能因为 我们刚提到的因素而有所变化 假设 相反的 你想选择 特定的效能状态 用调试列的停止观看按钮 在你选取后 Metal调试器会重新帮你的 图形处理器做效能剖析 在它完成后 按钮会亮起 代表已达到连贯的效能状态 还有 在总结页面的效能区块 现在能快速显示新的效能数据 连同你选取的效能状态 这两个方法包含在整套Metal工具中 但有时 你可能想在 效能剖析工作流程之外 引发连贯的效能状态 第三个设定图形处理器 效能状态的方法 是通过装置条件
假如你想测试你的应用程序 在不同图形处理器效能状态下的表现 你可以选择这个 在Xcode 13 我们新增了 图形处理器效能状态的装置条件 它能迫使操作系统 在装置上使用特定状态 只要装置能支持 并持续连接Xcode 你可以从Xcode新增这个条件 假如你进入窗口装置与模拟器 从那选择你的装置 滑至“装置条件”区块 并新增“图形处理器 效能状态”的条件 设定你要的等级 按下开始 在你要套用图形处理器效能状态 在装置时 在你结束后 按下停止
这些新方法让你能检视并改变 图形处理器效能状态 直接通过我们的工具 就能帮助你做效能剖析 与测试你的应用程序 我认为你会非常喜欢 我们在效能剖析工作流程 最新的功能和优化 我希望这些能帮助你 打造更好的应用程序 现在 我们来聊聊Metal调试器 今年的其他改良处 首先 我会说明 着色器验证的改良处 接着 我会展示精准抓取控制 在那之后 我会让你看看 新的管线状态工作流程 最后 我想介绍两个新功能 关于着色器调试和效能剖析 区别调试信息与选择性着色器调试 去年 在Xcode 12 我们介绍了着色器验证 帮助你诊断图形处理器的执行期错误 像超越定界权限或其他
记得要是着色器验证有打开 并且编码器跳出验证错误 你会在问题导引器看到执行期问题 显示中央处理器和图形处理器回溯 造成错误的指令
我们已经有段会话针对这做详细说明 要了解更多关于运用着色器验证 看看去年的解说 叫做 “在Metal调试图形处理器错误”
今年 我们延伸着色器验证 支持更多使用情境 能在使用间接指令缓冲 动态库 和函式指标 与函数表使用 让你在开发模式中 更广泛地运用着色器验证 横跨整个应用程序 接下来 我要给你们看 新的精准抓取控制 但首先 看一下撷取按钮 看起来像我们的新Metal图标 位在调试列 在Xcode窗口底部 点击后 新选单会出现 这个选单让你选择撷取范围 预设是撷取一屏 你可以指定你想撷取的数量 至多五个 你也可以选择撷取一系列指令缓冲 是带有相同母装置 或指令队列 和代表特定Metal图层的那些 或甚至自定义你要的范围 使用MTLCaptureScope API从应用程序代码定义 这些新控件让你 在决定你的Metal指令如何及何时 要撷取时 能更加发挥
再来 我们来聊聊Metal函式库 及管线状态 这些是你的Metal应用程序中 关键的建置阻碍 而在Xcode 13 我们让它变得简单 在检查全数应用程序在使用的 管线状态及函式库时 现在来看看它实际如何运作 这里 我已经撷取了 一个图形处理器追踪 来自范例应用程序的现代渲染器 我想要看G缓冲管线状态如何运作 所以我选择了这个绘画指令 如果我检视包围资源 可以看到被使用的管线状态 打开它会带我到管线状态查看器 从这 我可以检查函式 和其他与管线状态一起创建的对象 此外 从查看器 我可以看到与状态有关的 效能数据 或是我可以去内存查看器 从那检视状态 在Xcode 13 内存查看器现在能显示 管线状态在你的应用程序 用掉多少内存 这些只是一部分新增功能 能让检查管线状态更容易 横跨Metal调试器 在你看应用程序的图形处理器追踪时 接着 我们来聊聊在Metal调试器中 使用着色器调试与效能剖析 现在 假如你想用这些功能 你有两个选择 第一个选项是编译原始码的函式库 在应用程序运行时 第二 较好的选择 使用线下嵌入资源建置Metallib文件 并在执行期再加载那些文件 不过App Store规定 并不允许你用调试的Metallib文件 发布你的应用程序 也就代表 若你在线下编译函式库 又想要调试你的着色器时 你必须编译两次 一次是跟嵌入资源 在开发阶段时 一次是不含资源的 为了分配用 今年 我们有所改变 现在你可以用资源产生分开的档案 连同其他调试信息 在编译Metallib时 这些档案有Metallibsym的扩充 能让你对着色器调试及效能剖析 也不用嵌入额外信息 在个别的函式库中 把它们分开的最大好处是 你再也不用有两个版本的 同个Metallib 另一个好处是 有了这些Metallibsym文件 你就能调试着色器 甚至在应用程序的发行版上 就不用在着色器资源上妥协
我来举个例子 展示如何编译着色器原始档 用Metallibsym转成Metallib文件 我先从终端机指令xcrun开始 用一般方式编译Metallib 要产生Metallibsym文件 我仅仅需要加上旗标 “record-sources”夹带 “flat”选项 再执行编译程序 现在 当我尝试调试已编译的 着色器时 带有分开调试信息文件 我会被提示要导入档案 点击导入来源 打开对话 列有全数函式库 以及是否已导入源文件
从这 我能导入任何 Metallibsym文件 一旦导入 函式库和对应资源 会自动配对
当我完成导入时 我可以关闭对话 现在我可以看到着色器的资源 并进行调试
还有最后一个调试改善我想展示 叫做“选择性着色器调试” 如果你的应用程序使用大型着色器 你可能会发现 启动着色器调试要花一段时间 为改善此情况 今年 我们带来选择性着色器调试 能帮助你限缩调试范围 就能更快调试着色器 我们来看类似大型着色器实际的状况
我想调试这个图形处理器 自适应可伸缩纹理压缩技术解码器 我知道如果我试着调试整个内核 着色器调试器要花很长的时间启动 我不想要等那么久 所以 换个作法 我可以限缩调试范围 到刚好decodeIntegerSequence 这个函式 我可以按右键 并选择调试函式 这会打开“可调试函式”选单 并显示已选取的函式范围 可以看到 调试器几乎立刻启动
选择性着色器调试 是定位程序错误很棒的方式 在大型着色器中快速做到 这些是我今天想带你们看的 Metal工具全部的改善 现在 亚曼达会告诉你 我们纹理压缩的 进阶功能 亚曼达? 谢谢 伊格 我会带你们看过我们今年 为纹理压缩带来的更新 在开始之前 我想简短讨论一下 Apple平台的纹理压缩基础概念 纹理压缩 以这为例 是固定比率、破坏性数据压缩的 纹理资料 这主要是为了能线下压缩 静态纹理数据 像是印花或常态地图 虽然你可以在执行期压缩 动态纹理数据 这不是我今天要讲的 大部分纹理压缩 通过把纹理分裂成块执行 并压缩每块成一对颜色 这对颜色定义本地调色盘 包括其他 从这些端点内插的颜色 以及从这个调色盘选择的画素前指标 每个格式有它的优势 适合不同纹理资料 Apple图形处理器也支持 无损帧缓冲压缩 从A12装置起 在优化带宽上表现良好 看看去年的会话 “优化使用图形处理器计数器的 Metal应用程序与游戏” 来了解更多关于量测图形处理器 在应用程序中使用的内存带宽 另个选项是让纹理档案 无损帧缓冲压缩 在图形处理器的纹理压缩之上 我在简报中会讲到 这能让你压缩 下载应用程序的大小 在说明定义了 纹理压缩后 我来谈谈纹理压缩 能为你的应用程序带来的好处 纹理压缩是在开发应用程序中 很重要的一个步骤 总体而言 大多游戏记忆足迹 是由纹理组成 使用纹理压缩能让你加载更多纹理 进入内存 并使用更多细节的纹理 来创造视觉上惊艳的游戏 压缩也让你 减少应用程序的足迹大小及内存 说明完基础概念后 我要来讨论目前在Apple平台上的 纹理压缩工具 iOS软件开发工具包现有的纹理工具 有相似的简单管线 纹理工具读取输入的图片 需要的话产生mipmap 将纹理压缩 一块接一块 再将结果写入新的输出档案 但当图形算法的复杂度提升时 纹理会需要更进阶的处理 而处理的核心就是 在对的颜色空间进行作业 在转化过程中 最小化舍去 和数值精度之间 了解这以后 我们设计了新的压缩工具 叫做纹理转换器 用来处理纹理运算复杂度上 必要的提升 提供你一批新选项 我们来详细看看 我们如何重新打造 纹理运算管线 在Apple平台上 纹理运算管线已被彻底重建 让你能使用 全功能纹理运算管线 搭配纹理转换器 纹理转换器让你能达到 一系列业界知名的压缩器 来支持多种压缩格式 并提供选项让你在 压缩速度及图片质量间权衡 你能指定要使用哪个压缩器 或允许纹理转换器选择 基于压缩格式、质量级别 及其他选项 现在每阶段都可全面由你配置 而且纹理处理器能辨识伽玛 为了与你的全数内容管道串接 纹理转换器支持masOC和Windows 并优化支持Apple Silicon 我们来看看每个展开的管线阶段 从伽玛开始 伽玛校正是非线性作业 编码和解码图片中的亮度 纹理可以被编码在多个伽玛空间 最佳选择是依据 纹理代表的数据类型 多数视觉数据 像是印花或光线映射 在编码是在非线性空间时 表现最佳 像是sRGB 非视觉数据 像是普通地图 应该要在线性空间中编码 这个选择给你更高准确度 在较暗的地方 非视觉数据 像是普通地图 应该要在线性空间中编码 压缩应在你的目标颜色空间执行 并使用“gamma_in” 和“gamma_out”选项 你可以输入一个浮值 在线性伽玛空间 也可以用“sRGB”字符串定义 该颜色空间 你也有使用这些选项的弹性 来转换到不同的目标空间 其他作业 像是mipmap生成 应在线性空间执行 我现在来带你们看线性空间运作阶段
现在输入已被转换为线性伽玛空间 线性空间作业已经执行 在输入纹理转换 至特定目标伽玛空间前 这三个阶段为物理性转换 mipmap生成 和阿尔法处理 而部分有子阶段 我会从物理性转换开始 通过定义任何轴的极大值 你可以缩小图片 依你所需的最高级mipmap 在这阶段 你也可以控制 大小调整筛选和大小调整进位模式 大小调整筛选选项使用不同算法 帮助你减少mipmap的模糊处 在维度大小下降时 大小调整进位模式 使用max_extent合取 在调整图片大小时 当超过max_extent时 来源图大小被调整 而原始图片部分则被保留 这个特定进位模式 会在寻找目标维度时使用 如果你不确定要用大小调整筛选 还是大小调整进位模式 多数时候我们会默认运作良好的模式 在这阶段的翻转选项 让你能控制X、Y、Z轴的 线性转换 转换后是mipmap生成 大多是使用在纹理运算用途 Mipmap是预先计算的图片序列 随着序列进行 分辨率会下降 用在提升渲染速度与减少混叠 各层级的高和宽 比前个层级小两个力
当自制mipmap生成时 定义你要的最大数值 mip会筛选使用 纹理转换器预设使用Kaiser筛选器 带有“box”和“triangle”的 筛选选项
线性空间运算的最后一步 是阿尔法处理
如果阿尔法覆盖有开启 这要先套用 使用特定阿尔法对照值 阿尔法覆盖 用覆盖面替换掉阿尔法合成 在抗混淆时 或半透明纹理被使用时 能依序独立透明显示 在渲染你的游戏的稠密绿色区块 是特别实用的工具 再来 就能看到舍弃 保留和预乘阿尔法频道的选项 在预乘阿尔法 你的图片的部分透明像素 将用蒙版颜色预乘
在最后的线性空间运算阶段 我们准备回到目标伽玛空间 并压缩已运算的mip层级
纹理运算的最后一步是压缩 压缩阶段可被分为 两个子阶段 频道映射和编码 频道映射是一个技术 用来优化一般用途的纹理压缩算法 为特定数据型态
在纹理转换器指定一个频道制图 是个选项 假设你真的想使用它 纹理转换器目前支持 两种频道制图模式 RGBM编码和常态地图编码 我要来详细说明这两个格式 从RGBM编码开始 RGBM编码是压缩HDR数据 变成LDR的技术 通过在阿尔法频道储存乘数 并使用这个乘数缩放RGB频道 这是一张教室图片的HDR范例 这是同一张教室图片 将乘数储存至阿尔法频道 在灰阶中可视 我来告诉你如何计算乘数 使用代码范例来编码RGBM RGBM编码简化的假代码函式 我会说明让你了解 编码RGBM的机制 这个片段包括使用RGBM_Range 全新参数 用来设定RGBM 和默认值到6.0的区间 为了要计算RGBM的阿尔法值 乘数 首先 我要决定 输入纹理的红色、绿色 和蓝色频道最大值 这就完成了Metal的max3函式 然后这个最大值被RGBM_Range除 为了要计算编码后RGBM的 红色、绿色和蓝色频道值 首先 先前计算的乘数 是用RGBM_Range乘回来的 这用来缩放存放在 阿尔法频道的值 再来 输入的纹理除以 最终乘数值 要解码着色器的RGBM 你乘上范例的RGB 用阿尔法和固定因素 如同我在编码函式中展示的 我会说明解码RGBM代码片段 来示范如何做到 这个缩放因素要重新计算 通过乘上RGBM阿尔法频道 也就是乘数存放处 用RGBM_Range 原始纹理的RGB 是用RGBM范例乘上去后算出来的 用计算过后的乘数 现在我介绍了RGBM编码 我要说明常态地图编码 在多数情况 说到常态地图 我们指的是物体空间常态地图 当编码常态物体空间时 我们知道每个常态是一个单位向量 这个的好处是它能 呈现在两轴 第三轴便能轻易推算出执行期 这让我们能重新映射两个频道 极大化利用 纹理压缩算法 并达到较佳的压缩质量 与将XYZ压缩成RGB相比 你如何重新映射频道会根据 压缩格式有所不同 我会用一个用自适应可伸缩纹理压缩 技术编码的常态范例说明 用这张表引导 使用自适应可伸缩纹理压缩技术 编码时 红色、绿色和蓝色频道 被设为X组件 而阿尔法频道被设为Y组件 颜色对应到该频道 X和Y组件会被重分配回到 常态编码范本那样 纹理转换器为你控管编码重新映射 通过自动重新映射你已选的格式 只要你输入常态地图参数 在着色器为常态地图采样时 理解频道映射很重要 当X组件从红色或阿尔法频道 被读取时 Y组件会从阿尔法或绿色频道来 取决于压缩格式 回到自适应可伸缩纹理压缩技术范例 要为纹理采样 X组件 会从红色频道采样 而Y组件会从阿尔法频道采样 就是常态编码的相反 如果你在编码多重格式 达到在任何装置上的最佳质量 这个映射就很了不起 你需要应付执行期 我用一个范例说明常态采样执行期 使用Metal纹理swizzle 编码成多重格式 可能导致需要多重着色器变量 假如不同格式用在不同频道映射 要避免如此 Metal让你应用自定义swizzle 到你的纹理 swizzle让你重新映射X和Y组件 到红和绿频道 让你的着色器能压缩成中性格式 这是重新映射频道 到红和绿的范例 用自适应可伸缩纹理压缩技术压缩 同我们先前看到的图表中 在纹理描述符初始化后 红色频道被设为 MTLTextureSwizzleRed 而绿色频道则设为 MTLTextureSwizzleAlpha
因为这是常态地图 只有两个频道需要采样 因为红色和绿色频道已经被分配 到X和Y组件 最初是被编码在红色和阿尔法频道 蓝色和阿尔法频道就被设为零 完成后 最后一行要组成最后的swizzle 和重新映射的频道 使用MTLTextureSwizzleChannelsMake X和Y频道 在着色器采样后 你就能重建构Z组件 我来说明ReconstructNormal函式 告诉你怎么使用
首先 代码重新定向X和Y组件 到正确范围 以常态来说 就是负一到一 下一步是从一减掉 X和Y组件的内积 以确保内积结果是对的 饱和函式 接着用来锁定这个结果 在零到一之间 最后一步要计算Z组件 就是饱和函式的 平方根的结果
现在 已经解释了 RGBM和常态地图可用在频道映射的 编码选项 我来把纹理压缩管线 解释完 在最后的压缩子状态 编码 全部的纹理转换器命令行界面 都需要特定的目标压缩格式 使用compression_format自变量 你也可以定义要使用哪个压缩器 或让纹理转换器 基于压缩格式 和其他你选的设定选择 你也可以选择压缩质量 从这四个选项 要留意在压缩速度 和图片质量之间权衡 你可能要选低一点的压缩质量 在迭代游戏时 但在建置发行版时使用最高质量 讲完你能选择的 纹理压缩格式
这是Apple平台支持的 纹理压缩格式家族 简介 iOS和Apple Silicon平台 支持自适应可伸缩纹理压缩技术 和PVRTC家族 以及全数macOS平台支持BCn 我会详细说明这些格式家族 让你在选择你最适合的格式时 有些方向 那我从BCn格式开始 BCn一组有七个格式 都是用四乘四的像素块作业 是用每像素四位元或八位元 每种压缩格式都有它合适的数据格式 BC1和BC3大多用在 RGD和RGBA压缩 BC6适用在HDR图片 而BC5 有独立双频道 适合常态地图编码 再来是自适应可伸缩纹理压缩技术 在LDR、sRGB和HDR 色彩空间的RGBA格式家族 自适应可伸缩纹理压缩技术家族格式 在全尺寸 都能达到最高质量 也因此 普遍比PVRTC更受推崇 在每种格式 每像素有特定位区间与质量相对
自适应可伸缩纹理压缩技术的 每块字节大小固定 不受格式影响 即便纹素显示数量改变 这能达到一致性 在最高质量压缩 但最低压缩率 到四乘四块尺寸 比对最低压缩质量 但最高压缩率却有12乘12块尺寸 LDR、sRGB和HDR变体 描述压缩后的自适应可伸缩 纹理压缩技术纹素的色彩区间 LDR和sRGB都在零到一区间 在线性或sRGB空间都是 就算HDR变体 非零到一区间的资料
最后 PVRTC格式能在 RGB和RGBA的二位元 或四位元模式使用 这个格式的数据块会占用八位 所以在二位元模式 每八乘四的像素 就会有一块 在四位元模式 每四乘四的像素就有一块
我介绍了支持的格式家族后 接着要推荐你 如何为你的应用程序选择格式 在iOS装置 使用默认的 自适应可伸缩纹理压缩技术 是最佳选择 包含额外的PVRTC压缩 和装置压薄 只要你支持A7或更早的图形处理器 如果你有任何HDR纹理 你可以利用A13或更新的图形处理器 的自适应可伸缩纹理压缩技术HDR macOS全面支持BCn Apple Silicon Macs 可以选择使用自适应可伸缩 纹理压缩技术 如果你是锁定iOS装置 你该考虑这个选项 虽然Apple Silicon支持PVRTC 我们不推荐这个选项 这仅为支持iOS遗产 由于有很多其他格式 在每个压缩格式家庭可以选择 这个指南提供效率最高的 应用程序纹理压缩格式 能选择每个纹理及每个目标 除非你全部的纹理都是RGB 或RGBA资料 你应该基于你要压缩的数据类型 来选择压缩格式 像是选择能够让常态数据 用两个独立频道压缩的格式 在压缩成自适应可伸缩 纹理压缩技术格式时 你可能要选择格式的子集 考虑分类纹理为 需要最高质量的 和可接受较高压缩率的 现在 我们回顾一下刚刚说的 我们彻底翻新了 纹理工具的纹理运算管线 让你有管线每阶段的全面控制 通过我们新的纹理转换器工具 我已经说明这个新管线的每个阶段 也探索全部你在每个阶段 能使用的选项 并介绍频道映射 和纹理压缩格式家族 在Apple平台上支持 我们希望让操作越简单越好 更新你的工作流程从使用纹理工具 到纹理转换器 因此我们新增了兼容性模式 来帮助你转换命令行界面 不论是用纹理工具的兼容性模式 还是呼叫纹理转换器的原生选项 用xcrun TextureConverter唤醒 这是纹理转换器的示范命令行界面 带有纹理工具选项的呼叫 纹理转换器会转译这些选项 至原生纹理转换器选项 执行压缩 再告诉你新的原生选项为何 如此你就能轻松更新建置脚本
这是纹理转换器的介绍 这是你能怎么取得 纹理转换器是Xcode 13的一部分 在种子一内可使用 在Windows、纹理转换器 在Metal Developer Tools for Windows 2.0封包中 可以在developer.apple.com 种子一已开放使用 留意在Windows 并没有支持压缩至PVRTC格式 PVRTC仅在macOS可使用 为了支持iOS平台的精神 另个关于 Metal Developer Tools for Windows的 重要部分 是Windows的Metal编译器 Windows的Metal编译器去年推出 支持Metal阴影语言2.3版 在这一年中多次更新 仿照在Xcode推出的 Metal编译器的更新 最新发布版是1.2版 包括支持Metal阴影语言 在Apple Silicon Mac 种子一的2.0版已经开放使用 支持全部在Metal阴影语言2.4版的 新功能
这边是今天讲到的总结 伊格谈到支持更多Metal功能 像是光线追踪和函式指标 他介绍了全新的效能剖析工作流程 像是图形处理器时间轴 和连贯的图形处理器效能状态 帮助你极大化使用图形处理器 在全部Apple平台中 他还展示了调试工作流程的改良处 在你已熟悉的流程中 支持更多 着色器验证及精准抓取控制 而我介绍了纹理转换器 一个帮助你最佳运用 纹理运算管线的工具 以及全部我们在Apple平台 支持的纹理压缩格式 谢谢 祝接下来的2021WWDC 开发者大会顺心 [音乐]
-
-
27:51 - RGBM Encoding Pseudocode
float4 EncodeRGBM(float3 in) { float4 rgbm; rgbm.a = max3(in.r, in.g, in.b) / RGBM_Range; rgbm.rgb = in / (rgbm.a * RGBM_Range); return rgbm; }
-
28:41 - RGBM Decoding Pseudocode
float3 DecodeRGBM(float4 sample) { const float RGBM_Range = 6.0f; float scale = sample.a * RGBM_Range; return sample.rgb * scale; }
-
30:55 - MetalTextureSwizzles
// Remap the X and Y channels to red and green channels for normal maps compressed with ASTC. MTLTextureDescriptor* descriptor = [[MTLTextureDescriptor alloc] init]; MTLTextureSwizzle r = MTLTextureSwizzleRed; MTLTextureSwizzle g = MTLTextureSwizzleAlpha; MTLTextureSwizzle b = MTLTextureSwizzleZero; MTLTextureSwizzle a = MTLTextureSwizzleZero; descriptor.swizzle = MTLTextureSwizzleChannelsMake( r, g, b, a );
-
31:55 - ReconstructNormal
// Reconstruct z-axis from normal sample in shader code. float3 ReconstructNormal(float2 sample) { float3 normal; normal.xy = sample.xy * 2.0f - 1.0f; normal.z = sqrt( saturate( 1.0f - dot( normal.xy, normal.xy ) ) ); return normal; }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。