图形工具标准着色器 - MRTK3
图形工具标准着色系统利用灵活的着色器实现类似于 Unity 的标准(或 Lit)着色器的视觉效果。 它实施 Fluent Design System 原则,并在混合现实设备上保持高性能。
示例
有关图形工具/标准着色器变体的多个演示,请参阅 Material Gallery 示例。 有关图形工具/标准画布的示例,请参阅 UnityUI 示例
体系结构
图形工具/标准着色系统是一种“超级着色器”,它使用 Unity 的着色器程序变体功能,根据材料属性自动生成最佳着色器代码。 当用户在材料检查器中选择材料属性时,他们只需承担已启用的功能的性能费用。
为了更好地支持传统的 Unity 工作流程和 UnityUI(画布)工作流程,图形工具/标准着色系统有两个着色器入口点:
上下文 | 默认 | UnityUI |
---|---|---|
名称 | Graphics Tools/Standard | 图形工具/标准画布 |
着色器 | GraphicsToolsStandard | GraphicsToolsStandardCanvas |
两个着色器大体相同,因为它们共享常用的着色器代码文件。 图形工具/标准画布包含一些特定于 UnityUI 的额外逻辑。
以下着色器文件可为图形工具/标准着色系统提供强大的功能:
Include | 目的 |
---|---|
GraphicsToolsStandardProgram | 包含顶点和片段着色器入口点方法(核心实现)。 |
GraphicsToolsStandardMetaProgram | 包含 Unity 用于静态照明的顶点和片段着色器入口点方法(在运行时不使用)。 |
GraphicsToolsStandardInput | 顶点属性、顶点插值器、纹理、纹理采样器、每材料常量缓冲区、全局属性和常量的定义。 |
GraphicsToolsCommon | 可重用的方法和定义。 |
渲染管道支持
Unity 提供了一些渲染管道供开发人员选择。 图形工具标准着色系统旨在与 Unity 的内置渲染管道或通用渲染管道 (URP) 自动配合使用。 无需根据管道切换着色器。 以下是支持矩阵:
管道 | 支持 | 异常 |
---|---|---|
内置渲染管道 | ✅ | 不支持亚克力“模糊模式”。 |
通用渲染管道 (URP) | ✅ | |
高清渲染管道 (HDRP) | ❌ | |
自定义渲染管道 | ❔ | 支持取决于管道的生成方式。 |
UnityUI 支持
图形工具标准着色系统与 Unity 的内置 UI 系统(称为 UnityUI)配合使用。 Graphics Tools/Standard Canvas
应该用于 UnityUI 画布中的所有材料。
图形工具中的 Canvas 或 CanvasRenderer 会根据需要提示添加 ScaleMeshEffect.cs
:
在 UnityUI 组件上,unity_ObjectToWorld
矩阵(或 URP 中的 UNITY_MATRIX_M
)不是图形组件所在的本地变换的变换矩阵,而是其父画布的变换矩阵。 许多图形工具/标准画布着色器效果需要知道对象比例。 为解决此问题,ScaleMeshEffect.cs
会在构造 UI 网格期间将缩放信息存储到 UV 通道属性中。
提示
在使用 Unity 图像组件时,建议为源图像指定“None (Sprite)”,以防止 Unity UI 生成其他顶点。
材料检查器
“图形工具/标准”和“图形工具/标准画布”着色器都有自定义材料检查器,称为 StandardShaderGUI.cs。 检查器基于用户选择自动启用/禁用着色器功能,并帮助设置渲染状态。 有关每项功能的详细信息,请将鼠标悬停在 Unity 编辑器中的每个属性上,以获取工具提示。
注意
检查器 UI 是动态的。 UI 的某些部分将随着功能的启用和禁用而改变。
检查器可以分为多个功能区域,如下所述。
渲染模式
检查器的第一个部分控制材料的渲染状态。 渲染模式可确定何时以及如何渲染材料。 Graphics Tools/Standard
和 Graphics Tools/Standard Canvas
着色器的目标是镜像显示在 Unity/Standard 着色器中找到的渲染模式。 “图形工具/标准”和“图形工具/标准画布”着色器还包括附加渲染模式和自定义渲染模式,以实现完全的用户控制。
渲染模式 | 说明 |
---|---|
不透明 | (默认)适用于没有透明区域的普通实体对象。 |
抠图 | 允许创建透明效果,在不透明区域和透明区域之间具有硬边缘。 在此模式下,没有半透明区域,纹理要么为 100% 不透明,要么为不可见。 使用透明度创建材料形状(如植物)时,这非常有用。 |
淡化 | 允许通过透明度值以使对象完全淡出,包括该对象可能带有的任何镜面高光或反射。 如果要让对象动态淡入或淡出,此模式非常有用。它不适合用于渲染逼真的透明材料(如透明塑料或玻璃),因为反射和高光也会淡出。 |
透明 | 适用于渲染逼真的透明材料,如透明塑料或玻璃。 在此模式下,材料本身会带有透明度值(基于纹理的 alpha 通道和着色颜色的 alpha)。 但是,反射和高光将仍以完整清晰度可见,就像真实的透明材料一样。 |
累加性 | 启用一种附加混合模式,该模式将以前的像素颜色与当前像素颜色相加。 这是避免出现透明排序问题的首选透明模式。 |
自定义 | 允许手动控制渲染模式的每个方面。 仅适用于高级用途。 |
精选模式
精选模式 | 说明 |
---|---|
关 | 禁用面剔除。 仅当需要双面网格时,才应将精选设置为关闭。 |
Front | 启用正面剔除。 |
返回 | (默认)启用背面剔除。 应尽量经常启用背面剔除以提高渲染性能。 |
主图
此部分的主要功能是控制材料的反照率颜色和基于物理的渲染选项。
若要提高 Unity 标准着色器每像素的奇偶校验,可通过通道包装来控制所有金属性、平滑度、放射性和遮挡性值。
使用通道包装时,只需对一个纹理采样并将其加载到内存中,而不是对四个单独的纹理执行此操作。 在某个程序(如 Substance 或 Photoshop)中编写纹理贴图时,可以手动包装它们,如下所示:
Channel | properties |
---|---|
Red | 金属质感 |
绿色 | 封闭 |
蓝色 | 放射(灰度) |
Alpha | 平滑度 |
主图部分还有一个用于三平面映射和超采样抗锯齿的选项。 它还包含在选中“放射”复选框后用于添加彩色放射纹理贴图的选项。
三平面映射是一种以编程方式为网格映射纹理的技术。 通常用于地形、没有 UV 的网格或难以展开的形状。 此实现支持世界空间或局部空间投影、混合平滑度的规范和法线贴图支持。 请注意,使用的每个纹理都需要 3 个纹理样本,因此请在性能至关重要的情况下谨慎使用。
超样本抗锯齿应该用于显示图标或图像的所有材料,这些图标或图像的细节从远处看很重要。
渲染选项
渲染选项主要控制材料的照明设置。 此材料部分还包含一些其他特征,用于控制表面颜色、半透明度或位置。 有关照明的详细信息,请参阅下文。
Fluent 选项
Fluent 是一种 Microsoft 产品中跨 UI 组件使用的设计框架。 本部分包含一些有助于在任意表面上模拟 Fluent 设计系统原则的功能。 如果正在寻找定制的 Fluent 着色器,可以在“图形工具/画布”和“图形工具/非画布”着色器命名空间中找到。
高级选项
类似于 Unity 内置着色器中的高级部分。 此部分控制渲染顺序以及是否应生成 GPU 实例化变体。 此外,还有可配置的模具测试支持可用于实现各种效果。 例如门户:
照明
“图形工具/标准”和“图形工具/标准画布”着色器都使用简单类似的技术来实现照明。 由于着色器不针对物理正确性和能量守恒进行计算,因此它能够快速有效地渲染内容。 Blinn-Phong 是一种主要照明技术,它与菲涅耳透镜和基于图像的照明相结合,以接近于基于物理的照明。 着色器支持以下照明技术:
定向光
着色器会遵循场景中第一束 Unity 定向光(若启用)的方向、颜色和强度。
重要
不会考虑将动态点光、投射光或任何其他 Unity 光用于实时照明。 此时不支持遮光罩。
球谐函数
着色器通过球谐函数(若启用)使用光源探针来逼近场景中的灯光。
重要
对每个顶点执行球谐函数计算,且不结合光源探针,以此降低计算成本。
光照映射
对于静态照明,着色器会遵循由 Unity 的光照映射系统构建的光照图。 将渲染器标记为 static(或 lightmap static),即可使用光照图。
性能
与使用 Unity 标准着色器相比,使用图形工具标准着色系统的主要优势之一是性能更高。 按设计,“图形工具/标准”和“图形工具/标准画布”着色器仅使用启用的功能。 但是,“图形工具/标准”和“图形工具/标准画布”着色器也经过了编写,可提供与 Unity 标准着色器相当的美学效果,但成本要低得多。 比较着色器性能的一种简单方法是借助需要在 GPU 上执行的操作的数量。 计算量可能会因启用的功能和其他渲染配置而产生波动。
提示
一般来说,应使用图形工具标准着色器,而不是移动混合现实设备上的内置着色器。 但是,使用 RenderDoc 等工具来分析场景总是明智的。