MRTK2 标准着色器
MRTK2 标准着色系统利用一种单一的灵活着色器,这种着色器可以实现类似于 Unity 的标准着色器的视觉对象、实施 Fluent Design System 原则以及保持混合现实设备的高性能。
示例场景
可在 MRTK/Examples/Demos/StandardShader/Scenes/
下的 MaterialGallery 场景中找到着色器材料示例。 此场景中的所有材料均使用 MRTK/Standard 着色器。
可在 MRTK/Examples/Demos/StandardShader/Scenes/
下的 StandardMaterialComparison 场景中找到一个比较场景,以便比较和测试 MRTK/Standard 着色器与 Unity/Standard 着色器示例。
体系结构
MRTK/Standard 着色系统是一种“超级着色器”,它使用 Unity 的着色器程序变体功能,根据材料属性自动生成最佳着色器代码。 当用户在材料检查器中选择材料属性时,他们只需承担已启用的功能的性能费用。
材料检查器
有一个适用于 MRTK/Standard 着色器的自定义材料检查器,名为 MixedRealityStandardShaderGUI.cs
。 检查器基于用户选择自动启用/禁用着色器功能,并帮助设置渲染状态。 有关每项功能的详细信息,请将鼠标悬停在 Unity 编辑器中的每个属性上,以获取工具提示。
检查器的第一个部分控制材料的渲染状态。 渲染模式可确定何时以及如何渲染材料。 MRTK/Standard 着色器的目标是镜像显示在 Unity/Standard 着色器中找到的渲染模式。 MRTK/Standard 着色器还包括一种附加的渲染模式和自定义渲染模式,以实现用户完全控制。
渲染模式 | 说明 |
---|---|
不透明 | (默认)适用于没有透明区域的普通实体对象。 |
抠图 | 允许创建透明效果,在不透明区域和透明区域之间具有硬边缘。 在此模式下,没有半透明区域,纹理要么为 100% 不透明,要么为不可见。 使用透明度创建材料形状(如植物)时,这非常有用。 |
淡化 | 允许通过透明度值以使对象完全淡出,包括该对象可能带有的任何镜面高光或反射。 如果要让对象动态淡入或淡出,此模式非常有用。它不适合用于渲染逼真的透明材料(如透明塑料或玻璃),因为反射和高光也会淡出。 |
透明 | 适用于渲染逼真的透明材料,如透明塑料或玻璃。 在此模式下,材料本身会带有透明度值(基于纹理的 alpha 通道和着色颜色的 alpha)。 但是,反射和高光将仍以完整清晰度可见,就像真实的透明材料一样。 |
累加性 | 启用一种附加混合模式,该模式将以前的像素颜色与当前像素颜色相加。 这是避免出现透明排序问题的首选透明模式。 |
自定义 | 允许手动控制渲染模式的每个方面。 仅适用于高级用途。 |
精选模式 | 说明 |
---|---|
关 | 禁用面剔除。 仅当需要双面网格时,才应将精选设置为关闭。 |
Front | 启用正面剔除。 |
返回 | (默认)启用背面剔除。 应尽量经常启用背面剔除以提高渲染性能。 |
性能
与使用 Unity 标准着色器相比,使用 MRTK 标准着色器的主要优势之一是性能更高。 MRTK 标准着色器可扩展为仅使用启用的功能。 但是,MRTK 标准着色器也经过了编写,可提供与 Unity 标准着色器相当的美学效果,但成本要低得多。 比较着色器性能的一种简单方法是借助需要在 GPU 上执行的操作的数量。 当然,计算量可能会因启用的功能和其他渲染配置而产生波动。 但一般情况下,MRTK 标准着色器比 Unity 标准着色器执行的计算要少得多。
Unity 标准着色器统计信息示例
MRTK 标准着色器统计信息示例
注意
可通过在 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 标准着色器”
升级完成后,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
:
纹理组合器
若要提高 Unity 标准着色器每像素的奇偶校验,可通过通道包装来控制所有金属性、平滑度、放射性和遮挡性值。 例如:
使用通道包装时,只需对一个纹理采样并将其加载到内存中,而不是对四个单独的纹理执行此操作。 在某个程序(如 Substance 或 Photoshop)中编写纹理贴图时,可以手动包装它们,如下所示:
Channel | properties |
---|---|
Red | 金属质感 |
绿色 | 封闭 |
蓝色 | 放射(灰度) |
Alpha | 平滑度 |
或者,可以使用 MRTK 纹理组合器工具。 若要打开此工具,请选择:“混合现实工具包”->“实用程序”->“纹理组合器”,这将打开以下窗口:
可以通过选择 Unity 标准着色器并单击“从标准材料自动填充”来自动填充此窗口。或者,可以手动指定每个红色、绿色、蓝色或 alpha 通道的纹理(或常数值)。 纹理组合为 GPU 加速,无需输入纹理即可访问 CPU。
其他功能文档
下面是 MRTK/Standard 着色器提供的一些功能详细信息的额外详细信息。
基元剪裁
- 请参阅剪辑基元
网格轮廓
许多网格轮廓技术都是使用后处理技术完成的。 后处理提供优质的轮廓,但在许多混合现实设备上可能会非常昂贵。 可在 MRTK/Examples/Demos/StandardShader/Scenes/
下的 OutlineExamples 场景中找到演示网格轮廓用法的场景。
MeshOutline.cs
和 MeshOutlineHierarchy.cs
可用于渲染围绕网格渲染器的轮廓。 启用此组件会引入已绘制轮廓的对象的其他渲染通道,但其目的是在移动混合现实设备上高效运行,且不利用任何后处理。 此效果的局限性在于它无法很好地处理非水密性对象(或需要具有双面的对象),并且重叠对象可能出现深度排序问题。
轮廓行为旨在与 MRTK/Standard 着色器配合使用。 轮廓材料通常是不发光的纯色,但可对其进行配置以实现各种效果。 轮廓材料的默认配置如下所示:
- 深度写入 - 应对轮廓材料禁用此设置,以确保轮廓不会妨碍其他对象的渲染。
- 顶点延伸 - 需要启用才能渲染轮廓。
- 使用平滑法线 - 对于某些网格,此设置是可选的。 通过沿着顶点法线移动顶点可完成延伸,在某些网格上,沿着默认法线延伸会导致轮廓中断。 若要修复这些中断,可选中此框以使用由
MeshSmoother.cs
生成的另一组平滑法线
MeshSmoother.cs
是可用于在网格上自动生成平滑法线的组件。 此方法对网格中共享同一空间位置的顶点进行分组,然后取这些顶点的法线的平均值。 此过程会创建基础网格的副本,并且应仅在需要时使用。
- 通过
MeshSmoother.cs
生成的平滑法线。 - 使用默认的法线,请注意立方体各个角周围的伪影。
模具测试
内置可配置的模具测试支持,以实现各种效果。 例如门户:
实例颜色支持
实例化颜色支持为数千个 GPU 实例化网格提供独特的材料属性:
Triplanar 映射
三平面映射是一种以编程方式为网格映射纹理的技术。 通常用于地形、没有 UV 的网格或难以展开的形状。 此实现支持世界空间或局部空间投影、混合平滑度的规范和法线贴图支持。 请注意,使用的每个纹理都需要 3 个纹理样本,因此请在性能至关重要的情况下谨慎使用。
顶点延伸
世界空间中的顶点延伸。 可用于可视化延伸的包围盒或转换输入/输出网格。
杂项
用于控制反照率优化的复选框。 作为优化设置,在未指定反照率纹理时,会禁用反照率操作。 这对于控制远程纹理加载很有用。
只需选中此框:
支持每像素剪辑纹理、基于局部边缘的抗锯齿和法线贴图缩放。