Прозрачная тень Unity, принимающая приложение AR, чтобы получать только тени, а не отражения света - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над прозрачным приемником теней для приложения дополненной реальности в Unity, который помещен в плоскость, которая будет получать тени от точечного света или прожектора.Он работает нормально, но самолет получает свет также, как вы можете видеть на изображении.

Вывод Скриншоты

Я использую единицу 5.6.3p4.Скажите, пожалуйста, в чем может быть проблема в этом сценарии или что я должен изменить в этом коде, чтобы получать только тени, а не отражения света на плоскости?

Сценарий шейдера приведен ниже:

Shader "SP/InvisibleShadowCasterForPLight" { 
 Properties { 
     _MainTex("Base (RGB)", 2D) = "white" {} 
 } 

 SubShader {
     Pass {
         Blend One One
         Tags { "LightMode" = "ForwardAdd" } 
         CGPROGRAM 
         #pragma vertex vert 
         #pragma fragment frag 
         #include "UnityCG.cginc" 
         #pragma multi_compile_fwdadd_fullshadows 
         #include "AutoLight.cginc" 
         sampler2D _MainTex;
         float4 _MainTex_ST;

         struct v2f { 
             float4 pos : SV_POSITION; 
             LIGHTING_COORDS(0,1) 
             float2 uv : TEXCOORD2;
         }; 

         v2f vert(appdata_base v) { 
             v2f o; 
             o.pos = UnityObjectToClipPos(v.vertex); 
             o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
             TRANSFER_VERTEX_TO_FRAGMENT(o); 
             return o; 
         } 

         fixed4 frag(v2f i) : COLOR
         { 
             float attenuation = LIGHT_ATTENUATION(i); 
             return tex2D (_MainTex, i.uv) * attenuation; 
         } 
         ENDCG 
     }
 }

 Fallback "VertexLit" 

}

1 Ответ

0 голосов
/ 04 января 2019

Заменить:

LIGHTING_COORDS(0,1) 

на:

UNITY_SHADOW_COORDS(0)

Затем заменить:

TRANSFER_VERTEX_TO_FRAGMENT(0) 

на:

TRANSFER_SHADOW(o);

Наконец,в вашей функции фрагмента используйте это:

half shadow = SHADOW_ATTENUATION(i);
return tex2D (_MainTex, i.uv) * shadow; 

Это должно сделать это!Да, и вы можете, а можете и не захотеть изменить режим смешивания на мультипликативный ... Если вышеописанное не работает, попробуйте изменить:

Blend One One

с помощью:

Blend DstColor Zero
...