MRTK for Unity 中的标准着色器

由于全息对象与真实环境中的物理对象混合在一起,因此向用户提供视觉提示非常重要。 混合现实 Toolkit 标准着色器提供各种类型的视觉效果,可用于全息影像。 着色系统使用单个灵活的着色器来实现类似于 Unity 的标准着色器的视觉对象。 着色器实现Fluent Design System 原则,并在混合现实设备上保持高性能。

MRTK 标准着色系统利用单个灵活的着色器,它可以实现类似于 Unity 的标准着色器的视觉对象,实现Fluent Design System原则,并使混合现实设备保持高性能。  

示例场景

可以在下 的MaterialGallery场景中找到着色器材料示例。 此场景中的所有材料都使用 MRTK/Standard 着色器。

Material Gallery

在下 的StandardMaterialComparison场景中,可以找到比较场景来比较和测试 MRTK/standard 着色器示例。

Material Comparison

体系结构

MRTK/Standard 着色系统是一个 “uber 着色器”,它使用 Unity 的着色器的 “着色器” 程序变体功能 根据材料属性自动生成最佳着色器代码。 当用户在 “材料检查器” 中选择 “材料” 属性时,它们只会对已启用的功能产生性能开销。

材料检查器

已调用 MixedRealityStandardShaderGUI.cs MRTK/Standard 着色器的自定义材料检查器。 检查器自动启用/禁用着色器功能,基于用户选择和设置渲染状态 aides。 有关每个功能的详细信息, 请将鼠标悬停在 Unity 编辑器中的每个属性上,以获取工具提示。

Material Inspector

检查器的第一个部分控制材料的渲染状态。 渲染模式 可确定何时以及如何呈现材料。 MRTK/Standard 着色器的目标是镜像 在 Unity/标准着色器中找到的呈现模式。 MRTK/Standard 着色器还包括一个用于完成用户控制的 附加 渲染模式和 自定义 呈现模式。

