【Vuforia】012-角色的阴影制作(shader方式与利用RenderTexture)

AR虚拟场景中,由于没有物体接受阴影,所以看不见影子

解决方案1:创建一个平面来接收阴影,但是该平面又不需要显示,所以需要创建shader,用来让平面透明而能接受阴影

文章:AR中虚拟物体投射阴影的Unity Shader实现

shader:

Shader "Shadow/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 shadow = SHADOW_ATTENUATION(i);
                return fixed4(_ShadowColor.rgb,saturate(1-shadow)*_ShadowColor.a);
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

关键在于片元着色器的这段

fixed shadow = SHADOW_ATTENUATION(i);
return fixed4(_ShadowColor.rgb,saturate(1-shadow)*_ShadowColor.a);

我们取1和shadow的差,归到(0,1)区间,然后乘以_ShadowColor的alpha值,最终作为输出片元的alpha值。saturate(1-shadow)*_ShadowColor.a在非阴影区域内为0,开启透明混合以后,此处是透明的,所以非阴影部分不会得到展现,而阴影区域得到大于零的值,并根据_ShadowColor 的值被渲染出想要的颜色和柔和度。

用这个Shader建立一个Materia放在Qaud上,把Qaud放在"地面"上就可以了,它其他物体投来的接受阴影,并且只渲染这个阴影


解决方案2:利用renderTexture,平面,摄像机来只拍摄角色,来实现

1,创建一个材质球,renderTexture,用来做材质球的纹理,

【Vuforia】012-角色的阴影制作(shader方式与利用RenderTexture)_第1张图片
2,将材质球拖给要用来渲染阴影的平面
【Vuforia】012-角色的阴影制作(shader方式与利用RenderTexture)_第2张图片
3,指定角色的层级,只让影子相机渲染角色层,把renderTexture拖给 targetTeture
【Vuforia】012-角色的阴影制作(shader方式与利用RenderTexture)_第3张图片

最终效果:

【Vuforia】012-角色的阴影制作(shader方式与利用RenderTexture)_第4张图片

你可能感兴趣的:(【Vuforia】012-角色的阴影制作(shader方式与利用RenderTexture))