基于物理的渲染材質驗證器
基于物理的渲染材質驗證器 (Physically Based Rendering Material Validator) 是 Scene 視圖中的一種繪制模式,它可以確保材質使用的值處于基于物理的著色器的建議參考值范圍內。如果特定材質中的像素值落在參考范圍之外,則材質驗證器會突出顯示不同顏色的像素以指示失敗狀態(tài)。
要使用材質驗證器,請選擇 Scene 視圖的__繪制模式 (Draw Mode)__ 下拉菜單,默認情況下該菜單通常設置為?Shaded。

導航到?Material Validation?部分。材質驗證器有兩種模式:__Validate Albedo__ 和?Validate Metal Specular。

注意:還可以使用?Unity 的材質圖表來檢查建議值。在創(chuàng)作材質時,您仍需要使用這些圖表來決定__反照率__和__金屬鏡面反射__值。但是,材質驗證器提供了一種可視化的編輯器內部驗證方式,可讓您在資源處于場景中時快速檢查材質的值是否有效。
另請注意:驗證器僅適用于線性顏色空間?;谖锢淼匿秩静贿m用于伽馬顏色空間,因此如果您要使用基于物理的渲染 (PBR) 和 PBR 材質驗證器,那么同時還應使用線性顏色空間。
Validate Albedo 模式

將 Material Validation 設置為 Validate Albedo 時,在 Scene 視圖中顯示的 PBR 驗證設置 (PBR Validation Settings) 如下。

Unity 的材質圖表定義了非金屬的標準亮度范圍為 50–243 sRGB,而金屬的標準亮度范圍為 186–255 sRGB。Validate Albedo?模式會使用不同顏色顯示處于這些范圍之外的任何像素,以指示該值太低或太高。
在下面的示例中,第一個紋理低于最小亮度值,因此太暗。第四個紋理高于最小亮度值,因此太亮。


材質圖表提供常見材質的反照率值。反照率值的亮度對產生的漫射光量有巨大影響,因此全局光照烘焙必須確保不同的材質類型位于正確的亮度范圍內(彼此成比例),這一點十分重要。為了方便正確設置這些值,可從 Luminance Validation 下拉選單的預設選項中進行選擇,該下拉選單提供了常用的材質反照率值以便驗證特定材質類型的亮度范圍。
覆蓋默認亮度值
根據項目的美術風格,您可能希望材質的亮度值與預設的亮度范圍不同。在這種情況下,可使用自己的值覆蓋材質驗證器使用的內置反照率值。要覆蓋預設亮度范圍,請將每種所需材質類型的?AlbedoSwatchInfo?值數組分配給屬性?EditorGraphicsSettings.albedoSwatches。
Validate Metal Specular 模式

將?Material Validation?設置為?Validate Metal Specular?時,在 Scene 視圖中顯示的 PBR 驗證設置 (PBR Validation Settings) 如下。

Unity 的材質圖表定義了兩個獨立的鏡面反射顏色范圍:
__非金屬性材質__:40–75 sRGB
__金屬性材質__:155 - 255 sRGB
在 Unity 中,所有非金屬性材質都具有始終處于正確范圍內的恒定鏡面反射顏色。然而,金屬性材質通常具有太低的鏡面反射值。為了幫助您識別存在此問題的金屬性材質,材質驗證器的?Validate Metal Specular?模式使用顏色來標示鏡面反射顏色值太低的所有像素。根據定義,這包括所有非金屬性材質。
在下面的示例中,左側材質低于最小鏡面反射值,因此太暗。這也適用于場景的背景。右側材質的鏡面反射值處于有效范圍內。


純金屬
Unity 將鏡面反射顏色大于 155 sRGB 的基于物理的著色材質定義為金屬性材質。Unity 將金屬性材質定義為__純金屬__
如果非金屬性表面的鏡面反射顏色值太高,但反照率值為非零,則通常是由于創(chuàng)作錯誤導致的。材質驗證器還有一個名為?Check Pure Metals?的選項。啟用此選項后,材質驗證器會以黃色顯示由 Unity 定義為金屬性但具有非零反照率值的所有材質。在下面的圖像中可以看到這方面的一個例子。此處顯示了三種材質,左側和右側材質為純金屬,但中間的材質不是,因此材質驗證器將其顯示為黃色:


在上面的第二張圖中,背景為紅色,這是因為背景中的材質低于材質驗證器的?Validate Metal Specular?模式下的最小鏡面反射值。
對于金屬性和非金屬性屬性相結合的復雜材質,純金屬檢查器可能會拾取一些無效像素,但如果材質完全無效,則通常表示存在創(chuàng)作錯誤。
實現(xiàn)
只要材質使用 Unity?標準著色器或表面著色器,即可采用材質驗證器。但是,自定義著色器需要一個名為?"META"
?的 pass。大多數支持光照貼圖的自定義著色器已經定義了此 pass。請參閱有關?Meta pass?的文檔以了解更多詳細信息。
執(zhí)行以下步驟,使自定義著色器與材質驗證器兼容:
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);
? ?
} ??
}