Cómo recibir sombras en objects animados ¿De manera optimizada?

He estado tratando de agregar sombra a mi bandera que animó En mi sombreador de vértices, pero después de agregar sombra, mi sombra es fija y no sigue la animation de la bandera.

para agregar sombra, utilizo el siguiente enlace:

Difuso tiene una reserva de vértice iluminado, que contiene dos pases; Shadow Caster y Shadow Receiver. Estos son los dos pases que permiten al sombreador emitir y recibir sombras. http://polycount.com/discussion/131260/how-to-get-custom-shaders-to-recieve-shadows

bandera animando pero la sombra está arreglada

mi shader está aquí:

Shader "Custom/Flag" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _Speed ("Speed", Range(0, 5.0)) = 1 _Frequency ("Frequency", Range(0, 1.3)) = 1 _Amplitude ("Amplitude", Range(0, 5.0)) = 1 } SubShader { Tags { "RenderType"="Opaque" "LightMode"="ForwardBase" } Cull off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fwdbase #include "UnityCG.cginc" #include "AutoLight.cginc" sampler2D _MainTex; float4 _MainTex_ST; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; LIGHTING_COORDS(1, 2) }; float _Speed; float _Frequency; float _Amplitude; v2f vert(appdata_base v) { v2f o; v.vertex.y += cos((v.vertex.x + _Time.y * _Speed) * _Frequency) * _Amplitude * (v.vertex.x - 5); o.pos = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); TRANSFER_VERTEX_TO_FRAGMENT(o); return o; } fixed4 frag(v2f i) : SV_Target { return tex2D(_MainTex, i.uv); } ENDCG } } FallBack "VertexLit" } 

Finalmente utilizo "LightMode"="ShadowCaster" pero esta label impide renderizar mi bandera como este problema . Una solución me vino a la mente que funciona correctamente "usando dos pases para implementar sombras: 1.normal pase 2.ShadowCaster pass" pero creo No es optimizar

enter image description here

esta es mi solución como Pseudo Código:

  SubShader { Tags { "RenderType"="Opaque" } Cull off Pass { CGPROGRAM Shader "Custom/Flag" // normal Pass for animating flag ENDCG } Pass { Tags { "LightMode"="ShadowCaster" } CGPROGRAM Shader "Custom/Flag" //ShadowCaster Pass for recieving shadow ENDCG } } FallBack "VertexLit" } 

Flag shader.unitypackage

En resumen, encuentro una manera de agregar sombras para objects animados de vértices de manera optimizada.

El sistema de 2 pases es la única forma. Es la forma en que el motor maneja las sombras.

Aquí hay un ejemplo de un pase sombra del manual de la unidad. Tendría que modificar el shadow shader 'vertex shader'.

  // shadow caster rendering pass, implemented manually // using macros from UnityCG.cginc Pass { Tags {"LightMode"="ShadowCaster"} CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #include "UnityCG.cginc" struct v2f { V2F_SHADOW_CASTER; }; v2f vert(appdata_base v) { v2f o; TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) return o; } float4 frag(v2f i) : SV_Target { SHADOW_CASTER_FRAGMENT(i) } ENDCG }