Unity透明阴影接收平面让AR应用只接收阴影不接收光反射
Unity transparent shadow receiving plane for AR app to receive only shadows and not light reflections
我正在为 Unity 中的增强现实应用开发一个透明阴影接收着色器,它被放入一个平面中,该平面将接收来自点光源或聚光灯的阴影。它工作正常,但飞机也接收光线,正如您在图像中看到的那样。
Output Screenshots
我正在使用 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"
}
替换:
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
我正在为 Unity 中的增强现实应用开发一个透明阴影接收着色器,它被放入一个平面中,该平面将接收来自点光源或聚光灯的阴影。它工作正常,但飞机也接收光线,正如您在图像中看到的那样。
Output Screenshots
我正在使用 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"
}
替换:
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