8.平面阴影
                            
                            
                            public class CastShadow : MonoBehaviour {public Transform rec;//接受陰影的物體// Use this for initializationvoid Start () {GetComponent<Renderer>().sharedMaterial.SetMatrix("_World2Ground", rec.GetComponent<Renderer>().worldToLocalMatrix);GetComponent<Renderer>().sharedMaterial.SetMatrix("_Ground2World", rec.GetComponent<Renderer>().localToWorldMatrix);}void Update(){}
}
這個腳本主要是為了設置需要接受陰影的地面的坐標系,如果沒有這個腳本,物體產生的陰影的坐標系是原始坐標系(0,0,0)
// shader,放在需要顯示陰影的對象上 Shader "Study/8_PlanarShadow" {Properties{_Instensity("Shininess", Range(2, 4)) = 2.1}SubShader{pass {Tags{ "LightMode" = "ForwardBase" }Material{ Diffuse(1,1,1,1) }Lighting On}Pass{Tags{ "LightMode" = "ForwardBase" }Blend DstColor SrcColorOffset -1,-1CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"float4x4 _World2Ground;float4x4 _Ground2World;float _Instensity;struct v2f {float4 pos:SV_POSITION;float atten : TEXCOORD0;};v2f vert(float4 vertex:POSITION){float3 litDir;litDir = WorldSpaceLightDir(vertex);//世界空間主光照相對于當前物體的方向float4 litDir_4 = float4(litDir,0);litDir_4 = mul(_World2Ground, litDir_4);//光源方向轉換到接受陰影的平面空間litDir_4 = normalize(litDir_4);// 歸一float4 vt;vt = mul(_Object2World,vertex); //將當前物體轉換到世界空間vt = mul(_World2Ground,vt); // 將物體在世界空間的矩陣轉換到地面空間vt.xz = vt.xz - (vt.y / litDir_4.y)*litDir_4.xz;// 用三角形相似計算沿光源方向投射后的XZvt.y = 0;// 使陰影保持在接受平面上vt = mul(_Ground2World, vt); // 陰影頂點矩陣返回到世界空間vt = mul(_World2Object, vt); // 返回到物體的坐標v2f o;o.pos = mul(UNITY_MATRIX_MVP, vt);//輸出到裁剪空間o.atten = distance(vertex, vt) / _Instensity;// 根據物體頂點到陰影的距離計算衰減return o;}float4 frag(v2f i) :COLOR{return smoothstep(0,1,i.atten / 2);}ENDCG}} }
這個shader只是講解下平面陰影的產生原理,核心的原理就是通過三角形相似,根據光照方向將頂點投影到地面上。
                        
                        
                        // shader,放在需要顯示陰影的對象上 Shader "Study/8_PlanarShadow" {Properties{_Instensity("Shininess", Range(2, 4)) = 2.1}SubShader{pass {Tags{ "LightMode" = "ForwardBase" }Material{ Diffuse(1,1,1,1) }Lighting On}Pass{Tags{ "LightMode" = "ForwardBase" }Blend DstColor SrcColorOffset -1,-1CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"float4x4 _World2Ground;float4x4 _Ground2World;float _Instensity;struct v2f {float4 pos:SV_POSITION;float atten : TEXCOORD0;};v2f vert(float4 vertex:POSITION){float3 litDir;litDir = WorldSpaceLightDir(vertex);//世界空間主光照相對于當前物體的方向float4 litDir_4 = float4(litDir,0);litDir_4 = mul(_World2Ground, litDir_4);//光源方向轉換到接受陰影的平面空間litDir_4 = normalize(litDir_4);// 歸一float4 vt;vt = mul(_Object2World,vertex); //將當前物體轉換到世界空間vt = mul(_World2Ground,vt); // 將物體在世界空間的矩陣轉換到地面空間vt.xz = vt.xz - (vt.y / litDir_4.y)*litDir_4.xz;// 用三角形相似計算沿光源方向投射后的XZvt.y = 0;// 使陰影保持在接受平面上vt = mul(_Ground2World, vt); // 陰影頂點矩陣返回到世界空間vt = mul(_World2Object, vt); // 返回到物體的坐標v2f o;o.pos = mul(UNITY_MATRIX_MVP, vt);//輸出到裁剪空間o.atten = distance(vertex, vt) / _Instensity;// 根據物體頂點到陰影的距離計算衰減return o;}float4 frag(v2f i) :COLOR{return smoothstep(0,1,i.atten / 2);}ENDCG}} }
這個shader只是講解下平面陰影的產生原理,核心的原理就是通過三角形相似,根據光照方向將頂點投影到地面上。
其中第一個Pass是渲染物體本體,第二個Pass渲染陰影。渲染陰影的原理是將坐標系轉換成接受陰影的地面坐標系后,根據三角形相似,計算出物體頂點在x方向和z方向的投影坐標。
 
總結
 
                            
                        - 上一篇: 代办大额度信用卡靠谱吗?警惕三个套路远离
- 下一篇: 信用卡到期未还款怎么办?不想逾期就得这么
