图形工具标准着色器 - MRTK3

图形工具标准着色系统利用灵活的着色器实现类似于 Unity 的标准(或 Lit)着色器的视觉效果。 它实施 Fluent Design System 原则,并在混合现实设备上保持高性能。

Standard shader material gallery sample

示例

有关图形工具/标准着色器变体的多个演示,请参阅 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 画布中的所有材料。

图形工具中的 CanvasCanvasRenderer 会根据需要提示添加 ScaleMeshEffect.cs

Scale mesh effect inspector warning

在 UnityUI 组件上,unity_ObjectToWorld 矩阵(或 URP 中的 UNITY_MATRIX_M)不是图形组件所在的本地变换的变换矩阵,而是其父画布的变换矩阵。 许多图形工具/标准画布着色器效果需要知道对象比例。 为解决此问题,ScaleMeshEffect.cs 会在构造 UI 网格期间将缩放信息存储到 UV 通道属性中。

提示

在使用 Unity 图像组件时,建议为源图像指定“None (Sprite)”,以防止 Unity UI 生成其他顶点。

材料检查器

“图形工具/标准”和“图形工具/标准画布”着色器都有自定义材料检查器,称为 StandardShaderGUI.cs。 检查器基于用户选择自动启用/禁用着色器功能,并帮助设置渲染状态。 有关每项功能的详细信息,请将鼠标悬停在 Unity 编辑器中的每个属性上,以获取工具提示

注意

检查器 UI 是动态的。 UI 的某些部分将随着功能的启用和禁用而改变。

Material inspector for Graphics Tools/Standard

检查器可以分为多个功能区域,如下所述。

渲染模式

检查器的第一个部分控制材料的渲染状态。 渲染模式可确定何时以及如何渲染材料Graphics Tools/StandardGraphics Tools/Standard Canvas 着色器的目标是镜像显示在 Unity/Standard 着色器中找到的渲染模式。 “图形工具/标准”和“图形工具/标准画布”着色器还包括附加渲染模式和自定义渲染模式,以实现完全的用户控制

渲染模式 说明
不透明 (默认)适用于没有透明区域的普通实体对象。
抠图 允许创建透明效果,在不透明区域和透明区域之间具有硬边缘。 在此模式下,没有半透明区域,纹理要么为 100% 不透明,要么为不可见。 使用透明度创建材料形状(如植物)时,这非常有用。
淡化 允许通过透明度值以使对象完全淡出,包括该对象可能带有的任何镜面高光或反射。 如果要让对象动态淡入或淡出,此模式非常有用。它不适合用于渲染逼真的透明材料(如透明塑料或玻璃),因为反射和高光也会淡出。
透明 适用于渲染逼真的透明材料,如透明塑料或玻璃。 在此模式下,材料本身会带有透明度值(基于纹理的 alpha 通道和着色颜色的 alpha)。 但是,反射和高光将仍以完整清晰度可见,就像真实的透明材料一样。
累加性 启用一种附加混合模式,该模式将以前的像素颜色与当前像素颜色相加。 这是避免出现透明排序问题的首选透明模式。
自定义 允许手动控制渲染模式的每个方面。 仅适用于高级用途。

Rendering modes example lineup

精选模式

精选模式 说明
禁用面剔除。 仅当需要双面网格时,才应将精选设置为关闭。
Front 启用正面剔除。
返回 (默认)启用背面剔除。 应尽量经常启用背面剔除以提高渲染性能。

主图

此部分的主要功能是控制材料的反照率颜色和基于物理的渲染选项。

若要提高 Unity 标准着色器每像素的奇偶校验,可通过通道包装来控制所有金属性、平滑度、放射性和遮挡性值。

使用通道包装时,只需对一个纹理采样并将其加载到内存中,而不是对四个单独的纹理执行此操作。 在某个程序(如 Substance 或 Photoshop)中编写纹理贴图时,可以手动包装它们,如下所示:

Channel properties
Red 金属质感
绿色 封闭
蓝色 放射(灰度)
Alpha 平滑度

主图部分还有一个用于三平面映射和超采样抗锯齿的选项。 它还包含在选中“放射”复选框后用于添加彩色放射纹理贴图的选项。

三平面映射是一种以编程方式为网格映射纹理的技术。 通常用于地形、没有 UV 的网格或难以展开的形状。 此实现支持世界空间或局部空间投影、混合平滑度的规范和法线贴图支持。 请注意,使用的每个纹理都需要 3 个纹理样本,因此请在性能至关重要的情况下谨慎使用。

超样本抗锯齿应该用于显示图标或图像的所有材料,这些图标或图像的细节从远处看很重要。

渲染选项

渲染选项主要控制材料的照明设置。 此材料部分还包含一些其他特征,用于控制表面颜色、半透明度或位置。 有关照明的详细信息,请参阅下文

Lighting comparisons

Fluent 选项

Fluent 是一种 Microsoft 产品中跨 UI 组件使用的设计框架。 本部分包含一些有助于在任意表面上模拟 Fluent 设计系统原则的功能。 如果正在寻找定制的 Fluent 着色器,可以在“图形工具/画布”和“图形工具/非画布”着色器命名空间中找到

高级选项

类似于 Unity 内置着色器中的高级部分。 此部分控制渲染顺序以及是否应生成 GPU 实例化变体。 此外,还有可配置的模具测试支持可用于实现各种效果。 例如门户:

Portal example

照明

“图形工具/标准”和“图形工具/标准画布”着色器都使用简单类似的技术来实现照明。 由于着色器不针对物理正确性和能量守恒进行计算,因此它能够快速有效地渲染内容。 Blinn-Phong 是一种主要照明技术,它与菲涅耳透镜和基于图像的照明相结合,以接近于基于物理的照明。 着色器支持以下照明技术:

定向光

着色器会遵循场景中第一束 Unity 定向光(若启用)的方向、颜色和强度。

重要

不会考虑将动态点光、投射光或任何其他 Unity 光用于实时照明。 此时不支持遮光罩。

球谐函数

着色器通过球谐函数(若启用)使用光源探针来逼近场景中的灯光。

重要

对每个顶点执行球谐函数计算,且不结合光源探针,以此降低计算成本。

光照映射

对于静态照明,着色器会遵循由 Unity 的光照映射系统构建的光照图。 将渲染器标记为 static(或 lightmap static),即可使用光照图。

性能

与使用 Unity 标准着色器相比,使用图形工具标准着色系统的主要优势之一是性能更高。 按设计,“图形工具/标准”和“图形工具/标准画布”着色器仅使用启用的功能。 但是,“图形工具/标准”和“图形工具/标准画布”着色器也经过了编写,可提供与 Unity 标准着色器相当的美学效果,但成本要低得多。 比较着色器性能的一种简单方法是借助需要在 GPU 上执行的操作的数量。 计算量可能会因启用的功能和其他渲染配置而产生波动。

提示

一般来说,应使用图形工具标准着色器,而不是移动混合现实设备上的内置着色器。 但是,使用 RenderDoc 等工具来分析场景总是明智的。

另请参阅