【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)

【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第1张图片
Unity3D技术文档翻译

上一章:【Unity3D技术文档翻译】第2.3.3.12篇 材质查阅图表 & 制作你自己的

本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Materials, Shaders & Textures】→【Standard Shader】→【Physically Based Rendering Material Validator】

PBR 材质验证器(Physically Based Rendering Material Validator)

基于物理渲染(Physically Based Rendering,简称 PBR)的材质验证器是场景视图中的一个绘制模式。它使你确保材质所使用的值在基于物理着色器(physically-based shaders,简称 PBS)的推荐参考值的范围内。如果某个材质上的像素值超出了参考值范围,那么材质验证器将以不同的颜色高亮该像素,指出错误。

为了使用材质验证器,选择场景视图上的下拉菜单 draw mode(绘制模式),通常它被默认设置为 Shaded

场景视图中绘制模式的下拉菜单

导航到 Material Validation 部分。材质验证器有两个模式:Validate AlbedoValidate Metal Specular

场景视图中,绘制模式下拉菜单中的材质验证器选项。

注意:你还可以查阅材质图标中的推荐值 Unity’s Material Charts。当在制作材质,决定反照率(albedo)金属镜面(metal specular)值时,你需要查阅这些图表。然而,材质验证器提供了一个可视的、编辑器内置的快速检查场景中资源的材质值是否有效的方式。

同时注意:验证器只作用于线性颜色空间(Linear color space)。PBR 不打算用于 Gamma 颜色空间,因此如果你正在使用 PBR 和 PBS 材质验证器,你应该同时使用 线性颜色空间(Linear color space)

Validate Albedo 模式

【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第2张图片
Validate Albedo 模式中的 PBR 验证设置,显示在场景视图中。

当你将 Material Validation(材质验证) 设置为 Validate Albedo(验证反照率) 选项时,场景视图中将出现的 PBR Validation Settings(PBR 验证设置)。

属性 作用
Check Pure Metals(选择全金属) 如果你想要材质验证器对 Unity 中定义为金属,但是反照率值却不为0的像素进行高亮,就可以勾选该选项。更多细节请见下面的 Pure Metals。默认情况下,该选项没有被勾选。
Luminance Validation(亮度验证) 使用下拉选项为材质验证器选择一个预设值。如果你选择了任何 Default Luminance(默认亮度)之外的选项,就同时调整了色调公差和饱和度公差。该属性名字下的颜色条指明了预设值的反照率颜色。下拉选项下的 Luminance(亮度)值指明了最小到最大的亮度值。材质验证器会高亮任何亮度值超出这些值的像素。默认设置为 Default Luminance
Hue Tolerance(色调公差) 当检测材质的反照率颜色值时,该滑动条允许你控制材质色调之间的误差数量,以及验证配置中的色调。
Saturation Tolerance(饱和度公差) 当检测材质的反照率颜色值时,该滑动条允许你控制材质饱和度之间的误差数量,以及验证配置中的饱和度。
Color Legend(颜色说明) 当材质的像素值超过了定义值,这些颜色代表了材质验证器展示的颜色。
Red:Below Minimum Luminance Value(低于最小亮度值) 任何低于Luminance Validation 中最低亮度值的像素,材质验证器将会用红色高亮(意思是它们太暗了)。
Blue:Above Maximum Luminance Value(超过最大亮度值) 任何高于Luminance Validation 中最高亮度值的像素,材质验证器将会用蓝色高亮(意思是它们太亮了)。
Yellow:Not A Pure Metal(不是纯金属) 如果你勾选了 Check Pure Metals 选项,任何被 Unity 定义为金属,却有个非0的反照率值得像素,材质验证器将用黄色高亮。更多细节请见下面的 Pure Metals。

Unity’s Material Charts 中定义了非金属的标准亮度范围是 25-243 sRGB,金属的范围是 186-255 sRGB。“Validate Albedo” 模式中任何超出这些颜色值范围的像素,将被标上不同的颜色,以表示它们的值太低或者太高了。

在下面的例子中,第一个纹理低于最低亮度值,因此太暗了。第四个纹理高于最大亮度值,因此太亮了。

【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第3张图片
场景(没有使用材质验证器(Material Validator))中第一个与第四个材质具有错误的反照率值
【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第4张图片
相同的场景,但是使用材质验证器,并且被设置为 Validate Albedo 选项。低于最低亮度的纹理是红色的。高于最高亮度值得纹理是蓝色的。

材质查阅表提供了一般材质的反照率值。反照率值的亮度对生成的漫反射光线的数量具有显著的影响,因此在 Global Illumination(全局光照) 烘焙中,确保不同的材质类型都在正确的亮度范围内,以及相互之间的比例是非常重要的。为了帮助你获得正确的值,你可以从 Luminance Validation(亮度验证) 下拉选项中的预设值中选择,预设值提供了一般材质的反照率值来核实特定材质类型的亮度范围。

覆盖默认亮度值

取决于你的项目的艺术风格,你可能想让材质的亮度值与预设亮度范围不同。这种情况下,你可以使用具有你自己值的材质验证器来覆盖内置的反照率颜色。为了覆盖预设的亮度范围,需要为每一个想要的材质类型分配一个 AlbedoSwatchInfo 值的数组到 EditorGraphicsSettings.albedoSwatches 属性上。

验证金属镜面模式

