我正在构建Unity AR Foundation
项目,并且需要我的对象从地板下面显示。我需要放置一个将渲染阴影的地板平面,但更重要的是不渲染表面材质,并且应完全防止其下方的对象渲染。
我玩过一些Depth Mask Shaders
,但没有一个起作用,只是渲染成一个大黑洞。
有人实现了吗?对于增强现实项目,这必须是一件普通的事情。
我发现了两个着色器。一个用于在不可见的平面上制作阴影,另一个用于使不可见的平面遮盖住其下面的内容。
阴影着色器在这里:
Shader "AR/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 atten = SHADOW_ATTENUATION(i);
return fixed4(_ShadowColor.rgb,saturate(1 - atten)*_ShadowColor.a);
}
ENDCG
}
}
FallBack "Diffuse"
}
这是遮挡着色器:
Shader "AR/Occlusion"
{
SubShader
{
Tags { "RenderType"="Opaque" }
Tags { "Queue" = "Geometry-1" }
ZWrite On
ZTest LEqual
ColorMask 0
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(0.0, 0.0, 0.0, 0.0);
}
ENDCG
}
}
}
我现在要做的就是弄清楚如何合并两者。
:-)