上一章:【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 Albedo 与 Validate Metal Specular。
场景视图中,绘制模式下拉菜单中的材质验证器选项。注意:你还可以查阅材质图标中的推荐值 Unity’s Material Charts。当在制作材质,决定反照率(albedo) 和金属镜面(metal specular)值时,你需要查阅这些图表。然而,材质验证器提供了一个可视的、编辑器内置的快速检查场景中资源的材质值是否有效的方式。
同时注意:验证器只作用于线性颜色空间(Linear color space)。PBR 不打算用于 Gamma 颜色空间,因此如果你正在使用 PBR 和 PBS 材质验证器,你应该同时使用 线性颜色空间(Linear color space)
Validate Albedo 模式
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” 模式中任何超出这些颜色值范围的像素,将被标上不同的颜色,以表示它们的值太低或者太高了。
在下面的例子中,第一个纹理低于最低亮度值,因此太暗了。第四个纹理高于最大亮度值,因此太亮了。
场景(没有使用材质验证器(Material Validator))中第一个与第四个材质具有错误的反照率值 相同的场景,但是使用材质验证器,并且被设置为 Validate Albedo 选项。低于最低亮度的纹理是红色的。高于最高亮度值得纹理是蓝色的。材质查阅表提供了一般材质的反照率值。反照率值的亮度对生成的漫反射光线的数量具有显著的影响,因此在 Global Illumination(全局光照) 烘焙中,确保不同的材质类型都在正确的亮度范围内,以及相互之间的比例是非常重要的。为了帮助你获得正确的值,你可以从 Luminance Validation(亮度验证) 下拉选项中的预设值中选择,预设值提供了一般材质的反照率值来核实特定材质类型的亮度范围。
覆盖默认亮度值
取决于你的项目的艺术风格,你可能想让材质的亮度值与预设亮度范围不同。这种情况下,你可以使用具有你自己值的材质验证器来覆盖内置的反照率颜色。为了覆盖预设的亮度范围,需要为每一个想要的材质类型分配一个 AlbedoSwatchInfo 值的数组到 EditorGraphicsSettings.albedoSwatches 属性上。
验证金属镜面模式
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 模式会将所有镜面值过低的像素标上颜色。这包括了定义中的所有非金属材质。
在下图的例子中,左边的材质低于最小镜面值,因此太暗了。场景视图也是如此(经面值过低)。右边材质的镜面值在有效范围内。
场景中有两个金属材质。左边的具有不正确的金属镜面值。 相同的场景下,但是具有材质验证器,并且设置为 **Validate Metal Specular** 模式纯金属
Unity PBS 材质将镜面颜色超过 155 sRGB 的定义为金属。在 Untiy 中,将金属材质定义为纯金属(pure metal)。
如果一个非金属表面具有过高的镜面颜色,但却具有非0的反照率值,那么这通常会导致识别错误。材质验证器还有个选项叫做 Check Pure Metals(检测纯金属)。当你勾选该选项,任何在 Untiy 中被定义为金属,但却具有非0反照率值,材质验证器就会用黄色高亮该材质。下面有个关于这点的例子。它展示了三个材质,左边和右边的材质是纯金属,但是中间的不是,所以材质验证器将把它标上黄色。
场景中有三个金属材质。中间材质不是纯金属(它具有非0反照率值)。 相同的场景下,但是具有材质验证器,且勾选了 **Check Pure Metals(检测纯金属)**选项。在上面的第二张图中,背景是红色的,因为在材质验证器的 Validate Metal Specular 模式下,背景材质低于最小镜面值。
对于结合使用了金属与非金属属性的复杂材质,纯金属检测器有可能获得一些无效的像素,但是如果材质完全无效,那么通常是识别错误的象征。
实现
材质验证器对任何使用了 Untiy Standard shader 或 surface shaders 的材质都有效。然而,自定义着色器需要一个名为 “META” 的 pass。大多数支持光照贴图的自定义着色器已经定义了该 pass。 更多信息请看 Meta pass 一节。
执行以下步骤,使你的自定义着色器与材质验证器兼容:
- 添加一下语句到 meta pass:
#pragma shader_feature EDITOR_VISUALIZATION
- 在
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);
}
}
如果本文对你有帮助的话,点个赞或者评论一下吧!
网友评论