材質(zhì)屬性和 GI 系統(tǒng)
對象的外觀由其著色器定義。
舊版和當(dāng)前著色器映射
Unity 3 和 4 中的著色器映射與 Unity 5 中的著色器映射具有不同的工作原理。Unity 5 及之后的版本仍然支持舊版著色器映射。請參閱下面的舊版材質(zhì)映射。
Unity 3.x 和 4.x 使用了從材質(zhì)屬性到光照貼圖材質(zhì)屬性的簡單映射。此映射適用于常見情況,但是基于命名約定、標(biāo)簽和字符串。您無法對表面屬性進(jìn)行任何自定義,因為此映射實際上采用了硬編碼技術(shù)定義具體的運行方式。Unity 5.0 及之后的版本具有靈活的著色器映射。
Meta pass(Unity 5.0 及之后的版本)
反照率和發(fā)光是使用特殊的 Meta 著色器 pass 渲染的。光照貼圖靜態(tài)游戲?qū)ο笫鞘褂?GPU 在光照貼圖空間中渲染的。這意味著,游戲?qū)ο笤谄聊簧系耐庥^與其對于光照貼圖而言的外觀是分開的,因此您可以自定義著色器。
Meta pass 可解除反照率和發(fā)光之間的關(guān)聯(lián)性,用于在常規(guī)著色器 pass 期間計算全局光照?(GI)。因此,您可以在控制 GI 的同時不影響用于實時渲染的著色器。標(biāo)準(zhǔn)著色器在默認(rèn)情況下包含 Meta pass。全局光照由 Unity 中的一個名為 Enlighten 的中間件進(jìn)行管理。

