unity 在透明模型上显示阴影

为了搞清AR中模型的阴影实现,找了一整天,最后在ARKit插件中找到了这个shader

*我在unity2017.3中使用有些问题 充当透明地面的模型总是纯黑色 这时再加一个相机 这情况有会消失 谁搞清楚了请回复下

//这是基于来自一个着色器 https://alastaira.wordpress.com/2014/12/30/adding-shadows-to-a-unity-vertexfragment-shader-in-7-easy-steps/

Shader "Custom/MobileARShadow"
{
    SubShader {
        Pass {
         
            // 1.)这将成为环境,顶点和顶点的基础向前渲染过程
            //主方向灯将被应用。 额外的灯光需要额外的通行证
            //使用“ForwardAdd”指示灯模式。
            // see: http://docs.unity3d.com/Manual/SL-PassTags.html
            Tags { "LightMode" = "ForwardBase" "RenderType"="Opaque" "Queue"="Geometry+1" "ForceNoShadowCasting"="True"  }
			LOD 200
			Blend Zero SrcColor
			ZWrite On
        
            CGPROGRAM
 
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            // 2.)这与LightMode标签的“forward base”匹配,以确保着色器编译
            //正确的低音前传。 与LightMode标签一样,用于任何其他灯光
            //这将从_fwdbase更改为_fwdadd。
            #pragma multi_compile_fwdbase
 
            // 3.) 引用包含所有照明影子宏的Unity库
            #include "AutoLight.cginc"
 
 
            struct v2f
            {
                float4 pos : SV_POSITION;
                 
                // 4.)LIGHTING_COORDS宏(在AutoLight.cginc中定义)定义了需要采样的参数
                //阴影贴图。 (0,1)指定哪个未使用的TEXCOORD语义来保存采样值 - 
                //因为我在这个着色器中没有使用任何texcoords,所以我可以使用TEXCOORD0和TEXCOORD1作为阴影
                //采样。 如果我已经在使用TEXCOORD作为UV坐标,比如说,我可以指定
                // LIGHTING_COORDS(1,2)代替使用TEXCOORD1和TEXCOORD2。
                LIGHTING_COORDS(0,1)
            };
 
 
            v2f vert(appdata_base v) {
                v2f o;
                o.pos = UnityObjectToClipPos (v.vertex);
                 
                // 5.)TRANSFER_VERTEX_TO_FRAGMENT宏填充v2f结构中选定的LIGHTING_COORDS
                //用适当的值从阴影/照明图中进行取样
                TRANSFER_VERTEX_TO_FRAGMENT(o);
                 
                return o;
            }
 
            fixed4 frag(v2f i) : COLOR {
             
                // 6.)LIGHT_ATTENUATION对阴影图进行采样(使用由TRANSFER_VERTEX_TO_FRAGMENT计算的坐标
                //并存储在由LIGHTING_COORDS定义的结构中),并将该值作为float返回。
                float attenuation = LIGHT_ATTENUATION(i);
                return fixed4(1.0,1.0,1.0,1.0) * attenuation;
            }
 
            ENDCG
        }
    }
     
    // 7.)要接受或投射阴影,着色器必须实施适当的“Shadow Collector”或“Shadow Caster”通行证。
    //虽然我们在这个着色器中没有明确地这样做,但是如果这些通道缺失,它们将从回退中读取
    //着色器,所以在这里指定一个导入在该回退中使用的收集器/脚轮通道。
    Fallback "VertexLit"

}

这个是在github上找到的,和上面有同样的问题

Shader "ChuckLee/ARShadow"
{
	Properties
	{
		_ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53)
	}
	SubShader
	{
		Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" }
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			Tags{ "LightMode" = "ForwardBase" }

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fwdbase

			#include "UnityCG.cginc"
			#include "AutoLight.cginc" 

			struct appdata
			{
				float4 vertex : POSITION;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				SHADOW_COORDS(2)
			};

			fixed4 _ShadowColor;

			v2f vert(appdata v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				TRANSFER_SHADOW(o);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				fixed atten = SHADOW_ATTENUATION(i);
				return fixed4(_ShadowColor.rgb,saturate(1 - atten)*_ShadowColor.a);
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}


你可能感兴趣的:(Unity3D)