赞
踩
为了搞清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"
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。