呈现模式描述
半透明(默认) 适用于没有透明区域的普通实体对象。
剪影允许创建在不透明和透明区域之间具有硬边缘的透明效果。 在此模式下,没有半透明区域,纹理为100% 不透明或不可见。 当使用透明度创建材料形状(如 vegetation)时,这非常有用。
淡化允许透明度值完全淡化对象,包括任何镜面高光或反射。 如果要使对象的动画淡入或淡出,此模式非常有用。它不适合呈现清晰的透明材料(如清晰的塑料或玻璃),因为反射和高光还会淡出。
透明适用于渲染真实的透明材料,如清晰的塑料或玻璃。 在此模式下,材料本身将根据纹理的 alpha 通道和颜色颜色) 的 alpha (来使用透明度值。 但是,反射和照明突出显示内容将在完全清晰的情况下保持可见,就像实际透明材料一样。
累加性启用一种加法混合模式,该模式将以前的像素颜色与当前像素颜色进行求和。 这是用于避免透明度排序问题的首选透明模式。
自定义允许手动控制呈现模式的每个方面。 仅适用于高级用途。
Rendering Modes
精选模式描述
禁用面部剔除。 如果需要双面网格,则只能将剔除设置为 Off。
Front启用正面剔除。
返回(默认) 启用 背面剔除。 应尽可能频繁地启用背面剔除以提高呈现性能。

性能

通过 Unity 标准着色器使用 MRTK 标准着色器的主要优点之一是性能。 MRTK 标准着色器可扩展,只利用启用的功能。 不过,MRTK 标准着色器也已经编写,以将相当美观的结果作为 Unity 标准着色器提供,但成本要低得多。 比较着色器性能的一种简单方法是通过 GPU 上需要执行的操作的数量。 当然,根据启用的功能和其他呈现配置,计算量可能会波动。 但一般情况下,MRTK 标准着色器比 Unity 标准着色器执行的计算要少得多。

Unity 标准着色器统计信息示例

Unity Standard Shader Statistics

MRTK 标准着色器统计信息示例

MRTK Standard Shader Statistics

注意

可以通过在 Unity 检查器中选择和查看 着色器资产 ,然后单击 ” 编译并显示代码 ” 按钮,从而生成这些结果。

照明

MRTK/Standard 使用简单的近似值。 由于此着色器不计算物理正确性和能源节省,因此它能够快速有效地呈现。 Blinn-Phong 是一种主要照明技术,它与菲涅尔衰减和基于图像的照明相混合,以使基于物理的照明接近。 着色器支持以下照明技术:

定向光

着色器将遵循场景中第一个 Unity 方向光的方向、颜色和强度, (如果启用了) 。 不会将动态点光、污点光源或任何其他 Unity 光源视为实时照明。

球形谐波

着色器使用 球状谐波(如果已启用),将使用光源探测来估算场景中的灯。 球形谐波计算按顶点执行以降低计算成本。

Lightmapping

对于静态照明,着色器将遵循由 Unity 的 Lightmapping 系统生成的 lightmaps。 只需将呈现器标记为 static (或 lightmap static) 才能使用 lightmaps。

悬停灯光

邻近感应灯

轻型可编写脚本呈现管道支持

MRTK 包含一个升级路径,使开发人员能够使用 MRTK 着色器 (LWRP) 使用 Unity 的轻型可编写脚本呈现管道。 在 Unity 2019.1.1 f1 和轻型 RP 5.7.2 包中进行了测试。 有关 LWRP 入门的说明,请参阅 此页

若要执行 MRTK 升级,请选择:混合现实 Toolkit- – > upgrade MRTK Standard 着色器

lwrp upgrade

升级完成后,MRTK/Standard 着色器将被更改,并且任何洋红色 (着色器错误) 材料应修复。 若要验证升级是否成功,请查看:升级资产/MixedRealityToolkit/StandardAssets/着色器/MixedRealityStandard 用于轻量渲染管道的控制台。

UGUI 支持

MRTK 标准着色系统与 Unity 内置的 UI 系统一起工作。 在 Unity UI 组件上,unity_ObjectToWorld 矩阵不是图形组件所在的本地转换的转换矩阵,而是它的父画布的转换矩阵。 许多 MRTK/标准着色器效果需要知道对象范围。 若要解决此问题, ScaleMeshEffect.cs 将在 UI 网格构造过程中将缩放信息存储到 UV 通道特性中。

请注意,在使用 Unity 图像组件时,建议为源映像指定 “None (Sprite) “,以防止 Unity UI 生成额外顶点。

如果需要,MRTK 中的画布会提示添加一个 ScaleMeshEffect.cs :

scale mesh effect

纹理合并器

若要提高与 Unity 标准着色器每像素金属、平滑度、放射和封闭值的奇偶校验,可以通过 通道封装来控制。 例如:

channel map example

使用通道打包时,只需将一个纹理采样并加载到内存中,而不是使用四个单独的纹理。 当您在某个程序(如物质或 Photoshop)中编写纹理地图时,可以按如下所示对其进行打包:

通道属性
红色金属
绿色封闭
蓝色灰 (灰度)
Alpha平滑

或者,可以使用 MRTK 纹理合并器工具。 若要打开该工具,请选择:混合现实Toolkit – 实用工具 -> 纹理合并器,这将打开以下窗口:

texture combiner example

可以通过选择 Unity 标准着色器并单击”从标准材料自动填充”来自动填充此窗口。或者,可以手动指定纹理 (或常量值) 红色、绿色、蓝色或 alpha 通道。 纹理组合是 GPU 加速的,不需要输入纹理可供 CPU 访问。

其他功能文档

下面是有关 MRTK/标准着色器提供的一些功能详细信息的额外详细信息。

基元剪辑

primitive clipping

网格轮廓

许多网格大纲技术都是使用后处理 技术 完成。 后期处理提供高质量的大纲,但在许多混合现实设备上可能成本高昂。 可以在 下的”大纲””示例”场景中找到演示如何使用网格 轮廓 的场景 。

Mesh Outline

MeshOutline.cs 和 MeshOutlineHierarchy.cs 可用于围绕网格呈现器呈现轮廓。 启用此组件会引入所概述对象的附加呈现传递,但旨在以性能方式在移动混合现实设备上运行,并且不会利用任何发布进程。 此效果的限制包括,它无法很好地处理非 watertight 对象 (或需要是两个) 对象上可能会出现深度排序问题。

大纲行为旨在与 MRTK/标准着色器结合使用。 轮廓材料通常是纯色,但可以配置为实现各种效果。 大纲材料的默认配置如下:

Mesh Outline Material
  1. 深度写入 – 应禁用大纲材料,以确保轮廓不会阻止其他对象呈现。
  2. 顶点外泄 – 需要启用 以呈现轮廓。
  3. 使用平滑法线 – 此设置对于某些网格是可选的。 通过沿顶点法线移动顶点来发生外泄,在沿默认法线拉伸的一些网格上,会导致轮廓中出现不连续。 若要修复这些不连续情况,可以选中此框,以使用由 生成的另一组平滑法线 MeshSmoother.cs

MeshSmoother.cs 是一个组件,可用于在网格上自动生成平滑法线。 此方法对共享空间中相同位置的网格中的顶点进行分组,然后计算这些顶点的法线平均值。 此过程会创建基础网格的副本,应仅在需要时使用。

Smooth Normals Outline
  1. 通过 生成的平滑法线 MeshSmoother.cs
  2. 使用的默认法线,请注意立方体角周围的项目。

模具测试

内置可配置模具测试支持,以实现各种效果。 例如门户:

stencil test

实例颜色支持

实例颜色支持,为数千个 GPU 实例网格提供唯一的材料属性:

instanced properties

行程映射

三边形映射是一种以编程方式对网格进行纹理处理的技术。 通常用于地形、没有 UV 的网格或难以解包形状。 此实现支持世界或本地空间投影、混合平滑度规范以及普通地图支持。 请注意,使用的每个纹理都需要 3 个纹理样本,因此在性能关键的情况下请谨慎使用。

triplanar

顶点外泄

世界空间中的顶点外泄。 用于可视化外向边界卷或内/出网格的转换。

normal map scale 1

杂项

用于控制反转录优化的复选框。 当未指定反正比纹理时,将禁用优化反正比操作。 这可用于控制 远程纹理加载。

只需选中此框:

albedo assignment

支持按像素剪辑纹理、基于本地边缘的抗锯齿和普通地图缩放。

normal map scale 2

(文章来源于:微软)