【UnityShader】平面阴影

平面阴影作为一种最简单的实时阴影实现,尽管其仅能局限于在完全平坦的地面的情况下使用,但由于其性能良好,在许多移动端手游中仍然可以发挥较强的使用价值。

平面阴影的实现原理比较简单,一般由如下几个过程:
1.向shader传入世间到平面的矩阵和平面到世界的矩阵
2.向shader传入灯光方向
3.在平面空间下根据灯光方向计算顶点在平面上的投影坐标,最终得到阴影

但这种方式存在一个问题:我们需要向shader传入至少两个矩阵,而实际上计算顶点沿某方向在平面上的交点要简单的多。

首先考虑以下情况,3D空间中存在某点o,以及平面P,其中P的法线为n,并且存在某点p为平面P上的一点,现在假设从o点沿d方向发射射线,求射线在平面P上的交点h,这时时间上就可以看成计算射线与平面的交点。

根据射线的参数方程:ray = ray.origin+t*ray.direction,即可以知道我们实际上只需求出t,即可确定该射线在平面上的交点:
h = o+t*d


通过计算,得到最终的t:
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity的镂空阴影需要借助于Shader来实现。首先需要在模型的material中利用Shader进行渲染。常用的Shader包括Unlit/Transparent Cutout,Unlit/Transparent和Standard。 然后,在Shader中利用ZTest和ZWrite两个属性来控制阴影的显示。其中,ZTest参数用于控制深度测试,取值为“LessEqual”时表示只有深度小于等于当前像素深度时才通过测试;ZWrite参数用于控制深度写入,取值为“Off”时表示不进行深度写入,从而实现阴影的镂空效果。 具体实现可以参考以下代码片段: Shader "Custom/CutoutShadow" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.5 } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _Color; float _Cutoff; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _Color; clip(col.a - _Cutoff); return col; } ENDCG } } FallBack "Diffuse" } 其中,_Cutoff参数用于控制阴影的透明度阈值,取值越大表示模型的透明部分越少,反之越多。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值