MRTK2 标准着色器

Standard shader examples

MRTK2 标准着色系统利用一种单一的灵活着色器,这种着色器可以实现类似于 Unity 的标准着色器的视觉对象、实施 Fluent Design System 原则以及保持混合现实设备的高性能。

示例场景

可在 MRTK/Examples/Demos/StandardShader/Scenes/ 下的 MaterialGallery 场景中找到着色器材料示例。 此场景中的所有材料均使用 MRTK/Standard 着色器。

Material Gallery

可在 MRTK/Examples/Demos/StandardShader/Scenes/ 下的 StandardMaterialComparison 场景中找到一个比较场景,以便比较和测试 MRTK/Standard 着色器与 Unity/Standard 着色器示例

Material Comparison

体系结构

MRTK/Standard 着色系统是一种“超级着色器”,它使用 Unity 的着色器程序变体功能,根据材料属性自动生成最佳着色器代码。 当用户在材料检查器中选择材料属性时,他们只需承担已启用的功能的性能费用。

材料检查器

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

Material Inspector

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

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

Rendering Modes

精选模式 说明
禁用面剔除。 仅当需要双面网格时,才应将精选设置为关闭。
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 光用于实时照明。

球谐函数

着色器通过球谐函数(若启用)使用光源探针来逼近场景中的灯光。 对每个顶点执行球谐函数计算,以此降低计算成本。

光照映射

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

悬停灯光

邻近感应灯

轻量级可编写脚本渲染管道支持

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

若要执行 MRTK 升级,请选择:“混合现实工具包”->“实用程序”->“升级适用于轻量级渲染管道的 MRTK 标准着色器”

lwrp upgrade

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

UGUI 支持

MRTK 标准着色系统与 Unity 的内置 UI 系统配合工作。 在 Unity UI 组件上,unity_ObjectToWorld 矩阵不是图形组件所在的本地转换的转换矩阵,而是其父画布的转换矩阵。 许多 MRTK/Standard 着色器效果要求对象比例是已知的。 为解决此问题,ScaleMeshEffect.cs 会在构造 UI 网格期间将缩放信息存储到 UV 通道属性中。

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

MRTK 内的画布会在需要时提示添加 ScaleMeshEffect.cs

scale mesh effect

纹理组合器

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

channel map example

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

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

或者,可以使用 MRTK 纹理组合器工具。 若要打开此工具,请选择:“混合现实工具包”->“实用程序”->“纹理组合器”,这将打开以下窗口

texture combiner example

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

其他功能文档

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

基元剪裁

primitive clipping

网格轮廓

许多网格轮廓技术都是使用后处理技术完成的。 后处理提供优质的轮廓,但在许多混合现实设备上可能会非常昂贵。 可在 MRTK/Examples/Demos/StandardShader/Scenes/ 下的 OutlineExamples 场景中找到演示网格轮廓用法的场景

Mesh Outline

MeshOutline.csMeshOutlineHierarchy.cs 可用于渲染围绕网格渲染器的轮廓。 启用此组件会引入已绘制轮廓的对象的其他渲染通道,但其目的是在移动混合现实设备上高效运行,且不利用任何后处理。 此效果的局限性在于它无法很好地处理非水密性对象(或需要具有双面的对象),并且重叠对象可能出现深度排序问题。

轮廓行为旨在与 MRTK/Standard 着色器配合使用。 轮廓材料通常是不发光的纯色,但可对其进行配置以实现各种效果。 轮廓材料的默认配置如下所示:

Mesh Outline Material
  1. 深度写入 - 应对轮廓材料禁用此设置,以确保轮廓不会妨碍其他对象的渲染。
  2. 顶点延伸 - 需要启用才能渲染轮廓。
  3. 使用平滑法线 - 对于某些网格,此设置是可选的。 通过沿着顶点法线移动顶点可完成延伸,在某些网格上,沿着默认法线延伸会导致轮廓中断。 若要修复这些中断,可选中此框以使用由 MeshSmoother.cs 生成的另一组平滑法线

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

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

模具测试

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

stencil test

实例颜色支持

实例化颜色支持为数千个 GPU 实例化网格提供独特的材料属性:

instanced properties

Triplanar 映射

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

triplanar

顶点延伸

世界空间中的顶点延伸。 可用于可视化延伸的包围盒或转换输入/输出网格。

normal map scale 1

杂项

用于控制反照率优化的复选框。 作为优化设置,在未指定反照率纹理时,会禁用反照率操作。 这对于控制远程纹理加载很有用。

只需选中此框:

albedo assignment

支持每像素剪辑纹理、基于局部边缘的抗锯齿和法线贴图缩放。

normal map scale 2

另请参阅