本文主要是介绍[Unity] vertex-frag形式的shader中接受Unity内置阴影,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Unity5之前,想要接受阴影需要一个名为ShadowCollector的Pass.参考这里:
https://forum.unity.com/threads/i-put-a-shadowcollector-pass-in-my-shader-but-why-does-it-cant-recieves-shadow-why.160010/
但是Unity5之后这个Pass已经没有用了,参见官网:
https://docs.unity3d.com/Manual/UpgradeGuide5-Shaders.html
有如下说明:
然后Unity5之后,想要接受阴影,比较简单网上例子也比较多的是在surface shader中实现,这里不多说.下面总结一个在vf形式的shader中添加接受阴影的方法(注意这里简短起见没有自己写投射阴影的ShadowCaster Pass,投射阴影是读取了Fallback "Mobile/VertexLit"中的这个Pass).我们以一个Lambert光照模型为基础,添加接受阴影的功能.
Shader "Custom/Diffuse_ReceiveShadow"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#pragma multi_compile _ SHADOWS_SCREEN //相关宏#include "UnityCG.cginc"#include "AutoLight.cginc" //SHADOW_COORDS需要#include "Lighting.cginc"struct appdata{float4 pos : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 worldNormal : TEXCOORD1;float3 worldPos : TEXCOORD2;UNITY_FOG_COORDS(3)SHADOW_COORDS(4) //按TEXCOORD数递增};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.pos);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.worldPos = mul(unity_ObjectToWorld, v.pos);o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);TRANSFER_SHADOW(o); //vertex中的处理UNITY_TRANSFER_FOG(o,o.pos);return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed3 col = tex2D(_MainTex, i.uv);fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos); //fragment中的处理,输出到attenfixed3 diffuse = _LightColor0.rgb * atten * col * saturate(dot(worldNormal, worldLightDir));fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 color = ambient + diffuse;// apply fogUNITY_APPLY_FOG(i.fogCoord, color) ; return fixed4(color, 1.0);}ENDCG}}
Fallback "Mobile/VertexLit"
}
简单添加这5处修改之后,我们就可以在游戏中看到接受阴影的效果了.
参考资料:
https://catlikecoding.com/unity/tutorials/rendering/part-7/
这篇关于[Unity] vertex-frag形式的shader中接受Unity内置阴影的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!