之前学习了全局光照以及动态对象光照探针,使场景中的对象都可以接受间接光照的反射效果,但是要如何在Shader中使物体可以对其他物体反射间接光呢?
这就要用到Tags { "LightMode" = "Meta" }的Pass来实现
Pass源代码:
Pass
{
Name "META"
Tags { "LightMode" = "Meta" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#include "UnityCG.cginc"
#include "UnityMetaPass.cginc"
struct v2f
{
float4 pos : SV_POSITION;
float2 uvMain : TEXCOORD0;
float2 uvIllum : TEXCOORD1;
#ifdef EDITOR_VISUALIZATION
float2 vizUV : TEXCOORD2;
float4 lightCoord : TEXCOORD3;
#endif
UNITY_VERTEX_OUTPUT_STEREO
};
float4 _MainTex_ST;
float4 _Illum_ST;
v2f vert (appdata_full v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.pos = UnityMetaVertexPosition(v.vertex, v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);
o.uvMain = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uvIllum = TRANSFORM_TEX(v.texcoord, _Illum);
#ifdef EDITOR_VISUALIZATION
o.vizUV = 0;
o.lightCoord = 0;
if (unity_VisualizationMode == EDITORVIZ_TEXTURE)
o.vizUV = UnityMetaVizUV(unity_EditorViz_UVIndex, v.texcoord.xy, v.texcoord1.xy, v.texcoord2.xy, unity_EditorViz_Texture_ST);
else if (unity_VisualizationMode == EDITORVIZ_SHOWLIGHTMASK)
{
o.vizUV = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
o.lightCoord = mul(unity_EditorViz_WorldToLight, mul(unity_ObjectToWorld, float4(v.vertex.xyz, 1)));
}
#endif
return o;
}
sampler2D _MainTex;
sampler2D _Illum;
fixed4 _Color;
fixed _Emission;
half4 frag (v2f i) : SV_Target
{
UnityMetaInput metaIN;
UNITY_INITIALIZE_OUTPUT(UnityMetaInput, metaIN);
fixed4 tex = tex2D(_MainTex, i.uvMain);
fixed4 c = tex * _Color;
metaIN.Albedo = c.rgb;
metaIN.Emission = c.rgb * tex2D(_Illum, i.uvIllum).a;
#if defined(EDITOR_VISUALIZATION)
metaIN.VizUV = i.vizUV;
metaIN.LightCoord = i.lightCoord;
#endif
return UnityMetaFragment(metaIN);
}
ENDCG
}
}
Fallback "Legacy Shaders/VertexLit"
CustomEditor "LegacyIlluminShaderGUI"
}
Shader 的实现:
Shader"unity/Global_GI"
{
Properties
{
_Color("Color",Color)=(1,1,1,1)
}
SubShader
{
//全局光照Pass
Pass{...}
//ShadowCaster Pass
Pass{...}
//该Pass在烘焙光照贴图时执行,用于产生间接光照
Pass
{
Name "META"
Tags { "LightMode" = "Meta" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#include "UnityCG.cginc"
#include "UnityMetaPass.cginc"
fixed4 _Color;
struct v2f
{
float4 pos : SV_POSITION;
};
v2f vert (appdata_full v)
{
v2f o;
UNITY_INITIALIZE_OUTPUT(v2f,o)
o.pos = UnityMetaVertexPosition(v.vertex, v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);
return o;
}
half4 frag (v2f i) : SV_Target
{
UnityMetaInput metaIN;
// 初始化
UNITY_INITIALIZE_OUTPUT(UnityMetaInput, metaIN);
metaIN.Albedo = _Color;
metaIN.Emission =_Color;
return UnityMetaFragment(metaIN);
}
ENDCG
}
}
CustomEditor"LegacyIlluminShaderGUI"
}