适用于AR应用程序的Unity透明阴影接收平面,仅接收阴影而不接收光反射

时间:2018-09-22 10:01:25

标签: unity3d augmented-reality shadow fragment-shader shaderlab

我正在为Unity中的Augmented Reality应用程序开发一个透明的阴影接收着色器,将其放置在一个平面中,该平面将接收来自点光源或聚光灯的阴影。它可以正常工作,但是飞机也可以接收光线,就像您在图像中看到的一样。

Output Screenshots

我正在使用统一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 :(得分:0)

替换:

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; 

应该这样做! 哦,您可能也可能不希望将blendmode更改为乘法...如果以上方法无效,请尝试更改:

Blend One One

具有:

Blend DstColor Zero