【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第5张图片
Validate Metal Specular 模式下的 PBR 验证设置

当你将 Material Validation(材质验证) 设置为 Validate Metal Specular(验证金属镜面) 选项时,场景视图中将出现的 PBR Validation Settings(PBR 验证设置)。

属性 作用
Check Pure Metals(选择全金属) 如果你想要材质验证器对 Unity 中定义为金属,但是反照率值却不为0的像素进行高亮,就可以勾选该选项。更多细节请见下面的 Pure Metals。默认情况下,该选项没有被勾选。
Color Legend(颜色说明) 当材质的像素值无效,这些颜色代表了材质验证器将在场景中展示的颜色——意味着他们的镜面值超过了那种材质类型的有效值范围(金属或非金属)。下面的表格指出了有效值范围。
Red:Below Minimum Specular Value(低于最小镜面值) 任何低于最小 Specular Value 的像素,材质验证器将会用红色高亮。(40 代表非金属最小值,155代表金属最小值)
Blue:Above Maximum Specular Value(超过最大亮度值) 任何高于最大 Luminance Validation 的像素,材质验证器将会用蓝色高亮。(75 代表非金属最大值,255代表金属最大值)
Yellow:Not A Pure Metal(不是纯金属) 如果你勾选了 Check Pure Metals 选项,任何被 Unity 定义为金属,却有个非0的反照率值得像素,材质验证器将用黄色高亮。更多细节请见下面的 Pure Metals。

Unity 材质查阅表中定义了两种单独的镜面范围:

  • 非金属材质:40-75 sRGB
  • 金属材质:155-255sRGB

在 Untiy 中,所有非金属材质都有一个固定的镜面值,企鹅总是在正确范围内。然而,金属材质有时候具有过低的镜面值。为了帮助你辨别这类问题中的金属材质,材质验证器的 Validate Metal Specular 模式会将所有镜面值过低的像素标上颜色。这包括了定义中的所有非金属材质。

在下图的例子中,左边的材质低于最小镜面值,因此太暗了。场景视图也是如此(经面值过低)。右边材质的镜面值在有效范围内。

【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第6张图片
场景中有两个金属材质。左边的具有不正确的金属镜面值。
【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第7张图片
相同的场景下,但是具有材质验证器,并且设置为 **Validate Metal Specular** 模式

纯金属

Unity PBS 材质将镜面颜色超过 155 sRGB 的定义为金属。在 Untiy 中,将金属材质定义为纯金属(pure metal)

如果一个非金属表面具有过高的镜面颜色,但却具有非0的反照率值,那么这通常会导致识别错误。材质验证器还有个选项叫做 Check Pure Metals(检测纯金属)。当你勾选该选项,任何在 Untiy 中被定义为金属,但却具有非0反照率值,材质验证器就会用黄色高亮该材质。下面有个关于这点的例子。它展示了三个材质,左边和右边的材质是纯金属,但是中间的不是,所以材质验证器将把它标上黄色。

【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第8张图片
场景中有三个金属材质。中间材质不是纯金属(它具有非0反照率值)。
【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator)_第9张图片
相同的场景下,但是具有材质验证器,且勾选了 **Check Pure Metals(检测纯金属)**选项。

在上面的第二张图中,背景是红色的,因为在材质验证器的 Validate Metal Specular 模式下,背景材质低于最小镜面值。

对于结合使用了金属与非金属属性的复杂材质,纯金属检测器有可能获得一些无效的像素,但是如果材质完全无效,那么通常是识别错误的象征。

实现

材质验证器对任何使用了 Untiy Standard shader 或 surface shaders 的材质都有效。然而,自定义着色器需要一个名为 “META” 的 pass。大多数支持光照贴图的自定义着色器已经定义了该 pass。 更多信息请看 Meta pass 一节。

执行以下步骤,使你的自定义着色器与材质验证器兼容:

  1. 添加一下语句到 meta pass: #pragma shader_feature EDITOR_VISUALIZATION
  2. UnityMetaInput 结构体中,分配材质的镜面颜色值到 SpecularColor 字段中,如下面所示代码举例。

这里有一个自定义 meta pass 的例子:

Pass
{
    Name "META" 
    Tags { "LightMode"="Meta" }

    Cull Off

    CGPROGRAM
    #pragma vertex vert_meta
    #pragma fragment frag_meta

    #pragma shader_feature _EMISSION
    #pragma shader_feature _METALLICGLOSSMAP
    #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    #pragma shader_feature ___ _DETAIL_MULX2
    #pragma shader_feature EDITOR_VISUALIZATION

    float4 frag_meta(v2f_meta i) : SV_TARGET
    {
        UnityMetaInput input;
        UNITY_INITIALIZE_OUTPUT(UnityMetaInput, input);
        float4 materialSpecularColor = float4(1.0f, 0.0f, 0.0f, 1.0f);
        float4 materialAlbedo = float4(0.0f, 1.0f, 0.0f, 1.0f);
        input.SpecularColor = materialSpecularColor;
        input.Albedo = materialAlbedo;

        return UnityMetaFragment(input);
    }  
}

如果本文对你有帮助的话,点个赞或者评论一下吧!

下一章:【Unity3D技术文档翻译】第2.5篇 通过脚本访问和修改材质参数

你可能感兴趣的:(【Unity3D技术文档翻译】第2.4篇 PBR材质验证器(Physically Based Rendering Material Validator))