Unity Editor 在內(nèi)部處理金屬性表面的反照率時需要使用 Meta pass。Enlighten 處理漫射傳輸并在每次反彈時使用表面反照率。具有黑色(或幾乎黑色)反照率的金屬性表面不會反射任何光線。著色器 pass 在渲染反照率時會讓其偏向具有金屬色調(diào)的更亮顏色。介電材質(zhì)(木材、塑料、石材、混凝土、皮革、皮膚)具有白色鏡面反射率。金屬具有光譜鏡面反射率。
注意:使用 Meta pass 不如?DynamicGI.SetEmissive?的速度快,但靈活性更高,因為不會受限于單個顏色。
舊版材質(zhì)映射
Unity 5.0 及更高版本中的內(nèi)置舊版著色器已經(jīng)包含 Meta pass。如果要將項目從 Unity 5.0 之前的版本進(jìn)行升級,則應(yīng)添加 Meta pass。請參閱下面具有 Meta pass 的示例著色器以了解具體操作方法。
自定義 RGB 透明度
通過向著色器添加名為?_TransparencyLM
?的紋理屬性,即可添加基于顏色的自定義 RGB 透明度。在這種情況下,標(biāo)準(zhǔn)行為將被刪除,并且僅使用此紋理的值來評估材質(zhì)中的傳輸情況。當(dāng)您想要創(chuàng)建獨立于材質(zhì)顏色或反照率紋理的基于顏色的透明度時,這將非常有用。
要創(chuàng)建自定義傳輸行為,請將以下行添加到著色器并分配紋理:
_TransparencyLM ("Transmissive Texture", 2D) = "white" {}
注意:Unity 通過著色器的屬性和路徑/名稱關(guān)鍵字(如?Transparent
、Tree
、Leaf
、Leaves
?等)來檢測某些舊版著色器。
具有 Meta pass 的示例著色器
下面的著色器允許專門為 GI 系統(tǒng)指定自定義反照率顏色和紋理。
Shader "Custom/metaPassShader"{
? ?
Properties {
? ? ? ?
_Color ("Color", Color)=(1,1,1,1)
? ? ? ?
_MainTex ("Albedo (RGB)",2D)="white"{}
? ? ? ?
_Glossiness ("Smoothness", Range(0,1))=0.5
? ? ? ?
_Metallic ("Metallic", Range(0,1))=0.0
? ? ? ?
_GIAlbedoColor ("Color Albedo (GI)", Color)=(1,1,1,1)
? ? ? ?
_GIAlbedoTex ("Albedo (GI)",2D)="white"{}
? ?
}
? ?
SubShader {
? ?
// ------------------------------------------------------------------
? ?
// 提取光照貼圖、GI(發(fā)光、反照率...)的信息
? ?
// 在常規(guī)渲染期間不使用此 pass。
? ? ? ?
Pass{
? ? ? ? ? ?
Name "META"
? ? ? ? ? ?
Tags {"LightMode"="Meta"}
Cull Off
? ? ? ? ? ?
CGPROGRAM
? ? ? ? ? ?
#include"UnityStandardMeta.cginc"
? ? ? ? ? ?
sampler2D _GIAlbedoTex;
? ? ? ? ? ?
fixed4 _GIAlbedoColor;
? ? ? ? ? ?
float4 frag_meta2 (v2f_meta i): SV_Target{
? ? ? ? ? ? ? ?
// 我們對產(chǎn)生最終反照率的漫射和鏡面反射
? ? ? ? ? ? ? ?
// 以及表面粗糙度顏色感興趣。
? ? ? ? ? ? ?
? ? ? ? ? ? ? ?FragmentCommonData data = UNITY_SETUP_BRDF_INPUT (i.uv);
? ? ? ? ? ? ? ?UnityMetaInput o;
?UNITY_INITIALIZE_OUTPUT(UnityMetaInput, o);
fixed4 c = tex2D (_GIAlbedoTex, i.uv);
? ? ? ? ? ? ? ?
o.Albedo = fixed3(c.rgb * _GIAlbedoColor.rgb);
? ? ? ? ? ? ? ?
o.Emission = Emission(i.uv.xy);
? ? ? ? ? ? ? ?
return UnityMetaFragment(o);
}
? ? ? ? ?
? ? ? ? ? ?
#pragma vertex vert_meta
? ? ? ? ? ?
#pragma fragment frag_meta2
? ? ? ? ? ?
#pragma shader_feature _EMISSION
? ? ? ? ? ?
#pragma shader_feature _METALLICGLOSSMAP
? ? ? ? ? ?
#pragma shader_feature ___ _DETAIL_MULX2
? ? ? ? ? ?
ENDCG?
}
? ? ?
? ? ? ?
Tags {"RenderType"="Opaque"}
? ? ? ?
LOD 200
? ? ? ?
CGPROGRAM
? ? ? ?
// 這是基于物理的標(biāo)準(zhǔn)光照模型,并對所有光照類型啟用陰影
? ? ? ?
#pragma surface surf Standard fullforwardshadows nometa
? ? ? ?
// 使用 Shader Model 3.0 目標(biāo)以獲得更美觀的光照
? ? ? ?
#pragma target 3.0
? ? ? ?
sampler2D _MainTex;
? ? ? ?
struct Input {
? ? ? ? ? ?
float2 uv_MainTex;
? ? ? ?
};
? ? ?
? ? ? ?
half _Glossiness;
? ? ? ?
half _Metallic;
? ? ? ?
fixed4 _Color;
? ? ?
? ? ? ?
void surf (Input IN,inout SurfaceOutputStandard o){
? ? ? ? ? ?
// Albedo 來自顏色著色的紋理
? ? ? ? ? ?
fixed4 c = tex2D (_MainTex, IN.uv_MainTex)* _Color;
? ? ? ? ? ?
o.Albedo = c.rgb;
? ? ? ? ? ?
// Metallic 和 Smoothness 來自滑動條變量
? ? ? ? ? ?
o.Metallic = _Metallic;
? ? ? ? ? ?
o.Smoothness = _Glossiness;
? ? ? ? ? ?
o.Alpha = c.a;
? ? ? ?
}
? ? ? ?
ENDCG
? ?
}
? ?
FallBack "Diffuse"
}