欢迎光临散文网 会员登陆 & 注册

基于物理的渲染材质验证器

2020-06-14 08:20 作者:unity_某某师_高锦锦  | 我要投稿

基于物理的渲染材质验证器 (Physically Based Rendering Material Validator) 是 Scene 视图中的一种绘制模式,它可以确保材质使用的值处于基于物理的着色器的建议参考值范围内。如果特定材质中的像素值落在参考范围之外,则材质验证器会突出显示不同颜色的像素以指示失败状态。

要使用材质验证器,请选择 Scene 视图的__绘制模式 (Draw Mode)__ 下拉菜单,默认情况下该菜单通常设置为 Shaded

Scene 视图的绘制模式下拉菜单

导航到 Material Validation 部分。材质验证器有两种模式:__Validate Albedo__ 和 Validate Metal Specular

Scene 视图绘制模式下拉菜单中的 Material Validation 选项

注意:还可以使用 Unity 的材质图表来检查建议值。在创作材质时,您仍需要使用这些图表来决定__反照率__和__金属镜面反射__值。但是,材质验证器提供了一种可视化的编辑器内部验证方式,可让您在资源处于场景中时快速检查材质的值是否有效。

另请注意:验证器仅适用于线性颜色空间。基于物理的渲染不适用于伽马颜色空间,因此如果您要使用基于物理的渲染 (PBR) 和 PBR 材质验证器,那么同时还应使用线性颜色空间。

Validate Albedo 模式

处于 Validate Albedo 模式时在 Scene 视图中显示的 PBR 验证设置 (PBR Validation Settings)

将 Material Validation 设置为 Validate Albedo 时,在 Scene 视图中显示的 PBR 验证设置 (PBR Validation Settings) 如下。

功能属性

Unity 的材质图表定义了非金属的标准亮度范围为 50–243 sRGB,而金属的标准亮度范围为 186–255 sRGB。Validate Albedo 模式会使用不同颜色显示处于这些范围之外的任何像素,以指示该值太低或太高。

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

一个场景(未启用材质验证器)中的第一个和第四个材质具有不正确的反照率值
启用了材质验证器并设置为 Validate Albedo 模式的相同场景。低于最小亮度值的纹理为红色。高于最小亮度值的纹理为蓝色

材质图表提供常见材质的反照率值。反照率值的亮度对产生的漫射光量有巨大影响,因此全局光照烘焙必须确保不同的材质类型位于正确的亮度范围内(彼此成比例),这一点十分重要。为了方便正确设置这些值,可从 Luminance Validation 下拉选单的预设选项中进行选择,该下拉选单提供了常用的材质反照率值以便验证特定材质类型的亮度范围。

覆盖默认亮度值

根据项目的美术风格,您可能希望材质的亮度值与预设的亮度范围不同。在这种情况下,可使用自己的值覆盖材质验证器使用的内置反照率值。要覆盖预设亮度范围,请将每种所需材质类型的 AlbedoSwatchInfo 值数组分配给属性 EditorGraphicsSettings.albedoSwatches。

Validate Metal Specular 模式

处于 Validate Metal Specular 模式时的 PBR 验证设置 (PBR Validation Settings)

将 Material Validation 设置为 Validate Metal Specular 时,在 Scene 视图中显示的 PBR 验证设置 (PBR Validation Settings) 如下。

属性功能

Unity 的材质图表定义了两个独立的镜面反射颜色范围:

  • __非金属性材质__:40–75 sRGB

  • __金属性材质__:155 - 255 sRGB

在 Unity 中,所有非金属性材质都具有始终处于正确范围内的恒定镜面反射颜色。然而,金属性材质通常具有太低的镜面反射值。为了帮助您识别存在此问题的金属性材质,材质验证器的 Validate Metal Specular 模式使用颜色来标示镜面反射颜色值太低的所有像素。根据定义,这包括所有非金属性材质。

在下面的示例中,左侧材质低于最小镜面反射值,因此太暗。这也适用于场景的背景。右侧材质的镜面反射值处于有效范围内。

包含两种金属性材质的场景。左侧材质的金属性镜面反射值不正确
启用了材质验证器并设置为 Validate Metal Specular 模式的相同场景

纯金属

Unity 将镜面反射颜色大于 155 sRGB 的基于物理的着色材质定义为金属性材质。Unity 将金属性材质定义为__纯金属__

如果非金属性表面的镜面反射颜色值太高,但反照率值为非零,则通常是由于创作错误导致的。材质验证器还有一个名为 Check Pure Metals 的选项。启用此选项后,材质验证器会以黄色显示由 Unity 定义为金属性但具有非零反照率值的所有材质。在下面的图像中可以看到这方面的一个例子。此处显示了三种材质,左侧和右侧材质为纯金属,但中间的材质不是,因此材质验证器将其显示为黄色:

包含三种金属性材质的场景。中间的材质不是纯金属(它具有非零反照率值)
启用了__材质验证器、设置为 Validate Metal Specular__ 模式并启用了 Check Pure Metals 的相同场景

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

对于金属性和非金属性属性相结合的复杂材质,纯金属检查器可能会拾取一些无效像素,但如果材质完全无效,则通常表示存在创作错误。

实现

只要材质使用 Unity 标准着色器或表面着色器,即可采用材质验证器。但是,自定义着色器需要一个名为 "META" 的 pass。大多数支持光照贴图的自定义着色器已经定义了此 pass。请参阅有关 Meta pass 的文档以了解更多详细信息。

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

1.将以下 pragma 添加到 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);    

}   

}


基于物理的渲染材质验证器的评论 (共 条)

分享到微博请遵守国家法律