间接光照的产生Shader

之前学习了全局光照以及动态对象光照探针,使场景中的对象都可以接受间接光照的反射效果,但是要如何在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"
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值