9.球体阴影
上一篇講的陰影shader是通過兩個pass來渲染出的,第一個pass渲染要投影的物體本體,第二個pass渲染物體的陰影,也就是說陰影的渲染是在物體的shader中而不是地面的shader。下面要講的球體陰影的shader是放在要接受陰影的地面上。
?原理如下圖:
1.根據點的入射光矢量和點到球體的矢量計算【點積】求出【角度】。
2.通過【角度】的sin值,求出【對邊】并與【球體半徑】進行比較。
3.所求【對邊的長度】大于【半徑】,說明該點被光照,反之該點是陰影點。
// shader,放在需要接受陰影的對象上 Shader "Study/9_SphereShadow" {Properties{_spPos("Sphere pos", vector) = (0,0,0,1)_spR("radius", float) = 1_Intensity("Intensity", range(0,1)) = 0.5}SubShader{Pass{Tags{ "LightMode" = "ForwardBase" }CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"float4 _spPos; // 球體位置float _spR; // 球體半徑float _Intensity; // 陰影濃度float4 _LightColor0; // 顏色struct v2f {float4 pos:SV_POSITION;float3 litDir:TEXCOORD0;// 世界坐標中燈光方向矢量float3 spDir:TEXCOORD1; // 在世界坐標中投影球體方向矢量float4 vc:TEXCOORD2; // 逐頂點計算的光照};v2f vert(appdata_base v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);// 獲取頂點視圖位置o.litDir = WorldSpaceLightDir(v.vertex);// 獲取世界坐標中燈光對頂點的方向矢量o.spDir = (_spPos - mul(_Object2World, v.vertex)).xyz;//世界坐標中該頂點到投影球體的矢量// 頂點的光照計算。該頂點在對象坐標中的光照方向矢量float3 ldir = ObjSpaceLightDir(v.vertex);ldir = normalize(ldir);o.vc = _LightColor0 * max(0, dot(ldir, v.normal));//根據頂點的入射光線和法線角度求該頂點光照return o;}float4 frag(v2f i) :COLOR{float3 litDir = normalize(i.litDir);//獲取點的入射線單位向量float3 spDir = i.spDir; // 獲取該點到投影球體的矢量float spDistance = length(spDir); //該點到球體的距離spDir = normalize(spDir); //該點到投影球體的單位向量float cosV = dot(spDir, litDir);// 該點到球體 與 該點到入射線的夾角float sinV = sin(acos(max(0, cosV)));// 拿到余弦值大于0的角度,求正弦float D = sinV * spDistance; // 解三角形,求對邊float shadow = step(_spR, D); // 如果對邊小于半徑返回0,該點為陰影點float c = lerp(1 - _Intensity, 1, shadow);// shadow由0到1return i.vc * c; // 為0的時候是陰影點}ENDCG}} } 這個腳本也放在需要接受陰影的對象上: using UnityEngine; using System.Collections;public class ReceiveShadow : MonoBehaviour {public GameObject sphere;void Start () {Vector3 pos = sphere.transform.localPosition;GetComponent<Renderer>().sharedMaterial.SetVector("_spPos", new Vector4(pos.x, pos.y, pos.z, 1f));GetComponent<Renderer>().sharedMaterial.SetFloat("_spR", sphere.transform.localScale.x / 2);}}
總結
- 上一篇: 信用卡到期未还款怎么办?不想逾期就得这么
- 下一篇: 10.热空气扭曲效果