为了搞清AR中模型的阴影实现,找了一整天,最后在ARKit插件中找到了这个shader
*我在unity2017.3中使用有些问题 充当透明地面的模型总是纯黑色 这时再加一个相机 这情况有会消失 谁搞清楚了请回复下
//这是基于来自一个着色器 https://alastaira.wordpress.com/2014/12/30/adding-shadows-to-a-unity-vertexfragment-shader-in-7-easy-steps/ Shader "Custom/MobileARShadow" { SubShader { Pass { // 1.)这将成为环境,顶点和顶点的基础向前渲染过程 //主方向灯将被应用。 额外的灯光需要额外的通行证 //使用“ForwardAdd”指示灯模式。 // see: http://docs.unity3d.com/Manual/SL-PassTags.html Tags { "LightMode" = "ForwardBase" "RenderType"="Opaque" "Queue"="Geometry+1" "ForceNoShadowCasting"="True" } LOD 200 Blend Zero SrcColor ZWrite On CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" // 2.)这与LightMode标签的“forward base”匹配,以确保着色器编译 //正确的低音前传。 与LightMode标签一样,用于任何其他灯光 //这将从_fwdbase更改为_fwdadd。 #pragma multi_compile_fwdbase // 3.) 引用包含所有照明影子宏的Unity库 #include "AutoLight.cginc" struct v2f { float4 pos : SV_POSITION; // 4.)LIGHTING_COORDS宏(在AutoLight.cginc中定义)定义了需要采样的参数 //阴影贴图。 (0,1)指定哪个未使用的TEXCOORD语义来保存采样值 - //因为我在这个着色器中没有使用任何texcoords,所以我可以使用TEXCOORD0和TEXCOORD1作为阴影 //采样。 如果我已经在使用TEXCOORD作为UV坐标,比如说,我可以指定 // LIGHTING_COORDS(1,2)代替使用TEXCOORD1和TEXCOORD2。 LIGHTING_COORDS(0,1) }; v2f vert(appdata_base v) { v2f o; o.pos = UnityObjectToClipPos (v.vertex); // 5.)TRANSFER_VERTEX_TO_FRAGMENT宏填充v2f结构中选定的LIGHTING_COORDS //用适当的值从阴影/照明图中进行取样 TRANSFER_VERTEX_TO_FRAGMENT(o); return o; } fixed4 frag(v2f i) : COLOR { // 6.)LIGHT_ATTENUATION对阴影图进行采样(使用由TRANSFER_VERTEX_TO_FRAGMENT计算的坐标 //并存储在由LIGHTING_COORDS定义的结构中),并将该值作为float返回。 float attenuation = LIGHT_ATTENUATION(i); return fixed4(1.0,1.0,1.0,1.0) * attenuation; } ENDCG } } // 7.)要接受或投射阴影,着色器必须实施适当的“Shadow Collector”或“Shadow Caster”通行证。 //虽然我们在这个着色器中没有明确地这样做,但是如果这些通道缺失,它们将从回退中读取 //着色器,所以在这里指定一个导入在该回退中使用的收集器/脚轮通道。 Fallback "VertexLit" }
这个是在github上找到的,和上面有同样的问题
Shader "ChuckLee/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" }